Busca.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Busca.

Mensagem 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
:))
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Busca.

Mensagem 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
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem 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 ?!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
C Leonam
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 22 Nov 2005 17:40
Localização: Maceió

Mensagem 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
Clp52e, Blinker 5.1
Hasse
Usuário Nível 4
Usuário Nível 4
Mensagens: 820
Registrado em: 19 Out 2004 10:30
Localização: Jaraguá do Sul - SC

Mensagem 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem 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...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

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

Topico relativo

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder