Página 1 de 1

Busca.

Enviado: 21 Dez 2005 10:19
por anacatacombs
Existe algum comando, ou função no clipper que faz uma busca "Contida"?
Ex.
Tenho os registros:
1 - Triangulo Redondo
2 - Quadrado Oval
3 - Roxo

Quando eu procurasse por REDONDO, ele retornasse o registro "Triangulo Redondo"
Pelo que entendi o Set Softseek não funcionaria nesse caso, ele retornaria "Roxo".

Agradeço desde já
[]'s
Ana
:))

Re: Busca.

Enviado: 21 Dez 2005 10:57
por Maligno
anacatacombs escreveu:Existe algum comando, ou função no clipper que faz uma busca "Contida"?
Você tem a opção do comando nativo LOCATE, mas este pode se mostrar extremamente lento, dependendo do tamanho da base de dados. A vantagem é que pode ser utilizado em buscas por qualquer campo do arquivo.

Como opção adicional, se você usa a LIB SIX, existe a função sx_WildSeek(), que traz o resultado de forma instantânea, da mesma forma que o comando SEEK. A desvantagem é que só poderá ser feita a busca do conteúdo da chave de índice, o que não é de fato um grande problema.

[]'s
Maligno
http://www.buzinello.com/prg

Enviado: 21 Dez 2005 20:59
por Stanis Luksys
Ola,

"triangulo redondo????" hahaahah... essa é boa!!

Neste caso vc precisaria criar uma função para verificar a existencia da substring no campo chave (nao indexado no caso), para isso voce pode usar a função rat(), conforme exemplo:

Código: Selecionar todos

// neste caso sem indices, apesar de q se aberto um, melhor para ordenar
use Arquivo
@ 0, 0 say "Pesquisa:" get cVar
dbGoTop()
do while ! eof()
  if rat( allTrim(cVar) ,CAMPO) != 0
    exit
  endif  
  skip
enddo
@ 1, 0 say "Achou este:" + CAMPO


Se sua tabela for muuuito grande, da pra implemetar isso no momento da indexação, e então fazer o contrário, antes ler a variavel e depois criar o indice...



Falou ?!

Enviado: 22 Dez 2005 08:41
por C Leonam
Oi,

Dê uma olhadela na rotina "Pesquisa letra a letra" da seção Downloads

https://pctoledo.org/forum/dload. ... ile_id=128

Ela deverá dar uma idéia de como vc utilizar a LIB SubNTX para achar o que
vc deseja.

Fiz algumas adaptações nela, e usei para um cliente fazer pesquisas em um DBF de 30000 registros
e a velocidade ficou legal (mesmo em rede).

:xau

Enviado: 22 Dez 2005 11:25
por Hasse
Bom dia amigos.

Esta procura pode ser feita com o comando LOCATE usando
LOCATE FOR cBusca $ CONTEUDO
Este recurso não é muito rápido.

Ou então como sugerido acima usando o SIX.
O SIX não funciona no xHarbour.

Se o campo não estiver indexado pode-se usar o comando
SET FILTER TO Sx_WildMatch("&c_filtro",CONTEUDO) que filtra
os dados, e desta forma encontrado o REDONDO ???????.
Este recurso funciona, mas é lento.

Também tenho funcionando um módulo de filtro com o comando
DBSETFILTER({||&bBlock},"&bBlock"), onde o bBlock é
configurado em tempo de execução.
Também não é rápido, e funciona bem para arquivos pequenos.
Este recurso funciona no xHarbour também.

Hasse.

Enviado: 22 Dez 2005 14:24
por Stanis Luksys
Verdade,

O comando locate vai fazer exatamente o que eu fiz na função acima, vai parar quando encontrar a substring dentro do acmpo, mas ainda com uma vantagem, você pode usar o comando CONTINUE para continuar a pesquisa e achar o próximo que satisfaça a condição...

Enviado: 05 Mar 2006 02:25
por rochinha
Amiguinho

O tópico atual pode ser complementado com este e vice-versa:

Topico relativo

@braços :?)