Pesquisa sequencial no tbrowse
Moderador: Moderadores
Pesquisa sequencial no tbrowse
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

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
Re: Pesquisa sequencial no tbrowse
Ola,
Sugiro utilizar o comando LOCATE em conjunto com CONTINUE, mas exemplo não tenho, por enquanto, mas pretendo desenvolver um em breve.
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.
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

- Mensagens: 546
- Registrado em: 15 Mar 2005 16:54
- Localização: Divinópolis/MG
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
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
