Ola, desde os tempos do clipper faço da seguinte forma:
Uma Matriz contento os campos da base
{"NOME", "C", 35,0},;
{"EST", "C", 2,0}},;
"TABELA IBGE DE MUNICIPIOS",;
{{"CADMUN->CODIGO", "CADMUN01"},;
{"CADMUN->NOME", "CADMUN02"}}}) id=code>id=code>Tenho uma função especifica para gerenciar base de dados, com ele posso adicionar campos, reidenxar e packear a base, teste ai p ver se te serve
Codigo:
//cPati = Path dos Indices
//Modo = 1 - Checar Existencia Base de Dados e Estrutura
//Modo = 2 - Reindexar Tabelas
//Modo = 3 - Packear Tabelas
Function Config_Arq(aDbfs, Modo)
If !lIsDir(cPath)
lMkDir(cPath)
EndIf
IF !lIsdir(cPati)
lMkDir(cPati)
EndIf
For nConta = 1 to Len(aDbfs)
If Modo = 1
If !File(cPath+aDbfs[nConta][1]+".DBF")
aEstru := aDbfs[nConta][2]
DbCreate(cPath+aDbfs[nConta][1], aEstru)
Close Databases
EndIf
aArq := aDbfs[nConta][1]
aEstru := aDbfs[nConta][2]
aInd := aDbfs[nConta][4]
Use (cPath+aArq) Alias (aArq) EXCLUSIVE
IF NetErr()
Return
EndIF
aVerif := DbStruct()
// aInd := aDbfs[nConta][4]
Close DataBases
IF Len(aVerif) <> Len(aEstru)
cOldNome := cPath+aArq
cOldNome2 := cPath+aArq+".FPT"
cNovoNome := cPath+"TEMP"
cNovoNom2 := cPath+"TEMP"
cNovoNome2 := cPath+"TEMP.FPT"
Use (cOldNome) Alias (aArq) New Exclusive
Copy All to (cNovoNome)
Close (aArq)
Ferase(cOldNome+".dbf")
Ferase(cOldNome+".fpt")
DbCreate(cPath+aDbfs[nConta][1], aEstru)
Close Databases
Use (cPath+aArq) Alias (aArq) New Exclusive
Do While .T.
IF (aArq)->(Flock())
__dbApp(cNovoNome ,{ },,,,,.F.,"DBFCDX")
(aArq)->(DbUnlock())
Exit
Else
Loop
EndIF
EndDo
Close Databases
FErase(cNovoNome)
For nContaI = 1 To Len(aInd)
aIndex := aInd[nContaI][2]
aCampo := aInd[nContaI][1]
Use (cPath+aArq) Alias (aArq) New
If (aArq)->(Flock())
Ferase(cPati+aIndex+".cdx")
MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" )
EndIf
(aArq)->(DbUnlock())
Close (aArq)
Next
EndIf
ElseIf Modo = 3
aArq := aDbfs[nConta][1]
Use (cPath+aArq) Alias (aArq) EXCLUSIVE
IF NetErr()
Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede")
Return
EndIF
If (aArq)->(Flock())
Pack
EndIf
(aArq)->(Dbunlock())
Close (aArq)
aArq := aDbfs[nConta][1]
aEstru := aDbfs[nConta][2]
Use (cPath+aArq) Alias (aArq) New
aVerif := DbStruct()
aInd := aDbfs[nConta][4]
Close DataBases
IF Len(aVerif) <> Len(aEstru)
cOldNome := cPath+aArq+".DBF"
cOldNome2 := cPath+aArq+".FPT"
cNovoNome := cPath+"TEMP.DBF"
cNovoNome2 := cPath+"TEMP.FPT"
Frename(cOldNome, cNovoNome)
If File(cOldNome2)
Frename(cOldNome2, cNovoNome2)
EndIf
DbCreate(cPath+aDbfs[nConta][1], aEstru)
Close Databases
Use (cPath+aArq) Alias (aArq) New
Append From (cNovoNome)
Close Databases
FErase(cNovoNome)
aInd := aDbfs[nConta][4]
aIndex := aInd[nConta][2]
aCampo := aInd[nConta][1]
Use (cPath+aArq) Alias (aArq) New
If (aArq)->(Flock())
Ferase(cPati+aIndex+".cdx")
MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" )
EndIf
(aArq)->(DbUnlock())
Close (aArq)
EndIf
EndIf
aInd := aDbfs[nConta][4]
nContaI = 1
If Modo = 1
For nContaI = 1 to Len(aInd)
If !File(cPati+aInd[nContaI][2]+".cdx")
aIndex := aInd[nContaI][2]
aCampo := aInd[nContaI][1]
aArq := aDbfs[nConta][1]
Use (cPath+aArq) Alias (aArq) EXCLUSIVE
IF NetErr()
Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede")
Return
EndIF
If (aArq)->(Flock())
Ferase(cPati+aIndex+".cdx")
MsgMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" )
EndIf
(aArq)->(DbUnlock())
Close (aArq)
EndIf
Next
ElseiF Modo = 2 .Or. Modo = 3
For nContaI = 1 to Len(aInd)
aIndex := aInd[nContaI][2]
aCampo := aInd[nContaI][1]
aArq := aDbfs[nConta][1]
Use (cPath+aArq) Alias (aArq) EXCLUSIVE
IF NetErr()
Alert("Bancos de Dados Em Uso Por Outra Estação, Operação Abortada !", "Erro Em Rede")
Return
EndIF
If (aArq)->(Flock())
Ferase(cPati+aIndex+".cdx")
MeuMeter( { | oMeter, oText, oDlg, lEnd | BuildIndex( oMeter, oText, oDlg, @lEnd,aCampo,cPati,aIndex ) }, "Criando o Indice : "+aIndex+".cdx" )
EndIf
(aArq)->(DbUnlock())
Close (aArq)
Next
EndIf
Next
Return id=code>id=code>clipper 5.3d, fw 2.4 / xharb 0.99.70 simplex, fwh 7.05, Pellesc , Work , MySql