Página 1 de 2

busca por palavra

Enviado: 31 Out 2007 17:10
por evaldo
Ola pessoal, estou precisando de um busca por palavra ex.: qdo digitar joao aparecer todos joao.

antonio joao
joao carlos

obrigado

Enviado: 31 Out 2007 17:13
por Maligno
Se você utiliza a biblioteca SIX, tem a sua disposição a função sx_WildSeek(), que serve pra isso mesmo. Se não utiliza a SIX e quiser testar, pegue no meu site. Link: http://pub.buzinello.com/index.php?d=./ ... pper/libs/

Claro que, alternativamente, num DBF pequeno, você também poderia utilizar SET FILTER. Mas se o volume de dados a pesquisar for muito grande, é melhor esquecer; o desempenho cai drasticamente.

Enviado: 31 Out 2007 19:22
por Luciano Bonfim
você pode utilizar o velho e bom LOCATE....

Enviado: 31 Out 2007 19:23
por Luciano Bonfim
Eu particularmente quando tenho que fazer isso varro todo o arquivo e testo se o campo possui a palavra... ai vou jogando para um vetor e depois dou um tbrowse nesse vetor.... funciona que é uma beleza...

Enviado: 31 Out 2007 19:39
por Maligno
LOCATE e SET FILTER tem o mesmo problema: se o volume de dados for grande, é melhor fazer a busca na hora do almoço. Quando voltar, talvez ele tenha terminado.

Enviado: 31 Out 2007 23:42
por Luciano Bonfim
é claro.. isso é clássico!!!! rsrsrsrsrs

Enviado: 01 Nov 2007 08:36
por Pablo César
Eu também desaconselho o uso do LOCATE quando tem em vista que o arquivo pode ser grande de tamanho. Utilizando a indexação é o mais indicado, porém quando se trata de procurar o "joao" no meio do nome ou final, realmente a saída é usar o LOCATE. Não sei se o uso da biblioteca SIX tem algum opção de procura semelhante ao LOCATE. Mas acredito que a solução mais habitual é a indexação do campo que você procura. Aqui no fórum tem um exemplo desse tipo de busca (e em TBROWSE), dê uma olhada na seção Download - Funções com Fontes em:

https://pctoledo.org/download/cop ... t&deonde=2

ou

https://pctoledo.org/download/cop ... t&deonde=2

Eu acho que se tem essa necessidade do usuário ter que pesquisar dessa forma, com certeza eu faria uma indexação do campo NOME.

Enviado: 01 Nov 2007 08:45
por Maligno
porém quando se trata de procurar o "joao" no meio do nome ou final, realmente a saída é usar o LOCATE. Não sei se o uso da biblioteca SIX tem algum opção de procura semelhante ao LOCATE.
Tem. É a função sx_WildSeek() que comentei na minha primeira mensagem. Mas não é semelhante à LOCATE ou SET FILTER quanto à forma de trabalho. Você só precisa que o campo a pesquisar tenha uma chave de índice. Aliás, eu havia me esquecido de comentar isso. Se bem que é fácil deduzir. :)

Enviado: 01 Nov 2007 09:19
por Pablo César
Sim é fácil de deduzir, mas o que eu queria saber se existe alguma função so SIX ou até mesmo de outro RDD que possa fazer a procura por SUBSTRING, assim como o faz o LOCATE. será que tem ?

Enviado: 01 Nov 2007 09:24
por Maligno
Essa função sx_WildSeek() faz exatamente isso, utilizando o índice.

Enviado: 01 Nov 2007 09:35
por Pablo César
Ahh é ? Isso que queria saber. Só para confirmar mais uma vez Maligno:

Se eu tiver um caso em que o nome do cliente é:

"JOAO PAULO DA SILVA"

E preciso pesquisar esse campo, com sx_WildSeek() ela vai encontrar a string JOAO que procuro ?

Sei que talvez não seja o caso do colega Evaldo, mas gostaria de saber se funciona mesmo ao igual que o LOCATE mesmo e não tão somente se começar com a string JOAO.

Enviado: 01 Nov 2007 09:38
por Maligno
Se, por exemplo, você procurar por "PAULO" a função encontrará a primeira ocorrência. Não importa onde esteja a sub-string. E com um argumento especial, ela continuará a busca até encontrar outra ocorrência. Mesmo que o volume de dados seja gigantesco, a pesquisa é instantânea.

Enviado: 01 Nov 2007 09:41
por Luciano Bonfim
interessante essa funçäo, eu näo a conhecia.... funciona no xharbour?

Enviado: 01 Nov 2007 09:43
por Pablo César
Beleza ! Quê bom que é essa sx_WildSeek() então. Não sabia disso e que não compremetia a rapidez de execução por conta do tamanho. Obrigado pelo esclarecimento, Maligno.

Enviado: 01 Nov 2007 09:45
por Maligno
O Xharbour, ao que me parece, tem uma biblioteca compatível com a SIX. Salvo engano, não está completa e talvez não tenha uma função equivalente a essa. Mas lance a dúvida na seção de XHarbour. Certamente alguém responderá.