Página 2 de 8

Browse com ADO

Enviado: 21 Dez 2019 11:44
por JoséQuintas
não uso isso, vai precisar dar uma olhada nas variáveis do tbrowse, em algum help do Clipper.
Ou... no fonte do browse do Harbour, ou em algum fonte de tbrowse do fórum.

Browse com ADO

Enviado: 13 Mar 2020 22:41
por JoséQuintas
Faltou colocar: com WITH OBJECT simplifica um pouco digitar também:

Código: Selecionar todos

 oTemporario := oConexao:Execute( "SELECT CODIGO, NOME, ENDERECO FROM CLIENTES ORDER BY NOME" )
 oTBrowse := { ;
   { "CODIGO", { || Pad( oTemporario:Fields( "CODIGO" ):Value, 10 ) } }, ;
   { "NOME",  { || Pad( oTemporario:Fields( "NOME" ):Value, 30 ) } }, ;
   { "ENDERECO", { || Pad( oTemporario:Fields( "ENDERECO" ):Value, 30 ) } } }
 BrowseADO( oTemporario, oTBrowse )
 oTemporario:Close()
Usando WITH OBJECT não precisa colocar oTemporario:Isto, oTemporario:Aquilo, basta :Isto, :Aquilo

Código: Selecionar todos

 oTemporario := oConexao:Execute( "SELECT CODIGO, NOME, ENDERECO FROM CLIENTES ORDER BY NOME" )
WITH OBJECT oTemporario
 oTBrowse := { ;
   { "CODIGO", { || Pad( :Fields( "CODIGO" ):Value, 10 ) } }, ;
   { "NOME",  { || Pad( :Fields( "NOME" ):Value, 30 ) } }, ;
   { "ENDERECO", { || Pad( :Fields( "ENDERECO" ):Value, 30 ) } } }
 BrowseADO( oTemporario, oTBrowse )
:Close()
ENDWITH

Browse com ADO

Enviado: 14 Mar 2020 13:54
por Fernando queiroz

Código: Selecionar todos

		cQuery:= "SELECT LOGGERAL_NUMNOT, LOGGERAL_CODPRO, LOGGERAL_DATMOV, LOGGERAL_TIPMOV, LOGGERAL_CODVEN, LOGGERAL_CLIFOR, LOGGERAL_QUANT, LOGGERAL_VALUNI, LOGGERAL_OPERADOR from loggeral"
		oTemporario := oCn:EXECUTE(cQuery)	
		

		INIT DIALOG oDlg TITLE "Log Geral - Consulta"  ;
			ICON MEMVAR->SGC_ICON  ;
			AT 0, 0 SIZE 1167,600 CLIPPER  NOEXIT  

		ThisBRW := oDlg		
		
		@ 4,70 BROWSE oBrowse1 ARRAY OF oDlg SIZE 1160,460 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
				ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS 		

			oBrowse1:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
			oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)			
			oBrowse1:aArray := oTemporario
			oBrowse1:AddColumn( HColumn():New( "Nr.NOTA",{|v,o|o:aArray[o:nCurrent,1]},"C",16,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Codigo",{|v,o|o:aArray[o:nCurrent,2]},"C",10,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Movimento",{|v,o|o:aArray[o:nCurrent,3]},"D",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Tipo",{|v,o|o:aArray[o:nCurrent,4]},"N",1,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Vendedor",{|v,o|o:aArray[o:nCurrent,5]},"N",4,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Cli/For",{|v,o|o:aArray[o:nCurrent,6]},"C",10,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Quantidade",{|v,o|o:aArray[o:nCurrent,7]},"N",14,2,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Valor Unit.",{|v,o|o:aArray[o:nCurrent,8]},"N",14,2,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Operador",{|v,o|o:aArray[o:nCurrent,9]},"C",20,0,.F., ) )

		@ 8,-1 TOOLBAR oToolbar1  SIZE 1160,40 ;
			oToolbar1:AddButton("EXIT16BMP", , 4, 16, "Sair" ,{|| DBCLOSEALL(), oDlg:Close() },'Sair da rotina','', "oToolbutton14")
			oToolbar1:CreateTool()

		ACTIVATE DIALOG oDlg CENTER    

		oCn:Close()

RETURN NIL

STATIC FUNCTION MySqlConnection( cServer, cDatabase, cUser, cPassword, nPort )

   LOCAL cnConnection

   hb_Default( @nPort, 3306 )

   cnConnection:= win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := iif( win_OsIs10(), "Provider=MSDASQL;", "" )
   cnConnection:ConnectionString += "Driver={MariaDB ODBC 3.1 Driver};"
   cnConnection:ConnectionString += ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Stmt=;" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=utf8_general_ci;" + ;
      "AUTO_RECONNECT=1;" + ;
      "COMPRESSED_PROTO=0;" + ;
      "PAD_SPACE=1"
   cnConnection:CursorLocation    := 3
   cnConnection:CommandTimeOut    := 600 // seconds
   cnConnection:ConnectionTimeOut := 600 // seconds

   RETURN cnConnection

STATIC FUNCTION win_OsIs10(); RETURN .T.
Fiz o código acima mas não estou tendo resultados, acontece o erro

Error WINOLE/1016 Argument error (DOS Error -2147352562)
Called from ->WIN_OLEAUTO:__OPARRAYINDEX(0)
Called from CONSULTALOGGERALMARIADB.PRG->LOGGERALMARIADB(40) essa linha (oBrowse1:AddColumn( HColumn():New( "Nr.NOTA",{|v,o|o:aArray[o:nCurrent,1]},"C",16,0,.F., ) ))
Called from SGC.PRG->(b)MAIN(367)
Called from source\winapi\htool.prg->HTOOLBAR:NOTIFY(414)
Called from source\winapi\hcwindow.prg->ONNOTIFY(263)
Called from source\winapi\hcwindow.prg->(b)(_INITSTATICS00005)(0)
Called from source\winapi\hcwindow.prg->HWINDOW:ONEVENT(191)
Called from source\winapi\hdialog.prg->HDIALOG:ONEVENT(219)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from source\winapi\hdialog.prg->HDIALOG:ACTIVATE(156)
Called from SGC.PRG->MAIN(930)

HWGUI 2.22 Build 4
Date:14/03/2020
Time:11:52:33

alguém que possa dar uma ajuda , pois não sei o que retorna da query, to perdido

Browse com ADO

Enviado: 14 Mar 2020 14:43
por JoséQuintas
O SELECT retorna o recorset do ADO, no formato do ADO.

Código: Selecionar todos

oRs := cn:Execute( "SELECT CODIGO, NOME.... " )
DO WHILE ! oRs:Eof()
   ? oRs:Fields( "CODIGO" ):Value // ou oRs:Fields( 0 ):Value
   ? oRs:Fields( "NOME" ):Value  // ou oRs:Fields( 1 ):Value
  oRs:MoveNext()
ENDDO
oRs:Close()
Acho que tá confundindo com hbMySql() que retorna como array.

Browse com ADO

Enviado: 17 Mar 2020 12:51
por Fernando queiroz
consegui fazer a coisa funcionar
MARIADB + ADO + HWGUI

Código: Selecionar todos

/*
TITULO     : SISTEMA DE GEST¦O DE COMERCIO
DATA       : 14/03/2020
PROGRAMA   : CONSULTALOGGERAL.PRG
COMENTARIO : CONSULTA LOG GERAL COM MARIADB
*/
#pragma -w0
#pragma -es0 

#include "hwgui.ch"
******************************************
FUNCTION LOGGERALMARIADB(  )
******************************************

LOCAL oDlg;
	, oLabel1, oLabel2, oLabel3;
	, obusca, oBrowse1 ;
	, oToolbar1;
	, oToolbutton1, oToolbutton2, oToolbutton3, oToolbutton4;
	, oDatepicker1 , oDatepicker2 ;
	, oColuna, bColorBlock ;
	, vBusca := "";
	, oQuery, oRow;
	, aArray, oElemento;
	, aResult:= {}

	
PRIVATE   cProgressKey:="" ,dDatepicker1:=(m->dat_hoje - 30), dDatepicker2:=m->dat_hoje, lFiltro:=.T., nCODPRO:=0;
		, oLabel5 :="",  oLabel7 :="", oLabel10 :="", oLabel11 :="", oLabel6 :="", oLabel9 :="", oLabel12 :="", oLabel18 :=""

	
	oServer := MySqlConnection( "192.168.15.200", "", "sgcroot", "20r13uqse" )
	oServer:Open()
	oServer:Execute( "USE AMADEU")
	oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT,";
									   + "LOGGERAL_CODPRO,";
									   + "LOGGERAL_DATMOV,";
									   + "LOGGERAL_TIPMOV,";
									   + "LOGGERAL_CODVEN,";
									   + "LOGGERAL_CLIFOR,";
									   + "LOGGERAL_QUANT,";
									   + "LOGGERAL_VALUNI,";
									   + "LOGGERAL_OPERADOR ";
								+ "from loggeral LIMIT 9" )

	DO WHILE ! oQuery:Eof()
		aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
						oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
						oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
						oQuery:Fields( "LOGGERAL_TIPMOV" ):Value,;
						oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
						oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
						oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
						oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
						oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

		oQuery:MoveNext()
	ENDDO
	oQuery:Close()

	
		INIT DIALOG oDlg TITLE "Log Geral - Consulta"  ;
			ICON MEMVAR->SGC_ICON  ;
			AT 0, 0 SIZE 1167,600 CLIPPER  NOEXIT  

		ThisBRW := oDlg	
		
		@ 4,70 BROWSE oBrowse1 ARRAY OF oDlg SIZE 1160,460 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
				ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS 	

			oBrowse1:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
			oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)			
			oBrowse1:aArray := aResult	

	
			oBrowse1:AddColumn( HColumn():New( "Nr.Nota",hwg_ColumnArBlock(),"C",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Codigo",hwg_ColumnArBlock(),"C",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Movimento",hwg_ColumnArBlock(),"C",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Tipo",hwg_ColumnArBlock(),"C",1,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Vendedor",hwg_ColumnArBlock(),"C",4,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Cli/For",hwg_ColumnArBlock(),"C",10,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Quantidade",hwg_ColumnArBlock(),"C",14,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Valor Unit.",hwg_ColumnArBlock(),"C",14,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Operador",hwg_ColumnArBlock(),"C",20,0,.F., ) )
			

		@ 8,-1 TOOLBAR oToolbar1  SIZE 1160,40 ;
			 
//			oToolbar1:AddButton("BRW_FIL", , 4, 16, "Aplica" ,{||FILTROLOGGERAL(  ),obrowse1:REFRESH()},'Aplica Filtro no Arquivo de Log Geral','', "oToolbutton1") 
//			oToolbar1:AddButton("BRW_DFIL", , 4, 16, "Remove" ,{||REMOVEFILTROLOGGERAL(  ),obrowse1:REFRESH()},'Remover Filtro do Arquivo de Log Geral','', "oToolbutton2")
			oToolbar1:AddButton("EXIT16BMP", , 4, 16, "Sair" ,{|| DBCLOSEALL(), oDlg:Close() },'Sair da rotina','', "oToolbutton14")
			oToolbar1:CreateTool()

		ACTIVATE DIALOG oDlg CENTER    

		oServer:Close()

RETURN NIL

FUNCTION MySqlConnection( cServer, cDatabase, cUser, cPassword, nPort )

   LOCAL cnConnection

   hb_Default( @nPort, 3306 )

   cnConnection:= win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := iif( win_OsIs10(), "Provider=MSDASQL;", "" )
   cnConnection:ConnectionString += "Driver={MariaDB ODBC 3.1 Driver};"
   cnConnection:ConnectionString += ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Stmt=;" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=utf8_general_ci;" + ;
      "AUTO_RECONNECT=1;" + ;
      "COMPRESSED_PROTO=0;" + ;
      "PAD_SPACE=1"
   cnConnection:CursorLocation    := 3
   cnConnection:CommandTimeOut    := 600 // seconds
   cnConnection:ConnectionTimeOut := 600 // seconds

   RETURN cnConnection

FUNCTION win_OsIs10(); RETURN .T.
A TELA FICOU ASSIM , FALTA AJUSTES MAS ja deu uma boa iluminada
tela.jpg

Browse com ADO

Enviado: 17 Mar 2020 13:48
por alxsts
Olá!

Parabéns!

Dicas:

1 - Sempre declare as variáveis antes de as utilizar.

2 - Procure nunca usar variáveis PRIVATE e PUBLIC. Use LOCAL ou STATIC

3 - Este bloco de código

Código: Selecionar todos

   DO WHILE ! oQuery:Eof()
      aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
                  oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
                  oQuery:Fields( "LOGGERAL_TIPMOV" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
                  oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
                  oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
                  oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
                  oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

      oQuery:MoveNext()
   ENDDO
Pode ser trocado por apenas uma linha, utilizando-se um recurso do ADO que coloca o conteúdo de um record set em um array:

Código: Selecionar todos

aResult := oQuery:getRows()
Ou na declaração do browse:

Código: Selecionar todos

oBrowse1:aArray := oQuery:getRows()   

Browse com ADO

Enviado: 17 Mar 2020 13:53
por Fernando queiroz
Fazendo as correções ficou assim

Código: Selecionar todos

		oBrowse1:AddColumn( HColumn():New( "Nr.Nota",hwg_ColumnArBlock(),"C",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Codigo",hwg_ColumnArBlock(),"C",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Movimento",hwg_ColumnArBlock(),"D",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Tipo", hwg_ColumnArBlock(),"N",12,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Vendedor",hwg_ColumnArBlock(),"N",10,0,.F.,1,2,'9999' ) )
			oBrowse1:AddColumn( HColumn():New( "Cli/For",hwg_ColumnArBlock(),"C",10,0,.F., ) )
			oBrowse1:AddColumn( HColumn():New( "Quantidade",hwg_ColumnArBlock(),"N",14,2,.F.,1,2,'99999999999.99' ) )
			oBrowse1:AddColumn( HColumn():New( "Valor Unit.", hwg_ColumnArBlock(),'N',14,2,.F.,1,2,'@E 99,999,999,999.99' ) )
			oBrowse1:AddColumn( HColumn():New( "Operador",hwg_ColumnArBlock(),"C",20,0,.F., ) )
resultado final , muito bom
tela.jpg

Browse com ADO

Enviado: 17 Mar 2020 13:59
por Fernando queiroz
alxsts escreveu:Olá!

Parabéns!

Dicas:

1 - Sempre declare as variáveis antes de as utilizar.

2 - Procure nunca usar variáveis PRIVATE e PUBLIC. Use LOCAL ou STATIC

3 - Este bloco de código

Código: Selecionar todos

   DO WHILE ! oQuery:Eof()
      aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
                  oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
                  oQuery:Fields( "LOGGERAL_TIPMOV" ):Value,;
                  oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
                  oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
                  oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
                  oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
                  oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

      oQuery:MoveNext()
   ENDDO
Pode ser trocado por apenas uma linha, utilizando-se um recurso do ADO que coloca o conteúdo de um record set em um array:

Código: Selecionar todos

aResult := oQuery:getRows()
Ou na declaração do browse:

Código: Selecionar todos

oBrowse1:aArray := oQuery:getRows()   
fiz o que você falou e trazia os dados de uma linha como uma coluna
pode ser a versão do harbour 3.2 que eu tenho que pode estar errada

Browse com ADO

Enviado: 17 Mar 2020 17:46
por JoséQuintas
Fernando queiroz escreveu:fiz o que você falou e trazia os dados de uma linha como uma colunapode ser a versão do harbour 3.2 que eu tenho que pode estar errada
Lembro de alguma alteração no Harbour sobre transferir array.
Inclusive, se não me engano, não tem no Harbour 3.4.

Lembro de ter lido mensagem.
Na época tinha a ver com gravar as colunas direto no Excel, e não dava certo.
Se não me engano era esse problema, mas só detectaram pra Excel.
Lógico, ao resolver, já resolveria pro ADO também.

Browse com ADO

Enviado: 17 Mar 2020 17:58
por JoséQuintas

Browse com ADO

Enviado: 17 Mar 2020 18:11
por JoséQuintas
Só comentário extra:

É tipo.... gravar o array diretamente no Excel, ou vice-versa.
Tem a ver com a hbwin, e o tratamento de OLE "CreateObject()"

No caso do Excel, é a diferença entre gravar uma coluna de cada vez, ou a planilha inteira de uma vez.
Então... o assunto é interessante, porque o ganho de velocidade pode ser extremo.

Por isso lembrei dele, porque um dia poderia me ser útil.

O problema da época era essa inversão do array multidimensional.

Browse com ADO

Enviado: 17 Mar 2020 21:14
por Fernando queiroz
QUINTAS fazendo como fiz na rotina o legal é que posso fazer algumas coisas no query e depois so mudar a coluna de lugar , facilita muito

ex:

Código: Selecionar todos

		oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT,";
										   + "LOGGERAL_CODPRO,";
										   + "LOGGERAL_DATMOV,";
										   + "LOGGERAL_CODVEN,";
										   + "LOGGERAL_CLIFOR,";
										   + "LOGGERAL_QUANT,";
										   + "LOGGERAL_VALUNI,";
										   + "LOGGERAL_OPERADOR, ";
										   + "CASE WHEN LOGGERAL_TIPMOV IS TRUE THEN 'ENTRADA' ELSE 'SAIDAS' END AS STATUS_GERAL ";
									+ "from loggeral WHERE LOGGERAL_CODPRO = " + STRZERO(nCODPRO,7,0);
									+ " AND  LOGGERAL_DATMOV BETWEEN '" ;
									+ STRZERO(YEAR(dDatepicker1),4,0) + "-" + STRZERO(MONTH(dDatepicker1),2,0) + "-" + STRZERO(DAY(dDatepicker1),2,0);
									+ "' AND '";
									+ STRZERO(YEAR(dDatepicker2),4,0) + "-" + STRZERO(MONTH(dDatepicker2),2,0) + "-" + STRZERO(DAY(dDatepicker2),2,0);
									+ "'" )

		DO WHILE ! oQuery:Eof()
			aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
							oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
							oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
							oQuery:Fields( "STATUS_GERAL" ):Value,;
							oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
							oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
							oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
							oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
							oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

			oQuery:MoveNext()
		ENDDO
		oQuery:Close()
onde o STATUS_GERAL nao existe no banco , eu criei ele baseado em uma condição do LOGGERAL_TIPMOV e já joguei no local certo como o TIPO
tela.jpg

Browse com ADO

Enviado: 18 Mar 2020 09:28
por gilbertosilverio
Ola Fernando,

Não é possível você postar toda a rotina de como você fez o filtro desta pesquisa em ADO/MARIADB, para eu poder estudar, pois por mais que eu tente não consigo entender como funciona.

Ja li muito e vi muito exemplos postados pelo Quintas e pelo Simões, mais não tem jeito, pela complexidade, não consigo fazer funcionar na HWGUI.

Com este teu exemplo por ser básico, consegui fazer algo, mais parei ai...

Se você também tiver um exemplo básico de como salvar os dados em uma alteração, inclusao, exclução, com ADO/MARIADB para eu estudar e ver como funciona ficaria muito agradecido, pois os exemplos que encontrei são muito complexos, e meu tico/teco se perdem... kkkk

Browse com ADO

Enviado: 18 Mar 2020 09:38
por Fernando queiroz

Código: Selecionar todos

/*
TITULO     : SISTEMA DE GEST¦O DE COMERCIO
DATA       : 14/03/2020
PROGRAMA   : CONSULTALOGGERAL.PRG
COMENTARIO : CONSULTA LOG GERAL COM MARIADB
*/
#pragma -w0
#pragma -es0 

#include "hwgui.ch"
******************************************
FUNCTION LOGGERALMARIADB(  )
******************************************

LOCAL oDlg;
	, oLabel1, oLabel2, oLabel3;
	, obusca, oBrowse1 ;
	, oToolbar1;
	, oToolbutton1, oToolbutton2, oToolbutton3, oToolbutton4;
	, oDatepicker1 , oDatepicker2 ;
	, oColuna, bColorBlock ;
	, vBusca := "";
	, oQuery, oRow;
	, aArray, oElemento;
	, aResult:= {}
	
PRIVATE   cProgressKey:="" ,dDatepicker1:=(m->dat_hoje - 30), dDatepicker2:=m->dat_hoje, lFiltro:=.T., nCODPRO:=0;
		, oLabel5 :="",  oLabel7 :="", oLabel10 :="", oLabel11 :="", oLabel6 :="", oLabel9 :="", oLabel12 :="", oLabel18 :="";
		

	IF ! ABRE_PRODUTOS( )
	   DBCLOSEALL()
	   RETURN
	END
	
	oServer := MySqlConnection( "192.168.15.200", "", "sgcroot", "20r13uqse" )
	oServer:Open()
	oServer:Execute( "USE AMADEU")
	oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT,";
									   + "LOGGERAL_CODPRO,";
									   + "LOGGERAL_DATMOV,";
									   + "LOGGERAL_CODVEN,";
									   + "LOGGERAL_CLIFOR,";
									   + "LOGGERAL_QUANT,";
									   + "LOGGERAL_VALUNI,";
									   + "LOGGERAL_OPERADOR, ";
									   + "CASE WHEN LOGGERAL_TIPMOV IS TRUE THEN 'ENTRADA' ELSE 'SAIDAS' END AS STATUS_TIPO ";
								+ "from loggeral WHERE LOGGERAL_DATMOV BETWEEN '";
								+ STRZERO(YEAR(dDatepicker1),4,0) + "-" + STRZERO(MONTH(dDatepicker1),2,0) + "-" + STRZERO(DAY(dDatepicker1),2,0);
								+ "' AND '";
								+ STRZERO(YEAR(dDatepicker2),4,0) + "-" + STRZERO(MONTH(dDatepicker2),2,0) + "-" + STRZERO(DAY(dDatepicker2),2,0);
								+ "'" )

	DO WHILE ! oQuery:Eof()
		aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
						oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
						oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
						oQuery:Fields( "STATUS_TIPO" ):Value,;
						oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
						oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
						oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
						oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
						oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

		oQuery:MoveNext()
	ENDDO
	oQuery:Close()

	
	INIT DIALOG oDlg TITLE "Log Geral - Consulta"  ;
		ICON MEMVAR->SGC_ICON  ;
		AT 0, 0 SIZE 1167,600 CLIPPER  NOEXIT  

	ThisBRW := oDlg	
	
	@ 4,70 BROWSE oBrowse1 ARRAY OF oDlg SIZE 1160,495 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
			ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS 	

		oBrowse1:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
		oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)			
		oBrowse1:aArray := aResult	

		oBrowse1:AddColumn( HColumn():New( "Nr.Nota",hwg_ColumnArBlock(),"C",12,0,.F., ) )
		oBrowse1:AddColumn( HColumn():New( "Codigo",hwg_ColumnArBlock(),"C",12,0,.F., ) )
		oBrowse1:AddColumn( HColumn():New( "Movimento",hwg_ColumnArBlock(),"D",12,0,.F., ) )
		oBrowse1:AddColumn( HColumn():New( "Tipo", hwg_ColumnArBlock(),"C",12,0,.F., ) )
		oBrowse1:AddColumn( HColumn():New( "Vendedor",hwg_ColumnArBlock(),"N",10,0,.F.,1,2,'9999' ) )
		oBrowse1:AddColumn( HColumn():New( "Cli/For",hwg_ColumnArBlock(),"C",10,0,.F., ) )
		oBrowse1:AddColumn( HColumn():New( "Quantidade",hwg_ColumnArBlock(),"N",14,3,.F.,1,2,'99999999999.999' ) )
		oBrowse1:AddColumn( HColumn():New( "Valor Unit.", hwg_ColumnArBlock(),'N',14,2,.F.,1,2,'@E 99,999,999,999.99' ) )
		oBrowse1:AddColumn( HColumn():New( "Operador",hwg_ColumnArBlock(),"C",20,0,.F., ) )
		

	@ 8,-1 TOOLBAR oToolbar1  SIZE 1160,40 ;
		 
		oToolbar1:AddButton("BRW_FIL", , 4, 16, "Filtra" ,{||oBrowse1:aArray := FILTROLOGGERAL( ), obrowse1:REFRESH()},'Filtra o Arquivo de Log Geral','', "oToolbutton1") 
		oToolbar1:AddButton("EXIT16BMP", , 4, 16, "Sair" ,{|| DBCLOSEALL(), oDlg:Close() },'Sair da rotina','', "oToolbutton14")
		oToolbar1:CreateTool()

    ADD STATUS PANEL TO oDlg HEIGHT 30  PARTS 200,120,300 
	
	@ 4,43 SAY oLabel1 CAPTION "Codigo"  SIZE 138,25 ;
		STYLE SS_CENTER +WS_DLGFRAME 
	@ 150,43 GET oEdit1 VAR nCODPRO SIZE 90,25 STYLE ES_RIGHT PICTURE '9999999' MAXLENGTH 7 		
		
	@ 245,43 OWNERBUTTON oOwnerbutton1  SIZE 24,24   ;
		TEXT ''  ;
		COORDINATES 0, 0, 0, 0  ;
		BITMAP 'FINDBMP' FROM RESOURCE TRANSPARENT;
		COORDINATES 0, 0, 0, 0 ;
		ON CLICK {|| ThisBRW:oEdit1:SETFOCUS(), CONSULTA_PRODUTOS( ), nCODPRO := VAL(PRODUTOS->CODPRO), ThisBRW:oEdit1:REFRESH() } 
		
	@ 283,47 SAY oLabel2 CAPTION "Periodo:"  SIZE 56,18  
	@ 349,43 GET DATEPICKER oDatepicker1 VAR dDatepicker1 SIZE 125,24 VALID {|| (dDatepicker1 < dDatepicker2) } 
	@ 482,47 SAY oLabel3 CAPTION "A"  SIZE 10,18
	@ 499,43 GET DATEPICKER oDatepicker2 VAR dDatepicker2 SIZE 125,24 
   
	ACTIVATE DIALOG oDlg CENTER    

	DBCLOSEALL()
	oServer:Close()

RETURN NIL
************************************************************************************
FUNCTION MySqlConnection( cServer, cDatabase, cUser, cPassword, nPort )
************************************************************************************
   LOCAL cnConnection

   hb_Default( @nPort, 3306 )

   cnConnection:= win_OleCreateObject( "ADODB.Connection" )
   cnConnection:ConnectionString := iif( win_OsIs10(), "Provider=MSDASQL;", "" )
   cnConnection:ConnectionString += "Driver={MariaDB ODBC 3.1 Driver};"
   cnConnection:ConnectionString += ;
      "Server=" + cServer + ";" + ;
      "Port=" + Ltrim( Str( nPort ) ) + ";" + ;
      "Stmt=;" + ;
      "Database=" + cDatabase + ";" + ;
      "User=" + cUser + ";" + ;
      "Password=" + cPassword + ";" + ;
      "Collation=utf8_general_ci;" + ;
      "AUTO_RECONNECT=1;" + ;
      "COMPRESSED_PROTO=0;" + ;
      "PAD_SPACE=1"
   cnConnection:CursorLocation    := 3
   cnConnection:CommandTimeOut    := 600 // seconds
   cnConnection:ConnectionTimeOut := 600 // seconds

   RETURN cnConnection
******************************************
FUNCTION win_OsIs10(); RETURN .T.
******************************************

*****************************************
STATIC FUNCTION onDlgInit(  )
*****************************************
   hwg_WriteStatus( ThisBRW,1,"Tabela: " + Alias())
   hwg_WriteStatus( ThisBRW,2,LTrim(Str( RecNo(),8))+ "/" +LTrim(Str( Lastrec(),8)))
   hwg_WriteStatus( ThisBRW,3,"Ordem: Codigo/Data Movimento")	

RETURN Nil

********************************************************
STATIC FUNCTION FILTROLOGGERAL(  )
********************************************************
LOCAL nI, aResult:={}

//	FOR nI = Len( aResult ) TO 1 STEP -1
//	   hb_ADel( aResult, nI, .T. )
//	NEXT

	IF nCODPRO # 0
		oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT,";
										   + "LOGGERAL_CODPRO,";
										   + "LOGGERAL_DATMOV,";
										   + "LOGGERAL_CODVEN,";
										   + "LOGGERAL_CLIFOR,";
										   + "LOGGERAL_QUANT,";
										   + "LOGGERAL_VALUNI,";
										   + "LOGGERAL_OPERADOR, ";
										   + "CASE WHEN LOGGERAL_TIPMOV IS TRUE THEN 'ENTRADA' ELSE 'SAIDAS' END AS STATUS_TIPO ";
									+ "from loggeral WHERE LOGGERAL_CODPRO = " + STRZERO(nCODPRO,7,0);
									+ " AND  LOGGERAL_DATMOV BETWEEN '" ;
									+ STRZERO(YEAR(dDatepicker1),4,0) + "-" + STRZERO(MONTH(dDatepicker1),2,0) + "-" + STRZERO(DAY(dDatepicker1),2,0);
									+ "' AND '";
									+ STRZERO(YEAR(dDatepicker2),4,0) + "-" + STRZERO(MONTH(dDatepicker2),2,0) + "-" + STRZERO(DAY(dDatepicker2),2,0);
									+ "'" )

		DO WHILE ! oQuery:Eof()
			aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
							oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
							oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
							oQuery:Fields( "STATUS_TIPO" ):Value,;
							oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
							oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
							oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
							oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
							oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

			oQuery:MoveNext()
		ENDDO
		oQuery:Close()
	ELSE
		oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT,";
										   + "LOGGERAL_CODPRO,";
										   + "LOGGERAL_DATMOV,";
										   + "LOGGERAL_CODVEN,";
										   + "LOGGERAL_CLIFOR,";
										   + "LOGGERAL_QUANT,";
										   + "LOGGERAL_VALUNI,";
										   + "LOGGERAL_OPERADOR, ";
										   + "CASE WHEN LOGGERAL_TIPMOV IS TRUE THEN 'ENTRADA' ELSE 'SAIDAS' END AS STATUS_TIPO ";
									+ "from loggeral WHERE LOGGERAL_DATMOV BETWEEN '";
									+ STRZERO(YEAR(dDatepicker1),4,0) + "-" + STRZERO(MONTH(dDatepicker1),2,0) + "-" + STRZERO(DAY(dDatepicker1),2,0);
									+ "' AND '";
									+ STRZERO(YEAR(dDatepicker2),4,0) + "-" + STRZERO(MONTH(dDatepicker2),2,0) + "-" + STRZERO(DAY(dDatepicker2),2,0);
									+ "'" )


		DO WHILE ! oQuery:Eof()
			aAdd( aResult, {oQuery:Fields( "LOGGERAL_NUMNOT" ):Value,;
							oQuery:Fields( "LOGGERAL_CODPRO" ):Value,;
							oQuery:Fields( "LOGGERAL_DATMOV" ):Value,;
							oQuery:Fields( "STATUS_TIPO" ):Value,;
							oQuery:Fields( "LOGGERAL_CODVEN" ):Value,;
							oQuery:Fields( "LOGGERAL_CLIFOR" ):Value,;
							oQuery:Fields( "LOGGERAL_QUANT" ):Value,;
							oQuery:Fields( "LOGGERAL_VALUNI" ):Value,;
							oQuery:Fields( "LOGGERAL_OPERADOR" ):Value} ) 

			oQuery:MoveNext()
		ENDDO
		oQuery:Close()	
	ENDIF
	
RETURN aResult

****************************************
STATIC FUNCTION CONSULTA_PRODUTOS(  )
****************************************
LOCAL oDlgPro ;
	, oLabel1, oLabel2 ;
	, oBrowse4 ;
	, oColuna, bColorBlock, vBusca ;
	, oToolbar1 ;
	, nKeyPress 

PRIVATE cProgressKey:=""

	DBSELECTAREA("PRODUTOS")
	ORDSETFOCUS( 2 )
	PRODUTOS->(dbgotop())

	

  INIT DIALOG oDlgPro TITLE "Nota de Pedido - Consulta Produtos"  ;
		ICON MEMVAR->SGC_ICON  ;
		AT 0, 0 SIZE 1006,582 CLIPPER  NOEXIT NOCLOSABLE ;
		ON INIT {|This| onDlgInit3( This, oDlgPro ) }
    PRODUTOSBRW := oDlgPro

	@ 4,70 BROWSE oBrowse4 DATABASE OF oDlgPro SIZE 1000,480 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
			ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS ;
			ON POSCHANGE {|| hwg_WriteStatus( oDlgPro,2,LTrim(Str( RecNo(),8))+ "/" +LTrim(Str( Lastrec(),8))) } ;
			ON CLICK {|| PESQUISAPRODUTO_onClick(  ) } ;
			ON KEYDOWN {|oBrowse4,nKeyPress| PESQUISAPRODUTO_onKeyDown( oBrowse4,nKeyPress ) }

		oBrowse4:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
		oBrowse4:oFont := HFont():Add( '',0,-18,700,,,)	
		oBrowse4:freeze := 2
//		oBrowse4:alias := 'PRODUTOS'
//		SELECT (oBrowse4:alias)  
		bColorBlock :={|| IIF(PRODUTOS->ESTATU + PRODUTOS->ESTL02 = 0.0000 ,{255, 16777215 ,16777215,255 },{0,16777215,, }) }	
		
		oBrowse4:AddColumn( HColumn():New('Codigo', FieldBlock( 'codpro' ) ,'C',9, 0 ,.F.,1,2,'@R 999999-9',,,,,;
		                    {|| Ordsetfocus(1), Dbgotop(), obrowse4:Refresh(), vBusca:="" ,  ;
							hwg_WriteStatus( oDlgPro,3,"Ordem: Codigo   ") } ,,,,))
							
		oBrowse4:AddColumn( HColumn():New('Descrição/Nome Produto', FieldBlock( 'despro' ) ,'C',58, 0 ,.F.,1,,'@S58',,,,,;
						{|| Ordsetfocus(2), Dbgotop(), obrowse4:Refresh(), vBusca:="" , ;
						hwg_WriteStatus( oDlgPro,3,"Ordem: Descriçao") } ,,,,))

		oBrowse4:AddColumn( HColumn():New('Unidade', FieldBlock( 'TIPUNI' ) ,'C',9, 0 ,.F.,1,,,,,,,,,,,))

		oBrowse4:AddColumn( HColumn():New('Preço Venda', FieldBlock( 'preven' ) ,'N',14, 2 ,.F.,1,2,'@E 999,999.99',,,,,,,,,))
		
		oBrowse4:AddColumn( HColumn():New('Estoque Loja', {|| IF(PROSER = "1",ESTATU,ESTATU*(-1)) } ,'N',12, 3 ,.F.,1,2,,,,,,,,,,))

//		bColorBlock :={|| IIF(PRODUTOS->ESTATU + PRODUTOS->ESTL02 = 0.0000 ,{255, 16777215 ,16777215,255 },{0,16777215,, }) }	

		FOR EACH oColuna IN oBrowse4:aColumns
			oColuna:bColorBlock := bColorBlock
		NEXT		
		

		
	@ 8,-1 TOOLBAR oToolbar1  SIZE 945,40 ;
		 
		oToolbar1:AddButton("EXIT16BMP", , 4, 16, "Sair" ,{|| oDlgPro:Close() },'Sair da rotina','', "oToolbutton8")
		oToolbar1:CreateTool()

    ADD STATUS PANEL TO oDlgPro HEIGHT 30  PARTS 200,120,300 
	@ 4,43 SAY oLabel1 CAPTION "Pesquisar"  SIZE 138,25 ;
		STYLE SS_CENTER +WS_DLGFRAME 	
	@ 150,43 SAY oLabel2 CAPTION "" SIZE 410,25 ;
        STYLE WS_BORDER;
        COLOR 16777215  BACKCOLOR 255 

	ACTIVATE DIALOG oDlgPro  CENTER   

	
RETURN .T.

***********************************************************************************
STATIC FUNCTION onDlgInit3( This, oDlgPro )
   hwg_WriteStatus( oDlgPro,1,"Tabela: " + Alias())
   hwg_WriteStatus( oDlgPro,2,LTrim(Str( RecNo(),8))+ "/" +LTrim(Str( Lastrec(),8)))
   hwg_WriteStatus( oDlgPro,3,"Ordem: Descrição")	
RETURN .T.


******************************************************
STATIC FUNCTION PESQUISAPRODUTO_onClick(  ) 
	IF hwg_LastKey() ==	MK_LBUTTON
		PRODUTOSBRW:Close()
	ENDIF
RETURN .T.
********************************************************
STATIC FUNCTION PESQUISAPRODUTO_onKeyDown( oBrowse4,nKey )
   LOCAL nPosicao:=0, nKeyPress:=nkey
   LOCAL cRegEx := "[a-zA-Z0-9 ]{1}"
   KSETCAPS(.T.)

   aResult:=HB_RegExALL( cRegEx, Chr(nKeyPress) )

   IF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ "34|33|37|38|39|40|20|16"
      cProgressKey:=""
      PRODUTOSBRW:oLabel2:settext(cProgressKey)
      RETURN .T.
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [90]
      nKeyPress := 90
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [96]
      nKeyPress := 48
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [97]
      nKeyPress := 49
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [98]
      nKeyPress := 50
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [99]
      nKeyPress := 51
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [100]
      nKeyPress := 52
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [101]
      nKeyPress := 53
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [102]
      nKeyPress := 54
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [103]
      nKeyPress := 55
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [104]
      nKeyPress := 56
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [105]
      nKeyPress := 57
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [106]
      nKeyPress := 42
   ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [190]
      nKeyPress := 46
   ELSEIF nKeyPress == Asc("8") .AND. hwg_isCtrlShift( .F.,.T. )
	  nKeyPress := 42		
   ENDIF   

	IF 	nKeyPress = VK_RETURN .OR. nKeyPress = VK_ESCAPE
		PRODUTOSBRW:Close()		
		RETURN .T.   
	ENDI

		
// IF IsAscii(Chr(nKeyPress)) .AND. nKeyPress # 8
   If nKeyPress # 8
		cProgressKey += Chr(nKeyPress)
		nPosicao:=AScan(PRODUTOSBRW:oBrowse4:aArray,cProgressKey)
		PRODUTOSBRW:oLabel2:settext(cProgressKey)
		PRODUTOSBRW:oBrowse4:TOP()
		DBSEEK(cProgressKey,.T.)

   ELSEIF nKeyPress = 8 .AND. Len(cProgressKey) >= 1
		cProgressKey:=Left(cProgressKey,Len(cProgressKey) - 1)
		nPosicao:=AScan(PRODUTOSBRW:oBrowse4:aArray,cProgressKey)
		PRODUTOSBRW:oLabel2:settext(cProgressKey)
		PRODUTOSBRW:oBrowse4:TOP()
		DBSEEK(cProgressKey,.T.)
   ENDIF   
   IF nPosicao # 0
      oBrowse4:rowPos := nPosicao
      Eval( PRODUTOSBRW:oBrowse4:bGoTo, PRODUTOSBRW:oBrowse4, nPosicao )
      PRODUTOSBRW:oBrowse4:Refresh()
   ENDIF   
return .t.  

rotina completa para estudos , tem alguma coisas que podem ser melhoradas, como declarações de variaveis , mas era somente um teste
nao tive muita preocupação de deixar tudo bonitinho.

Browse com ADO

Enviado: 18 Mar 2020 11:10
por gilbertosilverio
Fernando,

Muito obrigado.

E so pra eu tentar entender como funciona, como sou leigo (burro mesmo... kkkk) e com do básico que consigo dar inicio e ir avançando.

Valeu...