Autor Tema: Generar cadena SQL para búsquedas específicas o generales ( 1 o mas campos)  (Leído 1120 veces)

0 Usuarios y 1 Visitante están viendo este tema.

softmania

  • Bytes
  • *
  • Mensajes: 35
  • Reputación: +4/-0
    • Ver Perfil
Hola a todos los Colegas ...
 
aquí quiero mostrarles una función que les permitirá construir la consulta SQL necesaria para realizar una búsqueda de datos.

Hay funciones especificas según el motor de base de datos utilizado, que resolverían esto de manera mas eficiente, algunos sujetos a pre-configuraciones.

Citar
Esta función nos permite independizar nuestro desarrollo de una base de datos específica

El tema de un buscador es no complicar al cliente con muchas opciones, simplemente que encuentre los datos de manera eficiente ...

Esta función permite establecer en forma descentralizada algunas opciones en la búsqueda, ideal para considerarla dentro de un módulo como pública ...

Primero se ingresan los datos a buscar, estos son de l estilo "gaseosa cola 2l", es decir que el espacio implicará el final y el comienzo de una cadena para la búsqueda

Luego se ingresan en los campos que deseamos buscar, separando cada nombre de campo con un caracter determinado, en este caso usé el "|"

asi que por ejemplo sería --- "codigo|descripcion|proveedor" --- > significa que se buscarán coincidencias en esos tres campos al mismo tiempo o por separado, ya explico mas adelante


Establecemos la tabla correspondiente "tb_articulos"

La próxima opción sería in índice, el cual al ingresar 0 (cero), permitirá buscar de manera simultánea en todos los campos ingresados

codigo   descripcion   proveedor

pero si colocamos por ejemplo 1, solo buscará coincidencias con el campo "codigo", si es 2 "descripcion" y así sucesivamente

Ahora bién esto nos permitiría construir opciones de búsquedas, por ejemplo:

0- Búsqueda general        (buscar en todos los campos)
--------------------------
1- Búscar por código
2- Búscar por descripción
3- Búscar por proveedor

Por último, como no podía faltar una compuerta lógica ... la cual puede ser muy discutible, ya que muchos optarán por implementar caracteres especiales para esto como "(+)" o bién palabras como "AND" y "OR", pero permitan expresar mi humilde opinión sobre esto, en mi experiencia como desarrollador, he notado que las personas solo utilizan el sistema de búsqueda "O", similar a lo que realizan con el buscador google, sin prefijos ni nada por el estilo, solo en casos muy especiales un usuario requiere una "Y" ... vendrán a la mente muchas opciones en donde podríamos implementar una lógica "Y", pero sinceramente, la necesidad de usar esta lógica dependerá mucho de la cantidad de datos contenidos en la base de datos, que puedan coincidir en dos o tres muestras de cadenas de búsqueda. A pesar de esto solo será relevante dependiendo de la cantidad de resultados que obtengamos en dicha búsqueda, ya que pueden ser pocos y de fácil visualización, es decir, si volvemos al ejemplo anterior:

"gaseosa cola 2l"

supongo que si ponemos "gaseosa" apareceran mas coincidencias que en "gaseosa cola 2l", y estas coincidencias disminuirán  de manera rigurosa si por ejemplo agregamos una marca o un código, ejemplos


"coca cola 2l"

Es más fácil para el usuario establecer una "forma" (quizás en el cargado de un artículo) para una búsqueda eficiente, que recordar la manera o que opciones debería seleccionar para buscar cada artículo, y obtener la menor cantidad de resultados posible, se comprende?

Pero bueno el tema es que existe la lógica "AND" y "OR" de manera "generalizada" dentro de la función y si se desea se puede agregar como opción, mediante false para "OR" y true para "AND"

Dependiendo del motor utilizado (ej. caso mysql, si se codifica la base de datos correctamente), seguramente no habrá inconvenientes con LIKE, en cuanto a acentos. Tampoco hará distinción entre mayúsculas o minúsculas. Pero siempre hay que recordar las funciones SQL UPPER(), REPLACE(), LOWER() si se requiere por algún motivo acomodar la función a nuestras necesidades.

Bueno entonces la función sería:



Código: (VB) [Seleccionar]
Dim sDatos as string = "cadena1 cadena2 cadena3"

fBuscador(sDatos, "codigo|descripcion|proveedor", "tb_articulos", 0, false)

Código: (VB) [Seleccionar]
Imports System.Text
Código: (VB) [Seleccionar]
    Function fBuscador(ByVal sDato As String, ByVal sCampos As String, ByVal sTabla As String, ByVal iIndiceCampo As Integer, ByVal bLogica As Boolean) As String
        'BY SOFTMANIA
        Dim sDatos As New StringBuilder
        Dim sSplitDatos() As String = sDato.Split(" ")
        Dim sSplitCampos() As String = sCampos.Split("|")
        Dim bVerifica As Boolean
        Dim iCont As Integer
        Dim iCantCampos As Integer

        sDatos.Append("SELECT " & sTabla & ".* FROM " & sTabla & " WHERE ")

        iCantCampos = UBound(sSplitCampos)

        For Each sSplitCampo As String In sSplitCampos
            iCont = iCont + 1
            If iIndiceCampo = iCont Or iIndiceCampo = 0 Then

                bVerifica = False

                For Each sSplitDato As String In sSplitDatos

                    If bLogica = False Then
                        If bVerifica = False Then
                            sDatos.Append("(" & sTabla & "." & sSplitCampo & " LIKE '%" & sSplitDato & "%'")
                            bVerifica = True
                        Else
                            sDatos.Append(" OR " & sTabla & "." & sSplitCampo & " LIKE '%" & sSplitDato & "%'")
                        End If
                    Else
                        If bVerifica = False Then
                            sDatos.Append("(" & sTabla & "." & sSplitCampo & " LIKE '%" & sSplitDato & "%'")
                            bVerifica = True
                        Else
                            sDatos.Append(" AND " & sTabla & "." & sSplitCampo & " LIKE '%" & sSplitDato & "%'")
                        End If
                    End If
                Next
                If iIndiceCampo = 0 And iCantCampos > 0 And iCantCampos > iCont - 1 Then
                    sDatos.Append(") OR ")
                Else
                    sDatos.Append(")")
                End If
            End If
        Next
        sDatos.Append(";")
        Return sDatos.ToString
    End Function

Citar
Mucha explicación para una función tan simple y básica, pero la idea es abrir el debate  ;)



Salu2 COLEGAS
« última modificación: Noviembre 17, 2013, 08:14:06 pm por softmania »
Solo se que no se nada!!! ;) By Sócrates