Página 1 de 1

Conversão Base de Dados Sistema Legado

Enviado: 09 Fev 2020 08:45
por asimoes
Faço manutenção em sistema de mais de 30 anos!, fiz a conversão em 2010 de clipper para harbour e em 2017 comecei a outra conversão para 100% GUI,
mas a base de dados continua sendo a mesmo até agora, agora estou preparando a base para migrar para um SGBD já escolhi o MariaDb pela questão custo.
Essa base de dados ainda tem o "ranso" de nomes não amigáveis, não tem manual, por exemplo a base de sócios é APC01, a base de cobrança é APA01, APA41 e por ai vai. a base APC01 já modifiquei para CADASTROSOCIOS.DBF, APA01 para COBRANCAASAPREV.DBF, APA41 para COBRANCAUTI, tá dando um trabalho, em 2 dias modifiquei todas as chamadas no sistema para os nomes antigos, depois vou me agradecer. Eu entendo que esses nomes eram assim por conta da limitação do S.O da época o Ms-Dos que limitava a 8.3, mas se eu estou pensando em melhorar a segurança e integridade, então é hora de deixar os nomes das tabelas o mais claro possível, nome de campo ficará para depois, isso é mais complicado. Fica a dica.

Conversão Base de Dados Sistema Legado

Enviado: 09 Fev 2020 15:45
por susviela@bol.com.br
Excelente escolha o MariaDB.

Pois é, essa parte de converter sistemas legados, dá uma "cosquinha" de fazer tudo que a nosso ver, poderia ser melhorado, mas precisamos mesmo fazer uma seleção de prioridades para evitar sobrecarga de trabalho.

E vamos tocar a vida em frente.

Conversão Base de Dados Sistema Legado

Enviado: 09 Fev 2020 20:25
por Nascimento
imagino que cada um a seu tempo vai ter que fazer isso, por hora optei pelo letodbf , mais sei que em um futuro proximo posso optar para algum sgdb

Conversão Base de Dados Sistema Legado

Enviado: 15 Mar 2020 15:43
por Fernando queiroz
Hoje uso o LETODBF mas já iniciei as conversões de dados para o MARIADB e agora chegou a parte complicada, estou querendo fazer um BROWSE pegando os dados do MARIADB mas to mais perdido que tudo , alguém que já tenha uma experiência no assunto pode me dar uma mão

Segue abaixo o código para entendimento

Não sei como pegar os dados do retorno do MARIADB , já tentei como DATABASE e ARRAY mas não deu certo
preciso adicionar alguma .DLL

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

	BEGIN SEQUENCE
	  	oCn := MySqlConnection( "192.168.15.200", "", "sgcroot", "20r13uqse" )
		oCn:Open()
		cQuery:="USE AMADEU"
		oCn:EXECUTE(cQuery)
	RECOVER
		hwg_MsgInfo('Erro na Conecção do Banco de Dados')
		Return nil
	End		
	
	BEGIN SEQUENCE	
		cQuery:= "SELECT LOGGERAL_NUMNOT, LOGGERAL_CODPRO, LOGGERAL_DATMOV, LOGGERAL_TIPMOV, LOGGERAL_CODVEN, LOGGERAL_CLIFOR, LOGGERAL_QUANT, LOGGERAL_VALUNI, LOGGERAL_OPERADOR from loggeral"
		Retorno := oCn:EXECUTE(cQuery)	
	RECOVER
		hwg_MsgInfo('Erro no SELECT do Banco de Dados')
		oCn:Close()
		Return nil
	End			
		
		
		INIT DIALOG oDlg TITLE "Log Geral - Consulta"  ;
			ICON MEMVAR->SGC_ICON  ;
			AT 0, 0 SIZE 1167,600 CLIPPER  NOEXIT  

		ThisBRW := oDlg	
		
//		hwg_CREATEARLIST( oBrowse1, Retorno )
		
		@ 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:AddColumn( HColumn():New( "Nr.Nota",Retorno:fields["LOGGERAL_NUMNOT"]:VALUE,"C",10,00) )
			oBrowse1:AddColumn( HColumn():New( "Codigo",Retorno:fields["LOGGERAL_CODPRO"]:VALUE,"C",10,00,) )

//			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("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()

		
		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 '@R 999999-9' MAXLENGTH 9  		
//			
//		@ 245,43 OWNERBUTTON oOwnerbutton1  SIZE 24,24   ;
//			TEXT ''  ;
//			COORDINATES 0, 0, 0, 0  ;
//			BITMAP 'FINDBMP' FROM RESOURCE ;
//			COORDINATES 2, 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    

		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.


Conversão Base de Dados Sistema Legado

Enviado: 15 Mar 2020 19:20
por asimoes
Olá,
Você vai ter que usar vetor, como eu faço.

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 13:09
por JoséQuintas
asimoes escreveu:Você vai ter que usar vetor, como eu faço.
Mas a HWGUI não tinha um browse igual o TBrowse?

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 14:55
por Fernando queiroz
JoséQuintas escreveu:
asimoes escreveu:Você vai ter que usar vetor, como eu faço.
Mas a HWGUI não tinha um browse igual o TBrowse?
asimoes eu to tentando mas nao saiu nada ate agora

tentei assim

DO WHILE ! oQuery:Eof()
oRow := oQuery:GetRow()
aArray := { oRow:FieldGet( oRow:FieldPos( "LOGGERAL_NUMNOT" )), oRow:FieldGet( oRow:FieldPos( "LOGGERAL_CODPRO" )) }
oQuery:SKIP( )
ENDD

e depois

hwg_CREATEARLIST( oBrowse1, aArray )

@ 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

mas nao rolou , to perdido

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 15:18
por JoséQuintas

Código: Selecionar todos

rs := conexão:Execute( "SELECT ...." )
aArray := rs:GetRows()
a partir daí, o aArray é um array comum.

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 15:59
por AutomoSistema
Boa tarde, depois de um select eu faço assim

::MemoryTableVenda:Zap()
xRegistro := Len( ::xPegaDados )
For xConta = 1 to xRegistro
::MemoryTableVenda:Append()
With Object ::MemoryTableVenda:Fields
:Codigo := ::xPegaDados[xConta,1]
:Nome := ::xPegaDados[xConta,2]
:Custo := ::xPegaDados[xConta,3]
:Venda := ::xPegaDados[xConta,4]
:Total := ::xPegaDados[xConta,4] * :Quantidade
End
Next

adicionando dados de uma array em uma tabela temporária fica muito rápido depois de um simples select

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 16:48
por Fernando queiroz
Ainda esta meio estranho mas já deu uma luz

fiz assim

oServer := MySqlConnection( "192.168.15.200", "", "sgcroot", "20r13uqse" )
oServer:Open()
oServer:Execute( "USE AMADEU")
oQuery := oServer:Execute( "SELECT LOGGERAL_NUMNOT, LOGGERAL_CODPRO from loggeral LIMIT 50" )
aArray := oQuery:GetRows()


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,,,)

hwg_CREATEARLIST( oBrowse1, aArray )
oBrowse1:aColumns[1]:heading := "Nr.Nota"
oBrowse1:aColumns[2]:heading := "Codigo"
tela.jpg
so que pelo visto ele ta pegando o array como uma coluna somente

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 18:53
por JoséQuintas
A impressão que tenho é que está ao contrário: linhas são colunas, e colunas são linhas.
A primeira linha são as notas, e a segunda linha são os códigos

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 19:28
por JoséQuintas
Olhando os fontes:

HBROWSE tem as propriedades bSkip, bGoto, bGoTop, bGoBot, bEof, bBof - acredito que sejam os codeblocks de movimentação
HCOLUMN tem a propriedade block, heading - acredito que seja o equivalente das colunas do tbrowse

Como se usa isso não sei, mas seria o equivalente do tbrowse, e seria adaptar aquele tbrowse console pra esse controle.
Talvez olhar os arquivos CH, pra ver como usar isso via comando.

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 20:35
por asimoes
Array para o BROWSE ARRAY da HwGui é assim:

aResult := { { COL1, COL2, COL3 } }

Então usando FOR .. EACH

Código: Selecionar todos

For Each oElemento IN aResult
   aAdd( aResult, { oElemento[1], oElemento[2], oElemento[3] } ) //até o limite de elementos do resultset
Next

ThisForm:GridTeste:aArray := aResult
ThisForm:GridTeste:Refresh()


Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 20:38
por asimoes
Somente como exemplo como eu faço:

Código: Selecionar todos

  @ 0005,0144 BROWSE   GridProcessos ;
               ARRAY ;
               SIZE     1296,455 ;
               STYLE    WS_TABSTOP + ES_AUTOHSCROLL + WS_HSCROLL ;
               FONT     HFont():Add( 'Tahoma', 0, -13, 550 ) ;
               ON CLICK {|| ::MPegaNumeroProcesso("C") }   

    With Object GridProcessos             
       :aArray         := {}
       :HighlightStyle := 1                       
       :sepColor       := 16711680                
       :tcolorSel      := Hwg_Rgb(0, 0, 0)
       :bcolorSel      := N_CLEANBLUE                
       :headColor      := Hwg_Rgb(0, 0, 0)                
       :freeze         := 1                       
       :lAdjRight      := .T.                     
       :nColumns       := 7
       :AutoFit() 
       :oHeadFont      := HFont():Add( 'Tahoma', 0, -13, 700 )   
       :nHeadHeight    := 24 
       :SetRowHeight( :nHeadHeight )
       :ShowMark(.T.) // Seta da grid
       :AddColumn( HColumn():New('Data;Preferência', hwg_ColumnArBlock(), 'D', 10, 00, lEditable, DT_CENTER, DT_CENTER,,,,,,{|| ::Ordena(1)},,,,))
       :AddColumn( HColumn():New('Data;Entrada',     hwg_ColumnArBlock(), 'D', 10, 00, lEditable, DT_CENTER, DT_CENTER,,,,,,,,,,))
       :AddColumn( HColumn():New(';Processo',        hwg_ColumnArBlock(), 'C', 25, 00, lEditable, DT_CENTER, DT_CENTER, '@R 9999999-99.9999.9.99.9999',,,,,,,,,))
       :AddColumn( HColumn():New(';Reclamante',      hwg_ColumnArBlock(), 'C', 60, 00, lEditable, DT_CENTER, DT_LEFT,,,,,,,,,,))
       :AddColumn( HColumn():New(';Valor',           hwg_ColumnArBlock(), 'N', 14, 02, lEditable, DT_CENTER, DT_RIGHT, '@E 99,999,999.99',,,,,,,,,))
       :AddColumn( HColumn():New(';Status',          hwg_ColumnArBlock(), 'C', 10, 00, lEditable, DT_CENTER, DT_CENTER,,,,,,,,,,))
       :AddColumn( HColumn():New('Banco;Judicial',   hwg_ColumnArBlock(), 'C', 10, 00, lEditable, DT_CENTER, DT_CENTER, '@R 999-9',,,,,,,,,))
       :bOther := {|this,m,wp,lp| ::MGridProcessosChange( this, m, wp, lp ) }
       For iColuna:=1 to 7
          :aColumns[iColuna]:bColorBlock := {|| ::MColorBlock() }
          DoEvents()
       Next
    End

METHOD MColorBlock()
LOCAL bColor, cStatusProcesso

   cTipoBloqueio   := Thisform:GridProcessos:aArray[ Thisform:GridProcessos:nCurrent, 8]
   cEnviadoFinCon  := Thisform:GridProcessos:aArray[ Thisform:GridProcessos:nCurrent, 9]
   cStatusProcesso := Thisform:GridProcessos:aArray[ Thisform:GridProcessos:nCurrent, 10]
      
   If cStatusProcesso $ "CQS"
      bColor := {8334079, N_WHITE,  8334079, N_CLEANBLUE}  
   Else
      If cEnviadoFinCon = "1"
         bColor := {33023, N_WHITE,   33023, N_CLEANBLUE}   
      Else
         bColor := {N_BLACK, N_WHITE , N_BLACK, N_CLEANBLUE}	
         If ! Empty( cTipoBloqueio )	
      	   bColor := {N_RED, N_WHITE,   N_RED, N_CLEANBLUE}
         Else
            bColor := {N_BLACK, N_WHITE , N_BLACK, N_CLEANBLUE}		 
         Endif
      Endif	
   Endif
   
RETURN bColor

Conversão Base de Dados Sistema Legado

Enviado: 16 Mar 2020 20:41
por asimoes
A grid é populada com algum resultset, depois que faz uma depois é somente copy/cola e alguns ajustes