Clipper On Line • Ver Tópico - Tbrowse com ADO: posicionamento do cursor

Tbrowse com ADO: posicionamento do cursor

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

Moderador: Moderadores

 

Tbrowse com ADO: posicionamento do cursor

Mensagempor cjp » 29 Ago 2020 22:46

Pessoal, estou precisando posicionar o cursor no início de um Tbrowse, mas não estou conseguindo.

Estou fazendo assim:

     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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Tbrowse com ADO: posicionamento do cursor

Mensagempor JoséQuintas » 30 Ago 2020 00:10

  
  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:
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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18160
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Tbrowse com ADO: posicionamento do cursor

Mensagempor cjp » 30 Ago 2020 14:36

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:

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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

Tbrowse com ADO: posicionamento do cursor

Mensagempor JoséQuintas » 30 Ago 2020 18:22

Talvez a mesma coisa, com keyboard ou hb_KeyPut()

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, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18160
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Tbrowse com ADO: posicionamento do cursor

Mensagempor cjp » 30 Ago 2020 22:53

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:

     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
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1531
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 13 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro