uso basicamente igual a vc, mais tenho uma matriz com todas as estruturas do banco, e através de um parâmetro no sistema faço a verificação de alguma diferença no bdf, caso tenho crio e importo do antigo, tem funcionado a bastante tempo.
Código: Selecionar todos
----------------------
FUNCTION DBFS_1()
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA ")
//----- TABCONFG.JAF CONFIGURACAO DO SISTEMA
CARQCDX := "TABCONFG"+TIPODRIVER
CARQDBF := "TABCONFG.JAF"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
ESTRUTURA := { { "TAB_CODI" , "C" , 4, 0 },;
{ "TAB_NOME" , "C" , 30, 0 },;
{ "TAB_CONT" , "C" , 60, 0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('TABCONFG.JAF',ESTRUTURA)
IF ! FILE("TABCONFG.JAF")
DBCREATE("TABCONFG.JAF", ESTRUTURA )
MSG("AGUARDE.... CRIANDO "+CARQDBF)
USE TABCONFG.JAF
INDEX ON TAB_CODI TAG TABCONF1 TO TABCONFG
INDEX ON TAB_CONT TAG TABCONF2 TO TABCONFG
ELSEIF ! FILE("TABCONFG"+TipoDriver)
USE TABCONFG.JAF
MSG("AGUARDE.... CRIANDO "+CARQCDX)
INDEX ON TAB_CODI TAG TABCONF1 TO TABCONFG
INDEX ON TAB_CONT TAG TABCONF2 TO TABCONFG
ENDIF
//----- MENUJAF.JAF MENU DO SISTEMA USO SISTEMA.EXE
CARQCDX := "MENUJAF"+TIPODRIVER
CARQDBF := "MENUJAF.DBF"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
ESTRU := {}
ESTRU := { {"FUNCAO_001" , "C" , 20,0 },;
{"NRO_ACESSO" , "C" , 03,0 },;
{"MSG_000001" , "C" , 40,0 },;
{"TITULO_001" , "C" , 30,0 },;
{"TIPO_MENU" , "C" , 2,0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('MENUJAF.DBF',ESTRU)
IF ! FILE("MENUJAF.DBF")
CLOSE ALL
MSG("AGUARDE.... CRIANDO "+CARQDBF)
DBCREATE("MENUJAF.DBF",ESTRU )
USE MENUJAF
INDEX ON TITULO_001 TAG MENU TO MENUJAF
ENDIF
//------ ARQUIVO DE MONITORAMENTO USUARIO NO SISTEMA
CARQCDX := "MONITOR"+TIPODRIVER
CARQDBF := "MONITOR.DBF"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
Estru := { {"Usuario", "C", 15,0 },;
{"Data" , "D", 8,0 },;
{"Entrada", "C", 8,0 },;
{"Saida" , "C", 8,0 },;
{"Ip" ,"C", 14,0 },;
{"Exec" ,"C", 11,0 },;
{"Maquina" ,"C", 15,0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('MONITOR.DBF',ESTRU)
If ! File("Monitor.dbf")
MSG("AGUARDE.... CRIANDO "+CARQDBF)
Dbcreate("Monitor.dbf",Estru)
Use Monitor
Index on Ip Tag Monitor To monitor
ElseIf ! File("Monitor"+TipoDriver)
MSG("AGUARDE.... CRIANDO "+CARQCDX)
Use Monitor
Index on Ip Tag Monitor To monitor
Endif
//--- CADASTRO DE LOJAS E FILIAIS
CARQCDX := "CADLOJAS"+TIPODRIVER
CARQDBF := "CADLOJAS.DBF"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
Estru := { { "CodLoja" ,"C" , 03,0 },;
{ "NomLoja" ,"C" , 20,0 },;
{ "Integrada" ,"C" , 01,0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('CADLOJAS.DBF',ESTRU)
If ! File("CadLojas.dbf")
MSG("AGUARDE.... CRIANDO "+CARQDBF)
Dbcreate("CadLojas.dbf",Estru)
Use CadLojas
APPEND BLANK
REPLA CODLOJA WITH "001"
REPLA NOMLOJA WITH "MATRIZ"
REPLA INTEGRADA WITH "S"
Index on CodLoja Tag CadLojas to CadLojas
ElseIf ! File("CadLojas"+TipoDriver)
MSG("AGUARDE.... CRIANDO "+CARQCDX)
Use CadLojas
Index on CodLoja Tag CadLojas to CadLojas
Endif
//--- CADASTRO DE LOJAS E FILIAIS
CARQCDX := "SYSJAF"+TIPODRIVER
CARQDBF := "SYSJAF.DIC"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
Estru := { {"Nom_Arq" , "C" ,15,0 },;
{"Campo" , "C" ,15,0 },;
{"Tipo" , "C" , 1,0 },;
{"Tamanho" , "N" , 3,0 },;
{"Decimal" , "N" , 3,0 },;
{"Ocorren" , "C" ,20,0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('SYSJAF.DIC',ESTRU)
If ! File("SysJaf.Dic")
MSG("AGUARDE.... CRIANDO "+CARQCDX)
Dbcreate("SysJaf.Dic",Estru)
Use SysJaf.Dic
Index on Nom_Arq + Campo TAG SYSJAF to SysJaf
ElseIf ! File("SysJaf"+TIPODRIVER)
MSG("AGUARDE.... CRIANDO "+CARQCDX)
Use SysJaf.Dic
Index on Nom_Arq + Campo TAG SYSJAF to SysJaf
Endif
//--- CONTROLE DE NUMERO DE HD ACESSANDO O SISTEMA
CARQCDX := "CtrlHd01"+TIPODRIVER
CARQDBF := "CtrlHd01.jaf"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
Estru := { { "HD", "C" , 20,0 },;
{ "PC", "C" , 20,0 } }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('CtrlHd01.jaf',ESTRU)
If ! File("CtrlHd01.jaf")
Dbcreate("CtrlHd01.jaf",Estru)
MSG("AGUARDE.... CRIANDO "+CARQDBF)
Use CtrlHd01.jaf
Index on HD tag HD_001 to CtrlHd01
ElseIf ! File("CtrlHd01"+TipoDriver)
MSG("AGUARDE.... CRIANDO "+CARQCDX)
Use CtrlHd01.jaf
Index on HD tag HD_001 to CtrlHd01
Endif
//--- CONTROLE DE ACESSO PERFIL DE USUARIO
CARQCDX := "CADACESS"+TIPODRIVER
CARQDBF := "CADACESS.DBF"
MSG("AGUARDE.... VERIFICANDO ARQUIVOS DO SISTEMA "+CARQDBF)
Estru := { {"CodAcess","C",03,0},;
{"DesAcess","C",40,0},;
{"ModAcess","C",15,0},;
{"Menu" ,"C",01,0},;
{"Liberado","C",01,0} }
AADD(LISTADBF,{CARQCDX,CARQDBF})
Ver_Dbf('CadAcess.dbf',ESTRU)
If ! File("CadAcess.dbf")
MSG("AGUARDE.... CRIANDO "+CARQDBF)
Dbcreate("CadAcess.dbf",estru)
use CadAcess
Index on CodAcess Tag Acess_01 To CadAcess
Index on DesAcess Tag Acess_02 To CadAcess
Index on ModAcess Tag Acess_03 To CadAcess
ElseIf ! File("CadAcess"+TIPODRIVER)
MSG("AGUARDE.... CRIANDO "+CARQCDX)
use CadAcess
Index on CodAcess Tag Acess_01 To CadAcess
Index on DesAcess Tag Acess_02 To CadAcess
Index on ModAcess Tag Acess_03 To CadAcess
Endif
RETURN NIL
/------------------------------------------------------
Static Function Ver_Dbf(cDbf,cMatriz)
Local cArquivo := cDbf
Local nTotCompos := 0
Local DadoCampo := {}
Local cCampos := {}
Local cPesq
Local b
If XJAF_ARRUMAR==.F.
Return .t.
ENDIF
If ! File(cArquivo)
*Alerta("Arquivo nao localizado "+cArquivo)
Return nil
Endif
//--- Carregando Estrutura do Dbf
*Alerta("Arquivo :"+cArquivo)
Close All
Close All
Sele 1
Use (cArquivo) Alias _Arq
Sele _Arq
*Dbedit(00,00,24,79)
nTotCompos := FCount()
DadoCampo := DbStruct()
cCampos := {}
Close all
*Clear Memory
For B:=1 to nTotCompos
*Aadd(cCampos,{Alltrim(Upper(DadoCampo[b,1])),DadoCampo[b,2],DadoCampo[b,3],DadoCampo[b,4]} )
cFields := ALLTRIM(Upper(DadoCampo[b,1]))+;
Upper(DadoCampo[b,2])+;
Str(DadoCampo[b,3],7)+;
Str(DadoCampo[b,4],7)
*Aadd(cCampos,ALLTRIM(Upper(DadoCampo[b,1])) ) // ,DadoCampo[b,2],DadoCampo[b,3],DadoCampo[b,4]} )
Aadd(cCampos,cFields ) // ,DadoCampo[b,2],DadoCampo[b,3],DadoCampo[b,4]} )
Next
cErros := {}
For x:= 1 to Len(cMatriz)
*cPesq := ALLTRIM(Upper(cMatriz[x,1]))
cPesq := ALLTRIM(Upper(cMatriz[x,1]))+;
upper(cMatriz[x,2])+;
Str(cMatriz[x,3],7)+;
Str(cMatriz[x,4],7)
*nPos := Ascan(cCampos,{|x|x[1]==cPesq})
nPos := Ascan(cCampos,cPesq)
If nPos == 0
*Alerta(cPesq+'-'+cCampos[x])
cMsg := "Falta Campo :"+cPesq
aadd(cErros,cMsg)
Endif
Next
*Alerta("oi")
If Len(cErros) > 0
Cri_Dbf_Estru(cArquivo,cMatriz)
Endif
Return nil
//--------------------------------------
Static Function Cri_Dbf_Estru(cDbf,cEstru)
Local nSize := Len(cDbf)
Local cNomeFile := Substr(cDbf,1,nSize-4)
Local cNomeCdx := Substr(cDbf,1,nSize-4)
Local cLocal := Iif(Lerparam("DIRETORIODBA")=='','',Lerparam("DIRETORIODBA")+"\")
cNomeFile := 'converte.dbf'
//If File(cLocal+cNomeFile+'.Tmp')
// Delete File (cLocal+cNomeFile+'.Tmp')
//Endif
If File(cLocal+cNomeFile)
Delete File (cLocal+cNomeFile)
Endif
//Dbcreate(cNomeFile+'.Tmp',cEstru)
Dbcreate(cNomeFile,cEstru)
CLOSE ALL
CLOSE ALL
SET DELETED OFF
MSG("AGUARDE.... Arrumando Arquivo "+cDbf)
SELE 1
//USE (cNomeFile+'.Tmp')
USE (cNomeFile)
Set index to
Append from (cDbf)
SET DELETED ON
CLOSE ALL
CLOSE ALL
CLOSE ALL
Delete File (cLocal+cDbf)
//Rename (cLocal+cNomeFile+'.Tmp') to (cLocal+cDbf )
Rename (cLocal+cNomeFile) to (cLocal+cDbf )
Close all
If File(cLocal+cNomeCdx+'.cdx')
Delete File (cLocal+cNomeCdx +'.cdx')
Endif
CLOSE ALL
CLOSE ALL
Return nil