Tbrowse com ADO: posicionamento do cursor

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Tbrowse com ADO: posicionamento do cursor

Mensagem 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?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tbrowse com ADO: posicionamento do cursor

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Tbrowse com ADO: posicionamento do cursor

Mensagem 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.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Tbrowse com ADO: posicionamento do cursor

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Tbrowse com ADO: posicionamento do cursor

Mensagem 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.
Inacio de Carvalho Neto
Responder