Amiguinhos,
A pergunta foi direcionado ao Mestre Rochina, entretanto gostaria de compartilhar uma função:
Código: Selecionar todos
FUNCTION AtualizaDBF(nArquivo,nCampos)
//-----------------------------------------------------------------------------
// nArquivo -> Nome do arquivo DBF sem extensão
// nCampos -> Matriz com os campos a serem acrescentados
// Conteúdo da matriz: AADD(nCampos, {"ID-1","ID-2","ID-3","ID-4"})
// ID-1 -> Nome do campo para acrescentar no DBF. Usar letras maiúsculas
// ID-2 -> Tipo do campo
// ID-3 -> Tamanho do campo
// ID-4 -> Decimal
LOCAL aStru := {} // matriz com o conteúdo do banco de dados
LOCAL nMod := .F. // Verifica se precisa acrescentar ou modificar o campo
// Realiza um teste para certificar se o arquivo esta sendo usado.
ndbf:=FOPEN(nArquivo, 1 )
IF FERROR() <> 0
? "Arquivo aberto"
RETU .F.
ENDIF
FCLOSE(ndbf)
// Abre o arquivo
Use &nArquivo Exclusive New ALIAS OLDDBF
aStru := OLDDBF->( DbStruct() )
nPost:=1
do while nPost<=LEN(nCampos)
IF AScan( aStru,{|a| ALLTRIM(UPPER(a[1])) == nCampos[nPost,1] } ) = 0
AAdd( aStru, { nCampos[nPost,1],nCampos[nPost,2],nCampos[nPost,3],nPost[nPost,4] )
nMod:=.T.
ENDIF
// Se o campo já existir confere o tamanho.
nPOS:= AScan( aStru,{|a| ALLTRIM(UPPER(a[1])) == nCampos[nPost,1] } )
IF nPOS > O .and. aStru[nPos,3]#nCampos[nPost,3]
aStru[nPOS,3] := nCampos[nPost,3]
nMod:=.T.
ENDIF
nPost++
END
// Verifica se há modificação de novos campos ou alteração de tamanho.
if nMod
// Cria um novo arquivo com a extensao .TMP para que você possa conferir.
nNovoArq:=nArquivo+."TMP"
DbCreate(nNovoArq, aStru)
OldDbf->(DbCloseArea())
Use &nNovoArq Exclusive new ALIAS NovoDBF
Append from &nArquivo
NovoDBF->(DbCloseArea())
else
? "Nenhuma modificacao foi realizada"
end
retu
Observação: Não testei o código, mais qualquer coisa sinta-se á vontade para alterá-lo.
Saudações,
Júlio.