localização e posicionamento do browse usando ADO/recordset

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:

localização e posicionamento do browse usando ADO/recordset

Mensagem por cjp »

Pessoal, por favor, peço ajuda nesta questão: estou fazendo um browse de uma tabela MySQL usando ADO, com recordset. Ao iniciar o browse, gostaria de posicionar o ponteiro no primeiro registro em que o campo marcacao esteja em branco.

Fiz assiM:

Código: Selecionar todos

	        do while !oRs:eof()
		       if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
			      oRs:movenext()
			   else
			      exit
			   endif
		    enddo
Deste jeito, ele está posicionando no registro seguinte ao primeiro em que o campo marcacao esteja em branco, não no registro em si.

Até tentei usar oRs:moveprevious() antes do exit, mas não resolveu.

Também testei usar keyb chr(5), igualmente sem sucesso.

E o pior é que o browse fica estranho, pois, na abertura, dá a impressão que está no primeiro registro, mas, ao teclar seta pra cima ou pra baixo, dá pra ver que o cursor está no registro seguinte ao que eu pretendia.

Alguém poderia me ajudar com isto, por favor?
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

localização e posicionamento do browse usando ADO/recordset

Mensagem por JoséQuintas »

Não entendi, perguntou sobre browse mas mostrou um do while pulando registro.

Código: Selecionar todos

oRs:MoveFirst()
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:

localização e posicionamento do browse usando ADO/recordset

Mensagem por cjp »

Este do while está na função de usuário do browse. Se precisar, eu posto o código inteiro.
O movefirst(), se não estou enganado, vai mover o cursor para o primeiro registro do browse, né? Não é isso que preciso. Preciso mover para o primeiro registro que tenha o campo marcacao sem *, ou seja, que esteja desmarcado.
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

localização e posicionamento do browse usando ADO/recordset

Mensagem por JoséQuintas »

Se está desposicionando com a função de usuário, isso explica o browse ficar maluco.
Na tela está numa posição e internaente está em outra posição.
Com isso, mexer com setas vai atualizar com outro registro diferente do que está na tela.
Talvez precise atualizar o browse a partir dessa função de usuário, pro browse saber que não está mais no mesmo registro.
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/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

localização e posicionamento do browse usando ADO/recordset

Mensagem por Itamar M. Lins Jr. »

Olá!
Use seek

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

localização e posicionamento do browse usando ADO/recordset

Mensagem por alxsts »

Olá!

O que você deseja é filtrar registros em um record set ADO.
Para isto, utilize recursos disponíveis na própria ferramenta. Configure a propriedade filter do record set.
https://www.w3schools.com/asp/prop_rs_filter.asp
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

localização e posicionamento do browse usando ADO/recordset

Mensagem por cjp »

Se está desposicionando com a função de usuário, isso explica o browse ficar maluco.
Na tela está numa posição e internaente está em outra posição.
Com isso, mexer com setas vai atualizar com outro registro diferente do que está na tela.
Talvez precise atualizar o browse a partir dessa função de usuário, pro browse saber que não está mais no mesmo registro.
É provável que seja isto mesmo.
Sabe me dizer como faço para atualizar o browse?

Olá!
Use seek
Será que o seek funciona em broswse com ado?


O que você deseja é filtrar registros em um record set ADO.
Para isto, utilize recursos disponíveis na própria ferramenta. Configure a propriedade filter do record set.
https://www.w3schools.com/asp/prop_rs_filter.asp
A questão não é filtrar registros não.
Eu só quero posicionar o cursor num registro específico, mantendo no browse todos os registros da tabela.
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

localização e posicionamento do browse usando ADO/recordset

Mensagem por JoséQuintas »

cjp escreveu:É provável que seja isto mesmo.
Sabe me dizer como faço para atualizar o browse?
Imagino que seja console e não hwgui.

Código: Selecionar todos

oBrowse:RefreshAll()
O ADO não tem seek, mas tem FIND, mas no seu caso acho que não vai usar somente pro primeiro
Mas aí vai ter que procurar se tem opção de procurar o próximo, não apenas o primeiro.

aqui:
https://www.w3schools.com/asp/met_rs_find.asp

Código: Selecionar todos

objRecordset.Find(criteria,skiprows,direction,start)
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/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

localização e posicionamento do browse usando ADO/recordset

Mensagem por Itamar M. Lins Jr. »

Olá!
O ADO não tem seek
https://learn.microsoft.com/pt-br/sql/a ... rver-ver16
Captura de imagem_20241114_201706.png
Eu não sei! Não uso, mas está ai a referência para uso do seek com ADO...
Captura de imagem_20241114_201942.png
Parâmetro de parada do ponteiro:
Captura de imagem_20241114_202225.png
Talvez só com MSSQL... Não se,i como tem ADO, dizendo que aplica-se ao ADO... vai saber.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

localização e posicionamento do browse usando ADO/recordset

Mensagem por JoséQuintas »

seek.png
O problema do SEEK é que talvez dependa de índice, e tem a questão de compatibilidade de array entre harbour e windows.

O find aceita em SQL, campo único, mas como só vai pesquisar a marcacao, vai dar.
seek2.png
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

localização e posicionamento do browse usando ADO/recordset

Mensagem por alxsts »

Olá!

Pesquise pela propriedade bookmark do recordset... permite marcar registros do recordset e navegar entre os registros marcados.
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

localização e posicionamento do browse usando ADO/recordset

Mensagem por cjp »

Testei o find, mas o browse fica maluco, da mesma forma que eu fiz no início.

Fiz assim:

Código: Selecionar todos

oRs:Find("marcacao<>'*'")
Tá errado?

Não entendi bem o seek.
Inacio de Carvalho Neto
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

localização e posicionamento do browse usando ADO/recordset

Mensagem por alxsts »

Olá!

O tópico já está se transformando em mais um linguição..

Penso que você deveria explicar melhor o que precisa, postando um exemplo do código usado.

Com ADO ou sem ADO, TBrowse navega pelos registros de forma sequencial. Então não resolve fazer SEEK ou FIND sem tratamento...

Mesmo sem ver o teu código, penso que a solução seja implementar este filtro na função skipper do TBrowse. Creio que você esteja usando a função ADOSkipper(), que escrevi há vários anos.

Não entendi até agora o que quer... tem um conjunto de registros. Quer eliminar registros onde um campo contenha - ou * mas diz que não quer filtrar os registros. Ok... todos os registros tem que aparecer no browser. Mas o que fazer com os registros marcados? Pintar de outra cor ou sei lá o que? Confuso...
[]´s
Alexandre Santos (AlxSts)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

localização e posicionamento do browse usando ADO/recordset

Mensagem por cjp »

Perdão se ainda não fui suficientemente claro.
Não conheço a função ADOSkipper() que vc mencionou. Como faço para ter acesso a ela?
Vou tentar ser bastante claro. O que pretendo é bastante simples: apenas posicionar o cursor no primeiro registro do browse que atenda à condição (campo marcacao sem marca). Note bem: não quero excluir registros do browse, nem filtrar o browse. Apenas posicionar o cursor.
A título de exemplo, imagine um browse assim:
id marcacao tarefa
1 * xxx
2 * yyy
3 * zzz
4 www
5 * aaa
6 bbb
...
Quero apenas que, ao abrir o browse, o cursor fique já posicionado sobre o id 4. Entende?

Vou postar o código inteiro:

Código: Selecionar todos

novaconsado("select * from tarsequencias where id>0",,,,,,,,55,"[ENTER] - marca *; [DEL]-apaga registro","fu_tarsequencias")

function fu_tarsequencias
         local nId :=oRs:Fields("id"):Value
		 local cTar, conf
		 
		 nVez++

		 if nVez=1
*            oRs:Find("marcacao<>'*'")
/*		 
	        do while !oRs:eof()
		       if oRs:Fields("marcacao"):Value="*" .or. oRs:Fields("marcacao"):Value="-"
			      oRs:movenext()
			   else
			      keyb chr(5)
			      exit
			   endif
		    enddo
*/
		 endif
		 
         if nkey ==13
            if oRs:Fields("marcacao"):Value="*"
			   exqado("update tarsequencias set marcacao=' ' where id="+alltrim(str(nId)),3)
		    else
			   exqado("update tarsequencias set marcacao='*' where id="+alltrim(str(nId)),3)
		    endif
			return 1
	     elseif nkey ==7 //Del
            cTar=oRs:Fields("tarefa"):Value
		    conf="N"
			@ 20,5 say "Confirma exclusão deste registro?"get conf pict "@!"
			read
			if conf="S"
			   exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
			   if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
			      exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
			   endif
			   do while .t.
			      nId=pegadado("id","tarsequencias","id>"+alltrim(str(nId))+" and tarefa='"+cTar+"'")
				  if hb_isnumeric(nId)
			         exqado("delete from tarsequencias where id="+alltrim(str(nId)),3)
			         if pegadado("tarefa","tarsequencias","id="+alltrim(str(nId+1)))="Bíblia" .and. pegadado("marcacao","tarsequencias","id="+alltrim(str(nId+1)))#"*"
			            exqado("delete from tarsequencias where id="+alltrim(str(nId+1)),3)
			         endif
				  else
				     exit
			      endif
			   enddo
			endif
			return 1
		 endif
return 0


function novaconsado(sql,or,modo,coluna,prov,nTop1,nTop2,nBottom1,nBottom2,cRodape,func_usuario)
         #include "tbrowse.ch"
         LOCAL retorno, oColumn, nProvAqui, nLen, nLen2, nFieldlen, I // I está em fields(i) abaixo, não sei do que se trata
	     local nCursor :=setCursor(0)
		 Local Vez :=0
		 local cSair :="N"
         local rw :=row()
		 local cl :=col()
		 private conexao, nkey, oRs, oTBrowse

		 cls
		 if Vez=0
	        @ maxrow()-1,15 say "Abrindo consulta"
		 endif

		 if prov=NIL
		    prov=3
		 endif
		 
		 if nTop1=NIL
		    nTop1=2
		 endif
		 
		 if nTop2=NIL
		    nTop2=2
		 endif
		 
		 if nBottom1=NIL
		    nBottom1=maxrow()-5
		 endif
		 
		 if nBottom2=NIL
		    nBottom2=maxcol()-1
		 endif
		 
		 keysec(27,1500,-1,.t.)
		 
		 if Vez=0
		    @ maxrow()-1,15 say "Conectando        "
		 endif
		 
		 do while .t.
            bError := ErrorBlock( {|e| Break(e) } )
            begin sequence
                  oRs=ConexaoMySQL(prov)
                  oRs:open()
            recover using e
	                Vez++
			        if us="I" 
			           ?"Não abriu a conexão; tentando de novo"
					   inkey(1)
		            endif
			        if Vez>3
			           ?"Não abriu a conexão; tente novamente mais tarde"
					   inkey(1)
				       cSair="S"
			        else
					   loop
					endif
            endsequence
            ErrorBlock( bError )

	        if cSair="S"
	           return .f.
	        endif
	  
	        Vez=0
		 
		    if !AdoConecta(prov,7)
		       @ 12,15 say "Não conseguiu conectar; tente novamente mais tarde"
			   inkey(5)
			   return .f.
	        else
			   if Vez=0
			      @ maxrow()-1,15 say "Executando a consulta"
			   endif
		       if "FROM ATIV"$upper(sql) .and. prov#18
                  oRs := Conexao:Execute("SET MAX_JOIN_SIZE=1111111111111")
			   endif
               oRS := Conexao:Execute( sql )
		    endif
	  
            if oRS:Eof()
	           @ 12,15 say "Não há nenhum item      "
		       inkey(11)
		       inkey(11)
	           return .f.
	        endif

            cls
            oTBrowse := TBrowseDB():new( nTop1, nTop2, nBottom1, nBottom2 )
			
			if cRodape#NIL
			   @ maxrow()-2,1 say substr(cRodape,1,maxcol()-5)
			   @ maxrow()-1,1 say substr(cRodape,maxcol()-4)
			endif
			
            oTBrowse:goTopBlock    := { || oRs:moveFirst() }
            oTBrowse:goBottomBlock := { || oRs:moveLast() }
            oTBrowse:skipBlock     := { | n | ADORecordSetSkipper( oRs, n ) }
            oTBrowse:HeadSep       := Chr(196)
            oTBrowse:ColSep        := Chr(179)
            oTBrowse:FootSep       := ""
	  
            nLen := oRs:fields():count() - 1
			
			if procname(1)="LEITURA"
			   nLen2=nLen
			elseif "FROM TAREXTRAS"$upper(sql)
			   nLen2=nLen-2
			else
			   nLen2=nLen-1
			endif

            FOR i := 0 TO nLen2
			    if ("FROM TARDIVIDAS" $ upper(sql)) .and. (upper(oRs:fields(i):name)="MINIMO" .or. upper(oRs:fields(i):name)="OCULTAR")
			       nFieldlen=oRs:fields(i):definedSize +6
				elseif upper(oRs:fields(i):name)="KM"
				   nFieldlen=10
				elseif upper(oRs:fields(i):name)="DATA"
				   nFieldlen=10
				elseif upper(oRs:fields(i):name)="IPCAD"
				   nFieldlen=15
				elseif upper(oRs:fields(i):name)="VLDESP"
				   nFieldlen=16
				elseif upper(oRs:fields(i):name)="LOCAL"
				   nFieldlen=55
				else
			       nFieldlen=oRs:fields(i):definedSize
				endif
                oColumn       := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
                ocolumn:Width := Max( nFieldLen, Len( oRs:fields(i):name ) )    // maior valor entre nFieldlen e nome do campo
				
                oTBrowse:addColumn( oColumn )
		    NEXT			
			
	        if vez=0 .and. (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
	        endif
	  
            DO WHILE .T.
               vez++
			   
	           nCol=oTbrowse:colPos()
			   
               oTBrowse:forceStable()
               oTBrowse:refreshCurrent()
	  
	           setCursor(nCursor)
	  
	           set cursor on
	  
               nKey := Inkey(0)
			   
			   retorno=&(func_usuario)(sql)
			   
			   if retorno=1
			      exit
			   endif
	  
               IF oTBrowse:applyKey( nKey ) == TBR_EXIT
	              cSair="S"
                  EXIT
               ENDIF
            ENDDO
   
            if cSair="S"
               exit
            endif
         enddo

         oRs:Close()
         Conexao:Close()
         if cSair="S" .and. procname(1)#"CONSEXPR" .and. procname(2)#"CONSEXPR"
            return .f.
         endif
return .t.





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

localização e posicionamento do browse usando ADO/recordset

Mensagem por JoséQuintas »

Vixe, muita calma nessa hora.
A velha história de 2 tabelas em uma.
Tem delete na mesma tabela que tá fazendo browse.

E mais de um servidor, o que é esquisito.

Vai precisar também refresh na consulta ADO, mas preciso entender melhor esse fonte.

Nota: imagino que esse fonte é apenas um agrupamento de outros fontes pra poder postar, e no aplicativo não se trata de um único fonte.
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/
Responder