Melhorou.
Pena que não pensei nisso antes.
Código: Selecionar todos
STATIC FUNCTION Update0903B()
LOCAL oItem, xCodigo
LOCAL cnSQL := ADOClass():New( AppConexao() )
IF AppConexao() == NIL
RETURN NIL
ENDIF
SayScroll( "2020.09.03 Separação de tabelas" )
WITH OBJECT cnSQL
:cSQL := "SELECT * FROM JPAUXILIAR"
:Execute()
DO WHILE ! :Eof()
FOR EACH oItem IN { ;
{ "JPTABPRODEP", "IDPRODEP", "PRODEPNOME", "PRODEPINFINC", "PRODEPINFALT", "PRODEP", "N" }, ;
{ "JPTABPROGRU", "IDPROGRU", "PROGRUNOME", "PROGRUINFINC", "PROGRUINFALT", "PROGRU", "N" }, ;
{ "JPTABPROSEC", "IDPROSEC", "PROSECNOME", "PROSECINFINC", "PROSECINFALT", "PROSEC", "N" }, ;
{ "JPTABPROLOC", "IDPROLOC", "PROLOCNOME", "PROLOCINFINC", "PROLOCINFALT", "PROLOC", "N" }, ;
{ "JPTABCFOP", "IDCFOP", "CFOPNOME", "CFOPINFINC", "CFOPINFALT", "CFOP..", "C" }, ;
{ "JPTABICMCST", "IDICMCST", "ICMCSTNOME", "ICMCSTINFINC", "ICMCSTINFALT", "ICMCST", "C" }, ;
{ "JPTABIPICST", "IDIPICST", "IPICSTNOME", "IPICSTINFINC", "IPICSTINFALT", "IPICST", "C" }, ;
{ "JPTABIPIENQ", "IDIPIENQ", "IPIENQNOME", "IPIENQINFINC", "IPIENQINFALT", "IPIENQ", "C" }, ;
{ "JPTABPROUNI", "IDPROUNI", "PROUNINOME", "PROUNIINFINC", "PROINIINFALT", "PROUNI", "C" }, ;
{ "JPTABTRICAD", "IDTRICAD", "TRICADNOME", "TRICADINFINC", "TRICADINFALT", "TRICAD", "N" }, ;
{ "JPTABTRIPRO", "IDTRIPRO", "TRIPRONOME", "TRIPROINFINC", "TRIPROINFALT", "TRIPRO", "N" }, ;
{ "JPTABTRIUF", "IDTRIUF", "TRIUFNOME", "TRIUFINFINC", "TRIUFINTALT", "TRIUF.", "N" }, ;
{ "JPTABTRIEMP", "IDTRIEMP", "TRIEMPNOME", "TRIEMPINFINC", "TRIEMPINFALT", "TRIEMP", "N" }, ;
{ "JPTABBANCO", "IDBANCO", "BANCONOME", "BANCOINFINC", "BANCOINFALT", "BANCO.", "N" }, ;
{ "JPTABCADGRU", "IDCADGRU", "CADGRUNOME", "CADGRUINFINC", "CADGRUINFALT", "CLIGRU", "N" }, ;
{ "JPTABFILIAL", "IDFILIAL", "FILIALNOME", "FILIALINFINC", "FILIALINFALT", "FILIAL", "N" }, ;
{ "JPTABFINOPE", "IDFINOPE", "FINOPENOME", "FINOPEINFINC", "FINOPEINFALT", "FINOPE", "N" }, ;
{ "JPTABFINPOR", "IDFINPOR", "FINPORNOME", "FINPORINFINC", "FINPORINFALT", "FINPOR", "N" }, ;
{ "JPTABMIDIA", "IDMIDIA", "MIDIANOME", "MIDIAINFINC", "MIDIAINFALT", "MIDIA.", "N" }, ;
{ "JPTABMOTIVO", "IDMOTIVO", "MOTIVONOME", "MOTIVOINFINC", "MOTIVOINFALT", "MOTIVO", "N" } }
IF :String( "AXTABELA" ) == oItem[ 6 ]
xCodigo := :String( "AXCODIGO" )
IF oItem[ 7 ] == "N"
xCodigo := Val( xCodigo )
ENDIF
IF ! Empty( xCodigo )
:QueryCreate()
:QueryAdd( oItem[ 2 ], iif( oItem[ 7 ] == "N", :Number( "AXCODIGO" ), :String( "AXCODIGO" ) ) )
:QueryAdd( oItem[ 3 ], :String( "AXDESCRI" ) )
:QueryAdd( oItem[ 4 ], :String( "AXINFINC" ) )
:QueryAdd( oItem[ 5 ], :String( "AXINFALT" ) )
:QueryExecuteInsert( oItem[ 1 ], .T. )
ENDIF
:ExecuteCmd( "DELETE FROM JPAUXILIAR WHERE AXTABELA = " + StringSQL( "MOTIVO" ) + " AND AXCODIGO = " + StringSQL( :String( oItem[ 2 ] ) ) )
ENDIF
NEXT
:MoveNext()
Inkey()
ENDDO
:CloseRecordset()
SayScroll( "2020.09.03 Cadastrando em tabelas vazias" )
IF ADORecCount( "JPTABUNIDADE" ) == 0
FOR EACH oItem IN SEFAZ_UNIDADE
:QueryCreate()
:QueryAdd( "IDUNIDADE", oItem[ 1 ] )
:QueryAdd( "UNIDNOME", oItem[ 2 ] )
:QueryExecuteInsert( "JPTABUNIDADE", .T. )
NEXT
ENDIF
IF ADORecCount( "JPTABCFOP" ) == 0
FOR EACH oItem IN SEFAZ_CFOP
:QueryCreate()
:QueryAdd( "IDCFOP", oItem[ 1 ] )
:QueryAdd( "CFOPNOME", oItem[ 2 ] )
:QueryExecuteInsert( "JPTABCFOP", .T. )
NEXT
ENDIF
IF ADORecCount( "JPTABICMCST" ) == 0
FOR EACH oItem IN SEFAZ_ICMCST
:QueryCreate()
:QueryAdd( "IDICMCST", oItem[ 1 ] )
:QueryAdd( "ICMCSTNOME", oItem[ 2 ] )
:QueryExecuteInsert( "JPTABICMCST", .T. )
NEXT
ENDIF
IF ADORecCount( "JPTABIPICST" ) == 0
FOR EACH oItem IN SEFAZ_IPICST
:QueryCreate()
:QueryAdd( "IDIPICST", oItem[ 1 ] )
:QueryAdd( "IPICSTNOME", oItem[ 2 ] )
:QueryExecuteInsert( "JPTABIPICST", .T. )
NEXT
ENDIF
FOR EACH oItem IN { ;
{ "JPTABCADGRU", "IDCADGRU", 1, "CADGRUNOME", "GERAL" }, ;
{ "JPTABCADSTA", "IDCADSTA", 1, "CADSTANOME", "GERAL" }, ;
{ "JPTABFILIAL", "IDFILIAL", 1, "FILIALNOME", "MATRIZ" }, ;
{ "JPTABFINOPE", "IDFINOPE", 1, "FINOPENOME", "GERAL" }, ;
{ "JPTABFINPOR", "IDFINPOR", 1, "FINPORNOME", "GERAL" }, ;
{ "JPTABFORPAG", "IDFORPAG", 1, "FORPAGNOME", "GERAL" }, ;
{ "JPTABIPIENQ", "IDIPIENQ", "999", "IPIENQNOME", "OUTROS" }, ;
{ "JPTABMIDIA", "IDMIDIA", 1, "MIDIANOME", "GERAL" }, ;
{ "JPTABMOTIVO", "IDMOTIVO", 1, "MOTIVONOME", "GERAL" }, ;
{ "JPTABPRODEP", "IDPRODEP", 1, "PRODEPNOME", "GERAL" }, ;
{ "JPTABPROGRU", "IDPROGRU", 1, "PROGRUNOME", "GERAL" }, ;
{ "JPTABPROLOC", "IDPROLOC", 1, "PROLOCNOME", "GERAL" }, ;
{ "JPTABPROSEC", "IDPROSEC", 1, "PROSECNOME", "GERAL" }, ;
{ "JPTABTRICAD", "IDTRICAD", 1, "TRICADNOME", "GERAL" }, ;
{ "JPTABTRIEMP", "IDTRIEMP", 1, "TRIEMPNOME", "GERAL" }, ;
{ "JPTABTRIPRO", "IDTRIPRO", 1, "TRIPRONOME", "GERAL" }, ;
{ "JPTABTRIUF", "IDTRIUF", 1, "TRIUFNOME", "GERAL" } }
IF ADORecCount( oItem[ 1 ] ) == 0
:QueryCreate()
:QueryAdd( oItem[ 2 ], oItem[ 3 ] )
:QueryAdd( oItem[ 4 ], oItem[ 5 ] )
:QueryExecuteInsert( oItem[ 1 ] )
ENDIF
NEXT
ENDWITH
RETURN NIL
A rotina completa.
Além da conversão, tem o default caso estejam vazias, e mais um cadastramento pelos arquivos da sefazclass.
Além do que estava na outra rotina, tem o resto.
Acho que nem precisa dizer.... em todo caso... com conversão e tudo, mais prático do que em DBF.
É bom chamar atenção pra isso, porque assim pode ajudar quem tem medo de trocar.
Essas e outras rotinas, vão ser executadas quando eu instalar versão nova em cliente.
Bom... aqui, por enquanto, roda toda hora que eu carrego o aplicativo
É que só altero o número da versão no final.
E enquanto não altero a versão... fica executando toda hora...
Se aqui funciona trocentas vezes... no cliente vai funcionar.
E é por isso que de vez em quando volto backups, e abro vários aplicativos de uma vez....
Uma coisa é testar atualizando o que está em andamento, parcialmente convertido, e outra coisa é com um backup fazendo exatamente como está no cliente.
Esse será o teste final, antes da liberação.