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:

Código: Selecionar todos

Marcacao            Campo
*                           A
*                           B
*                           C
                            D
*                           E
etc
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.