Problema com filtro

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

Moderador: Moderadores

cl@udio
Usuário Nível 2
Usuário Nível 2
Mensagens: 88
Registrado em: 25 Jan 2007 16:47

Problema com filtro

Mensagem por cl@udio »

Pessoal estou com um problema com este exemplo:
Quando um filtro nao satisfaz nenhuma condicao.
Deveria ficar em branco.
Em clipper este codigo funciona mas xHarbour nao funciona.
Vcs poderiam me ajudar a encontrar o erro.
[]s
claudio

Código: Selecionar todos

#include "inkey.ch"
Function Main()
PUBLIC criterio:="c_cpd=='99999'"
PUBLIC chv_rela:=""
PUBLIC chv_1   :=""
PUBLIC chv_2   :=""
Use clt shared new
Index on ltoc(clt->c_cpd == "99999")+c_cpd to ind
Set Index to ind
CriaTbr()
Return

Function CriaTbr()
LOCAL oTbc
LOCAL i
LOCAL nTecla
LOCAL xRetorno

oTbr:=TBrowseDb(01,01,MaxRow(),MaxCol())
oTbr:HeadSep :="ÍÍÍ"
oTbr:ColSep :=" ³ "
oTbr:FootSep :="ÍÍÍ"

For i = 1 to fcount()
   oTbr:ADDCOLUMN(TBCOLUMNNEW("", FIELDWBLOCK(FIELDNAME(i),SELE() )))
Next

oTbr:gotopblock    := {||INI_ARQ()}
oTbr:gobottomblock := {||FIM_ARQ()}
oTbr:skipblock     := {|n|MOV_PTR(n)}

oTbr:gotop()
Do While ( .t. )
   Do While ( !oTbr:stabilize () )
   EndDo
   nTecla := Inkey (0)
   Do Case
   Case ( nTecla == K_ESC )
      Exit
   Case ( nTecla == K_DOWN )
      oTbr:down ()
   Case ( nTecla == K_UP )
      oTbr:up ()
   Case ( nTecla == K_LEFT )
      oTbr:left ()
   Case ( nTecla == K_RIGHT )
      oTbr:right ()
   Case ( nTecla == K_PGUP )
      oTbr:pageup ()
   Case ( nTecla == K_PGDN )
      oTbr:pagedown ()
   Case ( nTecla == K_CTRL_PGUP )
      oTbr:gotop ()
   Case ( nTecla == K_CTRL_PGDN )
      oTbr:gobottom ()
   EndCase
   oTbr:refreshall()
EndDo
Return

Function MOV_PTR(a_pular)
LOCAL ja_pulado := 0
LOCAL chv_
If a_pular = 0
   DbSkip( 0 )
Else
   chv_=&("{||"+OrdKey(OrdSetfocus())+"=["+If(Empty(criterio),"","T")+chv_1+"]}")
   Do While !EOF() .and. !BOF() .and.;
      a_pular != ja_pulado .and. Eval(chv_)
      If a_pular > 0
         DbSkip()
         ja_pulado++
      Else
         DbSkip( -1 )
         ja_pulado--
      EndIf
   EndDo
   If !EVAL(chv_) .OR. EOF() .OR. BOF()
      If a_pular > 0
         FIM_ARQ()
         ja_pulado--
      Else
         INI_ARQ()
         ja_pulado++
      EndIf
   EndIf
EndIf
Return ja_pulado

Function INI_ARQ()
LOCAL ch_:=If( Empty( criterio ) , "" , "T" )+;
If( Empty( chv_rela ) , "" , chv_1 )

If Empty( ch_ ) .and. Empty( chv_rela )
   DbGoTop()
Else
   DbSeek( ch_ )
EndIf
Return

Function FIM_ARQ()
LOCAL cr_:=If( Empty( criterio ) , "" , "T" )

If Empty( chv_2 ) .AND. Empty( chv_rela )
   DbGoBottom()
Else
   Set Softseek ON
   DbSeek( cr_+chv_2 )
   Set Softseek OFF
   DbSkip( -1 )
   If &(OrdKey(OrdSetfocus()))!=cr_+chv_1
      DbGoBottom()
      DbSkip()
   EndIf
EndIf
Return

Function LtoC( condicao )
If condicao
   Return "T"
Else
   Return "F"
EndIf
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Cláudio, não sei se procede, mas tive o mesmo problema e resolvi fazendo o seguinte: incluí um GO TOP logo depois do SET INDE TO XPTO, isso antes de inicializar o TBrowse()... Ou seja, "oTbr:gotop()" não resolvia a parada.
cl@udio
Usuário Nível 2
Usuário Nível 2
Mensagens: 88
Registrado em: 25 Jan 2007 16:47

Mensagem por cl@udio »

Eolo
Fiz o que vc disse mas nao mudou nada.

Ai fiz um teste.
Depois que entra no tbrowse se digito um page up, fica blz mas depois digito o page down volta tudos no tbrowse repetindo o ultimo registro.
Cara to me matando e nao consigo achar o problema.
Mas muito obrigado pela ajuda.
[]s
claudio
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Ao invés do seu "Do While(!oTbr:stabilize())", eu uso o seguinte:

Código: Selecionar todos

tempo=10 // varia...
do whil .t.
  (&nome):refreshall()
  (&nome):forceStable()
  lk:=inkey(tempo)
  if lk=0
  elseif lk=27
    exit
  else
    * teclas...
    *
  endif
enddo
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Mensagem por alaminojunior »

Tente facilitar um pouco as coisas para o TBrowse.
Confesso que tenho uma certa dificuldade em analisar estes códigos todos, mas... olha só:

Código: Selecionar todos

oTbr:gotopblock:= { || DbSeek( inicio condição satisfeita ) }
oTbr:gobottomblock:= { || DbSeek( condição final ) }
Nem precisa dizer que o banco precisa estar indexado pelo campo em questão.

Ou de repente, já que vc está usando xHarbour, esquece tudo isso e usa OrdScope(), menos complicado.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
cl@udio
Usuário Nível 2
Usuário Nível 2
Mensagens: 88
Registrado em: 25 Jan 2007 16:47

Mensagem por cl@udio »

Eolo, fiz deste modo e tambem nao deu certo.
Vou tentar explicar melhor a situação.
Estou convertendo este sistema para um cliente para xharbour.
Esta rotina que me esta dando problema e do Gaspro 4.0o.
E a rotina de gerador de relatorios.
Esta tudo funcionando normalmente dentro das consultas.
Mas quando o filtro não satisfaz nenhuma condição e o tbrowse teria que ficar vazio, ele traz o ultimo registro duplicado na tela inteira, como se fosse um registro em branco.
So que quando compilo em clipper + blinker 5.1 + sixcdx fica tudo correto.
O problema acontece em xHarbour apenas, mas só quando o filtro nao satisfaz condição nenhuma.
Acima eu criei este codigo tentando resumir para gerar o erro.
Fiz só para vcs talvez compilarem e ver se consegue me dizer aonde esta o erro.
Pois eu gostaria de saber se um bug do xHarbour ou do clipper ou ainda meu.
Muito obrigado mesmo pela ajuda.
[]s
claudio
Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Mensagem por Luciano Bonfim »

amigo alguns códigos de estado e retono säo diferentes do clipper e no xharbour, constatei isso no DBEDIT e com certeza no TBROWSE tb tem estas pequenas diferenças. verifica oq o tbrowse está retornando (usa o debug) e suas variáveis de estado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Concordo com o colega alaminojunior.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cl@udio
Usuário Nível 2
Usuário Nível 2
Mensagens: 88
Registrado em: 25 Jan 2007 16:47

Mensagem por cl@udio »

Caro alaminojunior
Eu concordo com vc, mas não queria mudar até descobrir onde esta o erro.
E este tbrowse é generico e nem sempre existe filtro.
Muito obrigado assim mesmo.
Vou continuar pesquisando, se alguem descobrir alguma coisa me avisa por favor.
[]s
claudio
Responder