Página 1 de 1
Tbrowse com ADO: posicionamento do cursor
Enviado: 29 Ago 2020 22:46
por cjp
Pessoal, estou precisando posicionar o cursor no início de um Tbrowse, mas não estou conseguindo.
Estou fazendo assim:
Código: Selecionar todos
if procname(1)="ADOTARPRINC" .or. procname(2)="ADOTARPRINC"
rw=0
do while .t.
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
rw++
else
exit
endif
enddo
oRs:movefirst()
endif
vez=0
DO WHILE .T.
vez++
oTBrowse:forceStable()
oTBrowse:refreshCurrent()
if vez=1 .and. (procname(1)="ADOTARPRINC" .or. procname(2)="ADOTARPRINC")
do while rw>0
keyb chr(24)
inkey(.1)
rw=rw-1
enddo
endif
Não sei porquê, mas o cursor não está se movendo.
Alguém poderia me ajudar?
Tbrowse com ADO: posicionamento do cursor
Enviado: 30 Ago 2020 00:10
por JoséQuintas
Código: Selecionar todos
rw=0
do while .t.
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
rw++
else
exit
endif
enddo
oRs:movefirst()
Saindo do do while, faz o oRs:MoveFirst()
Desse jeito sempre vai posicionar no primeiro.
Esse do while eventualmente vai travar, ou dar erro, porque não tem nenhum teste de eof() ou algo do tipo. Mesmo em DBF, apesar de isso ser relativamente válido, é muito perigoso, porque também pode travar.
Em resultado vazio, provavelmente vai dar erro também
Talvez:
Código: Selecionar todos
rw := 0
IF ! oRs:Eof()
DO WHILE ! oRs:Eof() .AND. hb_ASCan( { "*", "-" }, oRs:Fields( "marcacao" ):Value ) != 0
oRs:MoveNext()
rw++
ENDDO
oRs:MoveFirst()
ENDIF
Lógico... o MoveFirst() move ao início, mas .... quando diz que não move o cursor... deixa na dúvida se isso está dentro ou fora do tbrowse.
Tbrowse com ADO: posicionamento do cursor
Enviado: 30 Ago 2020 14:36
por cjp
O movenext() somente não me serve, pois ele posiciona o cursor corretamente, mas ele também muda a própria exibição da tabela. Eu preciso mudar somente o cursor, mantendo a exibição da tabela.
Vou exemplificar pra tentar explicar o que estou dizendo. Imagina uma tabela assim:
Eu preciso posicionar o cursor no Campo D, mas exibindo a tabela inteira. Com o movenext(), ele posiciona o cursor no campo D, mas só exibe do Campo D em diante. Se eu quiser ver o campo A, tenho que voltar com as setas.
Pensei em fazer com keyb chr(24) pra só mover o cursor, mas não está funcionando. Não sei por quê.
Não me preocupei com eof() ou resultado vazio porque isso não ocorrerá na prática. Então, não vai travar o do while.
Tbrowse com ADO: posicionamento do cursor
Enviado: 30 Ago 2020 18:22
por JoséQuintas
Talvez a mesma coisa, com keyboard ou hb_KeyPut()
Código: Selecionar todos
nSkip := 0
IF ! oRs:Eof()
DO WHILE ! oRs:Eof() .AND. hb_ASCan( { "*", "-" }, oRs:Fields( "marcacao" ):Value ) != 0
oRs:MoveNext()
nSkip++
ENDDO
oRs:MoveFirst()
KEYBOARD Replicate( Chr( K_DOWN ), nSkip )
ENDIF
Tbrowse com ADO: posicionamento do cursor
Enviado: 30 Ago 2020 22:53
por cjp
Deste jeito não funcionou. O nSkip está retornando sempre 91, que é o último da tabela.
Mas consegui resolver com um misto do que eu tinha feito e do que vc sugeriu. Funcionou assim:
Código: Selecionar todos
if procname(1)="ADOTARPRINC" .or. procname(2)="ADOTARPRINC"
rw=0
do while .t.
if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
oRs:movenext()
rw++
else
exit
endif
enddo
oRs:movefirst()
endif
vez=0
DO WHILE .T.
vez++
oTBrowse:forceStable()
oTBrowse:refreshCurrent()
if vez=1 .and. (procname(1)="ADOTARPRINC" .or. procname(2)="ADOTARPRINC")
KEYBOARD Replicate( Chr( K_DOWN ), rw )
endif
Obrigado pela ajuda.