Página 1 de 1

TBROWSE FILTRADA DE NOVO

Enviado: 28 Mar 2005 18:04
por MARCELOG
Minha rotina tbrowse deve verificar o banco de dados indexado pelo campo da chave e filtrá-lo, ou seja, apresentar somente os registros que tenham a chave igual a xchave.

Nos exemplos que vi, o método obj:GoTopBlock deve conter um bloco de código que indique o primeiro registro.

No meu caso, se não existir, deve apresentar um Tbrowse vazio.

Acontece que, se eu omito a pesquisa antes de obj:GoTopBlock, conforme abaixo, a rotina me apresenta o primeiro registro para as situações sem referências ou com apenas uma referência.

Alguém pode me ajudar. :-o


Function CriaTbr(Li,Ci,Lf,Cf,aCamp,aTitu,aPict,aLarg,xChave)

Local oTbc
Local i
Local nTecla
Local xRetorno

oTbr:=TBrowseDb(Li,Ci,Lf,Cf)
oTbr:HeadSep :="ÍÍÍ"
oTbr:ColSep :=" ³ "
oTbr:FootSep :="ÍÍÍ"

DbGoTop()

For i:=1 To Len(aCamp)
oTbc:=TbColumnNew(aTitu,FieldWBlock(aCamp,Select()))
oTbc:Picture:=aPict
oTbc:Width:=aLarg
oTbr:AddColumn(oTbc)
Next

If xChave <> Nil

DbSeek(xChave,.F.) //<------- Se eu não colocar essa linha, o Tbrowse filtrado não funciona. Por quê?

oTbr:GoTopBlock :={||DbSeek(xChave,.F.)}
oTbr:GoBottomBlock:={||Iif(DbSeek(UltiCha(xChave),.F.),DbSkip(-1),DbSkip(0))}
oTbr:SKipBlock :={|nParaMover|MoveReg(nParaMover,xChave)}
EndIf

Return(oTbr)
//---------------------------------

Function IniFaixa(xChave)

DbSeek(xChave)

Return NIL
//---------------------------------

Function UltiCha(xChave)

Local UltReg

UltReg:=Stuff(xChave,Len(xChave),1,Chr(Asc(Right(xChave,1))+1))

Return (UltReg)
//---------------------------------

Function MoveReg(nParaMover,xChave)

Local nMovidos:=0

If nParaMover == 0 .Or. LastRec() == 0
DbSkip(0)
ElseIf nParaMover > 0 .And. Recno() <> LastRec()+1
Do While nMovidos <= nParaMover .And. !Eof() .And. &(IndexKey(0)) == xChave
DbSkip(1)
nMovidos++
EndDo
DbSkip(-1)
nMovidos--
ElseIf nParaMover < 0 .And. Recno() <> LastRec()+1
Do While nMovidos >= nParaMover .And. !Bof() .And. &(IndexKey(0)) == xChave
DbSkip(-1)
nMovidos--
EndDo
If !Bof()
DbSkip(1)
EndIf
nMovidos++
EndIf

Return (nMovidos)
//---------------------------------

Enviado: 29 Mar 2005 00:29
por Dudu_XBase