Jump to content
Fivewin Brasil

atualizar estrutura do arquivo dbf automatico


nil

Recommended Posts

Vc terá que colocar em algum lugar (hardcode ou dbf) a estrutura que vc quer usar (a que esta valendo).

Use o DBStruct para pegar a estrutura atual do arquivo. A função retorna um array com todos os dados necessários para compar o atual do cliente com o que vc tem como válido.

Se houver alguma diferença, vc pode fechar e renomear o antigo, criar a nova estrutura e importar os dados.

Só deve ter cuidado com mudançca de tipos. Isso dá problemas no append de arquivo.

Link to comment
Share on other sites

//AQUI VC PEGA O TAMANHO CORRETO

aVET := DBF_TABXXX() //SEM PARAMETROS

nTOT := 0

FOR nCT:=1 TO LEN(aVET)

nTOT := nTOT + aVET[nCT,3] //totaliza o tamanho dos campos

NEXT

//tamanho do dbf

//verifica o tamanho do arquivo do cliente

USE FILE

aVET := FILE->(DBSTRUCT())

FILE->(DBCLOSEAREA())

nDBF := 0

FOR nCT:=1 TO LEN(aVET)

nDBF := nDBF + aVET[nCT,3] //tamanho do campo

NEXT

IF nDBF != nTOT

//SE FOR DIFERENTE ATUALIZA A ESTRUTURA

ENDIF

RETURN(NIL)

**----------------------------------------------------------------------

FUNCTION DBF_TABXXX(cDIR)

** cDIR diretorio

**----------------------------------------------------------------------

LOCAL aVET:={}

AADD(aVET,{"NOME" ,"C", 25, 00})

AADD(aVET,{"CODIGO" ,"C", 05, 00})

AADD(aVET,{"FILTRO" ,"C", 01, 00})

//verificar estrutura de arquivo

IF PCOUNT() == 0 ; RETURN(aVET) ; ENDIF

DBCREATE(cDIR+"TABXXX",aVET)

RETURN NIL

Link to comment
Share on other sites

Oi rapazeada bacana do Five,

tenho uma rotina legalzinha para fazer essas atualizações de DBF automaticamente. Ela tem 2 etapas... uma que fica por fora em um pequeno executável que lê e grava todas as estruturas dos arquivos DBF em um diretório corrente para dentro de um arquivo chamado ARQUIVO.ARQ

Em uma segunda etapa, uma função de tratamento é acionada de dentro de seu aplicativo principal toda vez que encontrar a presença do ARQUIVO.ARQ no diretório, e finalmente, atualizar as estruturas de todos os arquivos DBF automaticamente.

Código do aplicativo EXE externo gerador do ARQUIVO.ARQ :

=========================================================

*****************************************

* Utilitário leitor de Estruturas DBF:

* Atualização: 21/02/2000

* Programador: Dablys Duarte Andrade

* Contato : dablysandrade@yahoo.com.br

* Governador valadares - MG

* (33)32755824

*****************************************

Declare aArq[Adir('*.dbf')]

FErase('teste.db*')

Adir('*.dbf',aArq)

cls

If Len(aArq) = 0

alert('Sem arquivo de dados (.DBF) no diret¢rio do Sistema...')

clear

Quit

EndIf

aEstru:= {}

If File('Arquivo.Arq')

FErase('Arquivo.Arq')

EndIf

DbCreate('Arquivo.Arq',{{"NOME","C",08,0},{"CAMPO", "C" ,10,0},;

{"TIPO", "C" , 1,0},{"TAMANHO","C" , 4,0},;

{"DECIMAL","C" , 3,0}})

If ! File('Arquivo.Arq')

alert('Arquivo de Atualiza‡„o (ARQUIVO.ARQ) n„o pode ser criado...')

clear

Quit

endif

Asort(aArq)

sele 1

DbUseArea(1,,"Arquivo.Arq","xArq",.F.)

set color to W+/B

clear

@ 08,10 say 'Atualizador de BANCO de dados: '

SET COLOR TO B+/w

@ 10,10 clear to 16,70

@ 10,10 to 16,70 double

* @ 14,15 Say Repl("Û",50) Color "Wr+/w"

For I:= 1 To Len(aArq)

If (aArq) = Nil

Loop

EndIf

sele 2

DbUseArea(2,,(aArq),'Area',.F.)

aEstru:= Area->(DbStruct())

@ 12,15 say 'Verificando estrutura do arquivo : '

@ 12,50 say aarq+space(05)

@ 14,15 Say 'Concluindo -> ' + trans(I/Len(aArq)*100,'@r 9999999.99%')

For J:= 1 To Len(aEstru)

xArq->(DbAppend())

xArq->(DbRLock())

xArq->NOME := Left(aArq,At('.',aArq)-1)

xArq->Campo := aEstru[J,1]

xArq->Tipo := aEstru[J,2]

xArq->Tamanho := StrZero(aEstru[J,3],4)

xArq->Decimal := StrZero(aEstru[J,4],3)

xArq->(DbRUnLock())

xArq->(DbCommit())

Next

Area->(DbCloseArea())

Next

DbCloseAll()

set color to

clear

quit

Segunda ETAPA (Funcao que atualiza as Estruturas dos DBF):

==========================================================

***************************************************

* Funcao : ATUALIZA()

* Realiza a atualização das estruturas dos

* arquivos DBF presentes em ARQUIVO.ARQ

* automaticamente

* Programador : Dablys Duarte Andrade (01/01/2010)

***************************************************

function Atualiza()

Local cTela:= SaveScreen(0,0,24,79)

If ! File("Arquivo.arq")

Tone(999)

Return .t.

EndIf

close databases

set scoreboard off

set date brit

set color to W+/B

clear

FErase('Teste.dbf')

FErase('Teste.dbt')

Set Cursor Off

DbUseArea(.T.,,"Arquivo.arq","Arquivo")

If neterr()

apaga('Arquivo de Atualiza‡„o ARQUIVO.ARQ n„o acess¡vel! Contate Suporte...',.T.)

Inkey(3)

clear

clear all

close all

quit

EndIf

go top

NomeArq := Arquivo->Nome

NomeArq2 := {}

NomeCampo := {}

nAchou := {}

LAchou := .F.

Registro := LastRec()

SetColor("b/w")

@ 10,14 Clear To 16,65

DispBox(10,14,16,65)

@ 13,15 Say Repl("Û",50) Color "Wr+/w"

@ 11,22 Say "Carregando e Atualizando o Sistema ..."

Do While ! Arquivo->(Eof())

@ 13,15 Say Repl("Û",((Arquivo->(Recno())/Registro)*100)/2)

@ 14,36 Say AllTrim(Str((Arquivo->(Recno())/Registro)*100))+"%"

If NomeArq # Arquivo->Nome

Transfere()

EndIf

AADD(NomeCampo,{Arquivo->Campo,Arquivo->Tipo,Val(Arquivo->Tamanho),Val(Arquivo->Decimal)})

Arquivo->(DbSkip())

Enddo

Transfere()

DbCloseAll()

FErase("Arquivo.arq")

Set Color To

Set Cursor On

RestScreen(0,0,24,79,cTela)

FErase('Teste.*')

DbCloseAll()

Return .T.

Static Function Transfere()

Local T

@ 15,18 Say " "

@ 15,18 Say "Arquivo : " + NomeArq

If ! File(Alltrim(NomeArq)+".DBF")

DbCreate(NomeArq,NomeCampo)

Else

DbUseArea(.T.,,Alltrim(NomeArq),"Arq2")

If (! Neterr())

NomeAtua := DbStruct()

For i := 1 To Len(NomeCampo)

If Type("Arq2->"+NomeCampo[i,1]) = "U"

AADD(nAchou,i)

Exit

Else

For t := 1 To Len(NomeAtua)

If AllTrim(NomeAtua[t,1]) = AllTrim(NomeCampo[i,1])

If AllTrim(NomeAtua[t,2]) # AllTrim(NomeCampo[i,2])

AADD(nAchou,i)

Exit

EndIf

If NomeAtua[t,3] # NomeCampo[i,3] .Or.;

NomeAtua[t,4] # NomeCampo[i,4]

AADD(nAchou,i)

Exit

EndIf

EndIf

Next

EndIf

If Len(nAchou) # 0

Exit

EndIf

Next

Arq2->(DbCloseArea())

If Len(nAchou) # 0

DbCreate("TESTE",NomeCampo)

DbUseArea(.T.,,"TESTE","Arq2")

If (! neterr())

Append From &(NomeArq+".Dbf")

DbCommitAll()

nAchou := {}

Arq2->(DbCloseArea())

Copy File &("TESTE.DbF") To &(NomeArq+".DbF")

If File("TESTE.DBT")

Copy File &("TESTE.DbT") To &(NomeArq+".DbT")

EndIf

EndIf

FErase("TESTE.DBF")

FErase("TESTE.DBT")

EndIf

EndIf

EndIf

NomeArq := Arquivo->Nome

NomeCampo := {}

Return .t.

Clipper 5.3 - Exospace - Blinker 7 - Fivewin - xHarbour

Programador: Dablys Duarte Andrade

Governador Valadares - MG

email: dablysandrade@yahoo.com.br

msn: lucklogan@msn.com

Editado por - dablys on 12/02/2010 09:51:17

Editado por - dablys on 12/02/2010 09:54:31

Editado por - dablys on 12/02/2010 09:55:53

Link to comment
Share on other sites

Eu Faço Assim funcina 100%


Select 1

Use SeuDBF

xVerStru := DBSTRUCT()

Close SeuDbf

If .Not. xStru("CAMPONOVO",xVerStru) // Verifica se existe o novo campo

If MsgYesNo("A tebela Precisa ser Alterada"+CRLF+"Deseja fazer isso Agora","..::Tabelas")

fRename("SeuDBF.dbf", "SeuDbf.250" ) // Renomeia o .DBF para .250

aestru:={}

Aadd(aestru, {"NovoCampo", "C", 002,000 })

Aadd(aestru, {"CampoVelho1, "C", 016,000 })

Aadd(aestru, {"CampoVelho2", "N", 006,003 })

Aadd(aestru, {"CampoVelho3", "C", 030,000 })

Aadd(aestru, {"OutrosCampos", "C", 030,000 }) Outros Campos que por Ventura estão ligados ao novo DBF

DbCreate("SeuNovoDBF.DBF", aestru) // cria o Novo arquivo.

Close Data

Use SeuNovoDBF

Append From SeuDBF.250

endif

id=code>id=code>

/*

Eu Deixo isso aqui na Window Principal pq. posso alterar a

estrutura em qq Modulo e em qq DBF chamando xStru()

*/


Function xStru(NCAMPO,aESTRUCT)

FOR S = 1 TO LEN(aESTRUCT)

IF aESTRUCT[s,1] == NCAMPO

RETURN(.T.)

ENDIF

NEXT

RETURN(.F.)

id=code>id=code>

Espero que ajude...

Abraços..

Luiz Arruda - Corumba(MS)

FiveWin 904

[x]Harbour

xDev

WS

ico.corumba@gmail.com

-

NÃO ABANDONE SEU TÓPICOid=blue>

Editado por - ico on 12/02/2010 10:32:35

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...