nil Posted February 9, 2010 Report Share Posted February 9, 2010 toda vez que atualizo o programa em um cliente tenho que verificar os dbfs para ter certeza que nao acrescetei novos campos nos dbfs, alguem tem a funcao que atualiza a estrutura. obrigado, Nilson Quote Link to comment Share on other sites More sharing options...
nil Posted February 9, 2010 Author Report Share Posted February 9, 2010 toda vez que atualizo o programa em um cliente tenho que verificar os dbfs para ter certeza que nao acrescetei novos campos nos dbfs, alguem tem a funcao que atualiza a estrutura. obrigado, Nilson Quote Link to comment Share on other sites More sharing options...
gvc Posted February 9, 2010 Report Share Posted February 9, 2010 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. Quote Link to comment Share on other sites More sharing options...
nil Posted February 11, 2010 Author Report Share Posted February 11, 2010 consegui atraves do exemplo no dbu da seguinte forma RENAME gercli.dbf TO gercli.old * crio o novo GERCLI.DBF VAZIO USE gercli.old COPY TO ddbbuuuu.txt SDF USE gercli.dbf APPEND FROM ddbbuuuu.txt SDF ERASE ddbbuuuu.txt Quote Link to comment Share on other sites More sharing options...
gvc Posted February 11, 2010 Report Share Posted February 11, 2010 Veja que vc não esta comparando para saber se as estruturas são diferentes. Eu não costumo exportar a tabela como texto para importar depois. * crio o novo GERCLI.DBF VAZIO USE gercli.dbf APPEND FROM gercli.oldid=code>id=code> Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted February 11, 2010 Report Share Posted February 11, 2010 //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 Quote Link to comment Share on other sites More sharing options...
dablys Posted February 12, 2010 Report Share Posted February 12, 2010 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 Quote Link to comment Share on other sites More sharing options...
Luiz Arruda (ICO) Posted February 12, 2010 Report Share Posted February 12, 2010 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 endifid=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 Quote Link to comment Share on other sites More sharing options...
nil Posted February 12, 2010 Author Report Share Posted February 12, 2010 VALEU GALERA FICOU 100%, OBRIGADO A TODOS Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.