Clipper On Line • Ver Tópico - OrdWildSeek

OrdWildSeek

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

OrdWildSeek

Mensagempor asimoes » 12 Set 2008 12:02

Senhores,

Alguém sabe me dizer se esta função está funcionando 100%.
Estou fazendo testes com ela e verifiquei um problema muito estranho.

Um dbF com a seguinte estrutura:

Campo Tipo Tamanho
Nome C 30

Fiz append para este DBF com 3 nomes:
1º REGISTRO ALEXANDRE
2º REGISTRO JOAO
3º REGISTRO MARIANA

Está Indexado pelo nome:

INDEX ON Nome TAG Ind01 TO TESTE
SET INDEX TO TESTE
SET ORDER TO TAG Ind01

Antes de chamar a função OrdWildSeek, faço um DBGOTOP()
DBGOTOP()
DO WHILE OrdWildSeek("*A*",.T.)
AADD(aNomes,TESTE->Nome)
ENDDO

ACHOICE(02,00,10,40,aNomes,.T.,,)

A função OrdWildSeek só acha: JOAO E MARIANA, exibidos no ACHOICE.

Falta alguma coisa, ou estou fazendo algo de errado.
:)Pos
[]´s
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor Toledo » 12 Set 2008 13:16

aSimões, da maneira como está o seu código, com um DBGOTOP() no início e o segundo parâmetro da OrdWildSeek() com .T., sempre o primeiro registro do banco de dados será desprezado, pois a função vai fazer a busca a partir do registro atual, que neste caso é o nome ALEXANDRE.

Bom, acho que para resolver isto você teria que dar um DBSKIP(-1) depois do DBGOTOP().

Exemplo:
DBGOTOP()
DBSKIP(-1)
DO WHILE OrdWildSeek("*A*",.T.)
  AADD(aNomes,TESTE->Nome)
ENDDO


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor asimoes » 12 Set 2008 13:25

Olá Toledo,

Fiz da forma que você sugeriu e nada feito, o resultado é o mesmo, parece que a função faz um skip de cara.

Alexandre
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor Eolo » 12 Set 2008 13:33

Alexandre, dá uma olhada na resposta do tópico ORDSCOPE. Vou repetir aqui, pra facilitar:

Testei e funciona.

"Achei uma saída (enquanto não aparece uma solução melhor): se é só o primeiro registro (do índice) que não é considerado, basta fazer WildSeek top/bott e depois bott/top. Na primeira passada, ele não vai aparecer. Mas, na segunda, sim. E, pra evitar eventuais duplicidades, é só filtrar com o ASCAN:"

    aCust:={}
    GO TOP
    DO WHILE OrdWildSeek( "*BE*", .T. ) // top/bottom
       ? "aqui"
       AAdd( aCust, TESTE->Nome)
    ENDDO
    GO BOTTOM
    DO WHILE OrdWildSeek( "*BE*", .T. , .T.) // bottom/top
       IF ASCAN(ACUST, TESTE->NOME)=0
          ? "aqui"
          AAdd( aCust, TESTE->Nome)
       ENDIF
    ENDDO
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Re: OrdWildSeek

Mensagempor asimoes » 12 Set 2008 13:44

Olá Eolo,

Fiz como você sugeriu e funcionou, agora nos resta aguardar a correção da função.

Obrigado,

:)Pos
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor Toledo » 12 Set 2008 14:20

ASimões, a função OrdWildSeek é um seek melhorado, onde você pode usar caracteres coringas (? *) na chave de busca. Só que se você informa o segundo parâmetro como .T., ela sempre vai desprezar o registro atual, então da maneira como você fez o seu código, não vai dar certo, pois sempre o primeiro registro não vai fazer parte da busca. Agora se você não informar o segundo parâmetro ou informar .F., ai o registro atual será considerado na busca.

Então, para resolver o seu problema, faça o seguinte:

DBGOTOP()
lSai:=OrdWildSeek( "*A*")
DO WHILE lSai
  AADD(aNomes,TESTE->Nome)
  lSai:=OrdWildSeek("*A*",.T.)
ENDDO


Este exemplo eu já testei e deu certo.

A sintaxe desta função:

OrdWildSeek(cBusca, lInicio, lOrdem)

cBusca = expressão para busca, onde você pode usar caracteres coringas (? ou *).
lInicio = se .T. faz a busca a partir do registro atual, se .F. a busca será a partir do início do arquivo.
lOrdem = informe .T. para decrescente ou .F. para crescente.

Se lInicio e lOrdem não forem informados, o default será .F.


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor Eolo » 12 Set 2008 15:05

Toledo, a sua solução é de fato mais simples e parece que dá certo também, mas não me parece ser o que o criador dela imaginou ou, pelo menos, não é o que está demonstrado no Help do XHarbour. Segundo o Help, vc roda uma vez a função e pronto. Não precisa fazer como você fez: rodar uma vez pra posicionar e depois rodar novamente, dentro do loop:

      GO TOP
      aCust := {}
      DO WHILE OrdWildSeek( "*EL*", .T. ) // assumindo o 3o. parâmetro como .F.
         AAdd( aCust, FIELD->Lastname )
      ENDDO

      AEval( aCust, {|c| QOut(c) } )
      // Found records:
      //   Feldman
      //   Hellstrom
      //   Keller
      //   Reichel


Também, você disse "...o segundo parâmetro como .T., ela sempre vai desprezar o registro atual...", mas o Help parece dizer diferente: "This parameter defaults to .F. (false) causing OrdWildSeek() to begin the search WITH THE FIRST record included in the controlling index. When .T. (true) is passed, the function begins the search WITH the current record."

A propósito, eu tentei usar o argumento .F. (para começar pelo primeiro registro no topo do índice), mas também não funcionou. A primeira ocorrência, estando no TOP, é ignorada. Estranho.

Abraço.
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Re: OrdWildSeek

Mensagempor Toledo » 12 Set 2008 16:06

Eolo, ficou estranho no help dizer que o registro atual vai fazer parte da busca quando o segundo parâmetro for .T., pois deste modo não faz sentido existe tal parâmetro. A função deste segundo parâmetro é de continuar uma busca a partir do registro seguinte ao último (registro) localizado em uma busca anterior.

Imagine como ficaria o exemplo do ASimões se o help estivesse correto. Se o registro atual fizesse parte da busca, o loop do While ficaria sempre no mesmo registro, pois não existe dentro do While um SKIP para mover o ponteiro para o próximo registro.

Exemplo:
Registro 1 = ALEXANDRE
Registro 2 = JOÃO
Registro 3 = MARIANA

1ª busca: OrdWildSeek("*A*",.T.) = vai parar em ALEXANDRE
2ª busca: OrdWildSeek("*A*",.T.) = se o registro atual contar, vai parar novamente em ALEXANDRE, pois tem a letra A.
3ª busca: Idem

e assim infinitamente...


O segundo parâmetro é exatamente para isto, para dar continuidade a busca até atingir o final do arquivo. É um LOCATE super mais rápido.

Então o Help está errado.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor Eolo » 12 Set 2008 18:23

Pois é, então o Help que eu tenho está danado.

Onde eu arrumo um Help que funcione? Estou usando o Xh 1.0.0.

Abraço!
Avatar de usuário

Eolo
Colaborador

Colaborador
 
Mensagens: 1134
Data de registro: 08 Dez 2005 17:24
Cidade/Estado: São Paulo - SP
Curtiu: 0 vez
Mens.Curtidas: 41 vezes

Re: OrdWildSeek

Mensagempor Toledo » 12 Set 2008 18:31

Eolo, a versão mais recente do Help é esta mesmo, eu só acho que no caso da função acima o help falhou neste pequeno detalhe.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor alaminojunior » 12 Set 2008 18:32

O segundo parâmetro é exatamente para isto, para dar continuidade a busca até atingir o final do arquivo. É um LOCATE super mais rápido.

Então o Help está errado.


A função OrdWildSeek() pode ser chamada passando três parâmetros.
1º parâmetro, é a parte do que se quer encontrar;
2º parâmetro, de onde a pesquisa deve iniciar (.t. para registro corrente) ou (.f. para registro inicial do indice)
3º parâmetro, em qual direção você quer que o ponteiro ande (.t. em direção ao inicio) ou (.f. em direção ao fim)

Talvez na "primeira passada", seria interessante usar o segundo parametro estando em .f., para forçar a busca do inicio. E os demais estando em .t., fazendo a busca sempre do registro corrente.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar de usuário

alaminojunior
Colaborador

Colaborador
 
Mensagens: 1689
Data de registro: 16 Dez 2005 20:26
Cidade/Estado: Ubatuba - SP
Curtiu: 27 vezes
Mens.Curtidas: 11 vezes

Re: OrdWildSeek

Mensagempor alaminojunior » 12 Set 2008 20:14

Realmente colegas, segue aí o código por Eolo e eu, testado e aprovado:
No primeiro OrdWildSeek ele achou dois registros, e na segunda vez, três registros.

PROCEDURE Main
      LOCAL aCust := {}

      USE cdcli000
      INDEX ON clinom TO nomes
     
      go top
      DO WHILE OrdWildSeek( "*IO?", .T. )
         AAdd( aCust, FIELD->clinom )
      ENDDO

      AEval( aCust, {|c| QOut(c) } )
      wait "dinovo"
      GO TOP
      aCust := {}
      passada:= 1
      DO WHILE OrdWildSeek( "*IO?", iif(passada=1,.F.,.T.) )
         AAdd( aCust, FIELD->clinom )
         passada++
      ENDDO

      AEval( aCust, {|c| QOut(c) } )
      USE
RETURN


Independente de ser o 1º registro no índice ou não, haveria o problema.
Mas a conclusão em que eu cheguei foi a seguinte:
o segundo parâmetro determina de onde deve partir a pesquisa, se .f., registro inicial incluindo o registro atual, se .t., a partir do registro corrente, não incluindo o mesmo;
vamos imaginar a cena....
o ordwildseek foi acionado;
ele está num registro que não satisfaz a condição; o que ele faz ? retorna found() = .f. e posiciona o ponteiro em lastrec()+1;
sendo assim, quando ele chegar no registro que atende a condição e estando o segundo parâmetro em .t., ele entende que a pesquisa deve partir daquele registro em diante, e não incluindo o mesmo.
Ao passo que se estivesse em .f., ele incluiria o mesmo e retornaria found() = .t.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar de usuário

alaminojunior
Colaborador

Colaborador
 
Mensagens: 1689
Data de registro: 16 Dez 2005 20:26
Cidade/Estado: Ubatuba - SP
Curtiu: 27 vezes
Mens.Curtidas: 11 vezes

Re: OrdWildSeek

Mensagempor asimoes » 12 Set 2008 22:53

Alamino e Eolo,

Muito inteligente a solução, gostei. Não desprezando também a do Toledo.
Obrigado a todos.
:)Pos
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Re: OrdWildSeek

Mensagempor alaminojunior » 12 Set 2008 23:07

Só falta eu descobrir como saltar linhas entre os cupons nos ecf´s. :'( :'( :'(
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar de usuário

alaminojunior
Colaborador

Colaborador
 
Mensagens: 1689
Data de registro: 16 Dez 2005 20:26
Cidade/Estado: Ubatuba - SP
Curtiu: 27 vezes
Mens.Curtidas: 11 vezes

Re: OrdWildSeek

Mensagempor sygecom » 15 Set 2008 10:25

alaminojunior escreveu:Só falta eu descobrir como saltar linhas entre os cupons nos ecf´s

Não entendi o que tem haver com a duvida sobre ( OrdWildSeek ). Alaminio favor abrir um novo topico sobre sua duvida.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 7017
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 133 vezes

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Bing [Bot] e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro