TBROWSE FILTRADA DE NOVO
Enviado: 28 Mar 2005 18:04
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.
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)
//---------------------------------
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.
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)
//---------------------------------