Página 1 de 1

Problema com filtro

Enviado: 16 Nov 2007 19:16
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

Enviado: 17 Nov 2007 10:17
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.

Enviado: 17 Nov 2007 12:27
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

Enviado: 17 Nov 2007 18:42
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

Enviado: 17 Nov 2007 22:24
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.

Enviado: 19 Nov 2007 12:05
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

Enviado: 19 Nov 2007 13:37
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

Enviado: 19 Nov 2007 13:57
por sygecom
Concordo com o colega alaminojunior.

Enviado: 19 Nov 2007 16:46
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