Pesquisa sequencial no tbrowse

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Pesquisa sequencial no tbrowse

Mensagem por Grings »

Tenho uma rotina de pesquisa no tbrowse que quando teclo F5 aparece uma janela para digitação da sequência a ser pesquisada, funciona bem, porém preciso fazer com que continue pesquisando a sequência nos outros registros subsequentes. Alguém teria algum exemplo de como fazer isso ? Grato!
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Re: Pesquisa sequencial no tbrowse

Mensagem por Stanis Luksys »

Ola,

Sugiro utilizar o comando LOCATE em conjunto com CONTINUE, mas exemplo não tenho, por enquanto, mas pretendo desenvolver um em breve.
Editado pela última vez por Stanis Luksys em 08 Fev 2006 20:19, em um total de 1 vez.
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.
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Caro Crings,
se o campo está indexado e softseek está ligado, fazendo com que a busca pare no primeiro registro que atenda ao parâmetro ou no primeiro de chave maior, se encontrou, basta o usuário usar K_DOWN (seta para baixo) e verificar os outros registros.
Exemplo:
Procurando "MARIA" no campo indexado pelo nome e softseek ligado, o sistema encontra a primeira "MARIA" (que tal MARIA ANA) e para.
O próximo registro, se houverem outras "MARIA"s, serão MARIA BEATRIZ, MARIA CREUSA, etc, ou então, não existindo, um hipotético MARIO.

Porém, se você pretende procurar MARIA em qualquer ocorrência (meio e final do nome) a coisa é diferente, mas dá para resolver o problema de diversas formas.
Assim, vou indicar uma, considerando uma determinada hipótese.

1 - O usuário somente sairá da pesquisa se digitar alguma tecla específica (ESC por exemplo) ou o final dos registros constantes do tbrowse for encontrado;
2 - O campo a ser pesquisado, que corresponde aquele da coluna ativa no tbrowse, está indexado e a pesquisa pelo contéudo se dará nos próximos registros (ou a partir do primeiro como no exemplo, pode ficar lento).

É importante esclarecer a existência do comando LOCATE cujo uso não é recomendado, principalmente em ambiente de rede em virtude de lentidão.

De se acrescentar ainda que o tbrowse exibido pode estar filtrado, contendo registros específicos.

Mas usando somente o tbrowse, o negócio pode ficar assim:

O usuário está na coluna NOME do Tbrowse, que contém os registros do campo NOME do arquivo de clientes.
Ele aciona F5 para pesquisar um argumento e acha um registro que não lhe satisfaz (que pena)
Então, ele aciona F6 para fazer a pesquisa pelo contéudo.
A tela/local para digitação do argumento é aberto.

O tbrowse vai para primeiro registro válido do tbrowse, e verifica se existe o argumento, parando por 10s e assim vai até chegar no último registro válido ou a tecla ESC for pressionada
Se mesmo assim não achou, volta para o registro atual.


Salve o registro atual

...Entrada do argumento

...Validação da pesquisa

tbrowse:GoTop():ForceStable()
Do While LastKey() <> K_ESC .And. !tbrowse:HitBottom():
If AT(xArgumento,Eval(tbrowse:GetColumn(tbrowse:ColPos):Block) > 0
Inkey(10)
If lastKey == K_ENTER //Beleza! Era o que eu procurava
Exit
Endif
Endif
tbrowse:Down():ForceStable()
EndDo

If lastkey() == K_ESC
DbGoto(registro que foi salvo)
Endif

Isso pode (e deve) ser melhorado.

Qualquer dúvida ou ajuda, mande email.

MarceloG
Responder