> Manuales > Taller de ASP

Te proponemos un buscador básico para implementar en tu sitio web además de mostrarte funciones para el tratamiento de variables tipo cadena que pueden resultarte muy útiles para otras aplicaciones.

Cuando trabajamos con sitios basados en bases de datos y nuestros contenidos empiezan a crecer, puede resultar muy práctico para el navegante poder recurrir a un formulario en el que introducir palabras claves y operadores que le ayuden a matizar el elemento que está buscando. Este tipo de campos pueden verse en multitud de páginas y, aunque distintos en su funcionamiento en muchos casos, todos tienen algo en común: Se trata de programas que permiten procesar una variable de tipo cadena y transformarla en una orden de búsqueda para la base de datos.

En este reportaje os proponemos un par de funciones que, usadas conjuntamente, permiten la creación de una instrucción SQL. El script permite especificar cuáles serán los campos de búsqueda y dentro de qué tabla la realizaremos.

Este programa debería ir combinado con otro pequeño script de toma de datos por formulario como los vistos en nuestro manual de ASP a partir del cual obtendríamos la variable cadena introducida por el internauta. En este sentido, en DesarrolloWeb.com hemos publicado un manual que explica la creación de un buscador simple en ASP, empezando desde la definición de la base de datos, continuando por la inserción de los datos en la base y la búsqueda por palabras clave.

Estas dos funciones pueden ser utilizadas directamente para cada caso particular a condición de especificar los campos de búsqueda en el array campos, especificar la tabla y modificar la función generasql para que realice la selección de los campos que deseemos.

En este caso, con el objeto de facilitar la comprensión, hemos simplificado al máximo las funciones que el buscador puede realizar. En realidad, el buscador sólo tratará campos usando el operador like. Por otra parte, únicamente empleará como operadores "+" y "-".

Todo tipo de modificaciónes más o menos complejas pueden ser introducidas de manera a mejorar su versatilidad:

-Empleo de paréntesis para mayor eficacia de los operadores

-Eliminación de secuencias repetidas como "++" o "--"

-Eliminación de operadores al principio y final de la cadena

-Utilización de comodines...

Pasemos ahora a mostrar el listado para comentarlo más detalladamente a continuación:

<%
function Sacar(cadena,campos)
dim i
dim SacarAux
while InStr(cadena,"  ")
   Cadena=Replace(Cadena,"  "," ")
wend
if len(cadena)>0 then
   if InStr(cadena," ")>0 then
      Sacar= Sacar(left(cadena,InStr(cadena," ")-1),campos) & " OR " & Sacar(right(cadena,len(cadena)-InStr(cadena," ")),campos)
   elseif InStr(cadena,"+")>0 then
      Sacar=Sacar(left(cadena,InStr(cadena,"+")-1),campos) & " AND "& Sacar(right(cadena,len(cadena)-InStr(cadena,"+")),campos)
   elseif InStr(cadena,"-")>0 then
      Sacar=Sacar(left(cadena,InStr(cadena,"-")-1),campos) & " AND NOT " & Sacar(right(cadena,len(cadena)-InStr(cadena,"-")),campos)
   else
   'fijamos la sentencia
   SacarAux=""
   i=1
   SacarAux= "( " & campos(i) & " Like '%" & cadena & "%'"
   i=i+1
   while len(campos(i))>0
      SacarAux= SacarAux & " OR " & campos(i) & " Like '%" & cadena & "%'"
      i=i+1
   wend
   SacarAux=SacarAux & " )"
   Sacar=SacarAux
   end if
else
sacar=""
end if
end function

function GeneraSql(cadena,tabla,campos)
if len(cadena)>0 then
   generaSql="Select * from " & tabla & " Where " & Sacar(cadena,campos)
else
   Response.Write "No hay criterios"
end if
end function

dim campos(3) 'el tamano del array debe superar en uno al numero de campos
campos(1)="nombre_campo1"
campos(2)="nombre_campo2"

'para mostrar cual seria el resultado...
cadena="hola cariola+cocacola-colacao"
tabla="cualquiera"
resultado=GeneraSql(cadena,tabla,campos)

Response.Write resultado
%>


Aquí puedes descargar y ejecutar este script.

Como hemos dicho, el script consta principalmente de dos funciónes. La primera de ellas, sacar, se encarga de tratar la cadena para separar las palabras y, teniendo en cuenta los operadores, construir el fragmento final de la sentencia SQL. La búsqueda se realiza dentro de una serie de campos que son definidos al exterior de la función en forma de array.

En esta función se emplean diferentes funciones de tratamiento de variables de tipo cadena las cuales explicamos a continuación:

InStr(cadena,subcadena) Devuelve el número de las posiciones en las que una determinada subcadena aparece en la cadena principal
Replace(cadena,subcadena1,subcadena2) Sustituye un fragmento (subcadena1) de una cadena por un nuevo fragmento (subcadena2)
Len(cadena) Nos devuelve la longitud de la cadena
Left(cadena,numero_caracteres) Selecciona una determinada cantidad de carácteres de nuestra cadena comenzando por la izquierda
Right(cadena,numero_caracteres) Selecciona una determinada cantidad de carácteres de nuestra cadena comenzando por la derecha


Es interesante observar la técnica de recursividad que se utiliza para desglosar la cadena principal en palabras independientes. Esta técnica se basa en que función sacar se llama a si misma para cada una de las subcadenas de la cadena principal. Aparte de esa pequeña astucia el resto de la función es de lectura fácil.

La segunda función, generasql, se encarga de añadir al fragmento final creado por nuestra función sacar un fragmento inicial en el que especificamos la tabla y el tipo de selección que queremos realizar. En este caso se han selecciónado como resultado todos los campos de la tabla pero, evidentemente, esto no tiene por qué ser así.

La última parte del script consiste en la especificación de los campos dentro de los cuales deseamos llevar a cabo nuestra búsqueda. A notar que el array ha de tener una longitud mayor al número de campos para el correcto funcionamiento del programa.

Referencia: Hemos publicado un artículo en DesarrolloWeb.com donde explicamos como integrar el presente script en un buscador en ASP. El artículo en concreto es Buscador simple en ASP mejorado, y el buscador que mejora está comentado en el manual Buscador simple en ASP.

Esperamos que este buscador os sirva de base para realizar el propio vuestro con todo tipo de personalizaciones que consideréis oportunas.

Rubén Alvarez

Rubén es doctor en química y programador aficionado con experiencia en PHP.

Manual