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.
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 proveedorpero 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:Dim sDatos as string = "cadena1 cadena2 cadena3"
fBuscador(sDatos, "codigo|descripcion|proveedor", "tb_articulos", 0, false)
Imports System.Text
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
Mucha explicación para una función tan simple y básica, pero la idea es abrir el debate 
Salu2 COLEGAS