• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Crie seu próprio buscador

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Propomos um buscador básico para implementar em seu website, além de lhe mostrar funções para o tratamento de variáveis tipo cadeia que podem ser muito úteis para outras aplicações .

Por Rubén Alvarez




Quando trabalhamos com sites baseados em bancos de dados e nossos conteúdos começam a crescer, pode ser muito prático para o navegante poder recorrer a um formulário no qual possa introduzir palavras-chaves e operadores que lhe ajudem a matizar o elemento que estiver buscando. Este tipo de campo pode ser visto em uma infinidade de páginas e, embora sejam distintos em seu funcionamento em muitos casos, todos têm algo em comum: tratam-se de programas que permitem processar uma variável do tipo cadeia e transforma-la em uma ordem de busca para o banco de dados.

Neste artigo vamos propor duas funções que, usadas conjuntamente, permitem a criação de uma instrução SQL. O script permite especificar quais serão os campos de busca e dentro de que tabela a realizaremos.

Este programa deverá ir combinado com outro pequeno script de colheita de dados por formulário como os vistos em nosso manual de ASP a partir do qual obteríamos a variável cadeia introduzida pelo internauta.

Estas duas funções podem ser utilizadas diretamente para cada caso particular a condição de especificar os campos de busca no array campos, especificar a tabela e modificar a função gerasql para que realize a seleção dos campos que desejarmos.

Neste caso, com o objetivo de facilitar a compreensão simplificamos ao máximo as funções que o buscador pode realizar. Na verdade, o buscador só tratará campos usando o operador like. Por outro lado, empregará unicamente como operadores "+" e "-".

Todo tipo de modificações mais ou menos complexas, podem ser introduzidas de forma a melhorar sua versatilidade:

-Emprego de parênteses para maior eficácia dos operadores

-Eliminação de seqüências repetidas como "++" ou "--"

-Eliminação de operadores no princípio e final da cadeia

-Utilização de curingas...
 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Passamos agora a mostrar a lista para poder comentá-lo mais detalhadamente a seguir:




<%
function Tirar(cadeia,campos)
dim i
dim TirarAux
while InStr(cadeia," ")
Cadeia=Replace(Cadeia," "," ")
wend
if len(cadeia)>0 then
if InStr(cadeia," ")>0 then
Tirar= Tirar(left(cadeia,InStr(cadeia," ")-1),campos) & " OR " & Tirar(right(cadeia,len(cadeia)-InStr(cadeia," ")),campos)
elseif InStr(cadeia,"+")>0 then
Tirar=Tirar(left(cadeia,InStr(cadeia,"+")-1),campos) & " AND "& Tirar(right(cadeia,len(cadeia)-InStr(cadeia,"+")),campos)
elseif InStr(cadeia,"-")>0 then
Tirar=Tirar(left(cadeia,InStr(cadeia,"-")-1),campos) & " AND NOT " & Tirar(right(cadeia,len(cadeia)-InStr(cadeia,"-")),campos)
else
'observamos a sentenca
TirarAux=""
i=1
TirarAux= "( " & campos(i) & " Like '%" & cadeia & "%'"
i=i+1
while len(campos(i))>0
TirarAux= TirarAux & " OR " & campos(i) & " Like '%" & cadeia & "%'"
i=i+1
wend
TirarAux=TirarAux & " )"
Tirar=TirarAux
end if
else
tirar=""
end if
end function

function GeraSql(cadeia,tabela,campos)
if len(cadeia)>0 then
geraSql="Select * from " & tabela & " Where " & Tirar(cadeia,campos)
else
Response.Write "Nao ha criterios"
end if
end function

dim campos(3) 'o tamanho do array deve superar em um ao numero de campos
campos(1)="nome_campo1"
campos(2)="nome_campo2"

'para mostrar qual seria o resultado...
cadeia="ola carioca+cocacola-nescau"
tabla="qualquer"
resultado=GeraSql(cadeia,tabela,campos)

Response.Write resultado
%>


 

helldanger1

GForum VIP
Entrou
Ago 1, 2007
Mensagens
29,631
Gostos Recebidos
1
Como dissemos, o script consta principalmente de duas funções. A primeira delas, tirar, se encarrega de tratar a cadeia para separar as palavras e, tendo em conta os operadores, construir o fragmento final da sentença SQL. A busca se realiza dentro de uma série de campos que são definidos ao exterior da função em forma de array.

Nesta função se empregam diferentes funções de tratamento de variáveis de tipo cadeia, as quais explicamos a seguir:
InStr(cadeia,subcadeia) Devolve o número das posições nas quais uma determinada sub-cadeia aparece na cadeia principal
Replace(cadeia,subcadeia1,subcadeia2) Substitui um fragmento (subcadeia1) de uma cadeia por um novo fragmento (subcadeia2)
Len(cadeia) Devolve-nos a longitude da cadeia
Left(cadeia,numero_caracteres) Seleciona uma determinada quantidade de caracteres de nossa cadeia começando pela esquerda
Right(cadeia,numero_caracteres) Seleciona uma determinada quantidade de caracteres de nossa cadeia começando pela direita



É interessante observar a técnica de recursividade que se utiliza para decompor a cadeia principal em palavras independentes. Esta técnica se baseia em que função tirar se chama a si mesma para cada uma das sub-cadeias da cadeia principal. A parte dessa pequena astúcia o resto da função é de leitura fácil.

A segunda função, gerasql, se encarrega de acrescentar ao fragmento final tabela e o tipo de seleção que queremos realizar. Neste caso foram selecionados como resultado todos os campos da tabela, mas evidentemente, isto não tem porquê ser assim.

A última parte do script consiste na especificação dos campos dentro dos quais desejamos realizar nossa busca. A observar que o array há de ter uma longitude maior ao número de campos para o correto funcionamento do programa.
 
Topo