Página 1 de 1

Adicionar novos compos no DBFs

Enviado: 14 Mar 2006 11:26
por marbio
Ola, turma,

TEm como montar um rotina para adcionar novos compos em dbfs, sem perder as informacoes.


t+

Enviado: 14 Mar 2006 13:12
por jpalma
Informe seu email que lhe envio a rotina.


sds

dbs

Enviado: 14 Mar 2006 14:07
por Josmar dos Santos
Ola Marbio...blz ?
Gostria de fazer um comentário ...
Na minha concepção, não seria mais seguro criar esses campos na própria DBU ?....
Um abraço..
Josmar

Enviado: 14 Mar 2006 18:06
por marbio
Ola,


1º) Eu uso o DBU, para fazer isso com os meus cliente, quando eu vou, mas quanto eu mando a atualizacao, nao tem geito certo.


meu amigo eu agradeco a sua rotina

o meu e-mail e: marbio@netsulminas.com.br


ficarei muito grato
t+

Enviado: 14 Mar 2006 19:02
por Tim9
Vou ficar sem saber como se faz isso de uma maneira fácil. Que pena...

Mas posso sugerir aos moderadores para disponibilizr esta rotina na secção de downloads, pois acredito ser de grande interesse geral.

Ou estou enganado?

at+
:(

Enviado: 14 Mar 2006 19:53
por janio
Tim9 escreveu:Vou ficar sem saber como se faz isso de uma maneira fácil. Que pena...
Tim9,

Eu faço da maneira abaixo e funciona que é uma beleza!

No passado precisei exatamente de uma rotina dessas e um amigo postou aqui no fórum a solução. O processo é o seguinte: Vc cria o NOVO arquivo com a NOVA estrutura e depois copia os dados do arquivo ANTIGO pro NOVO, veja:

Código: Selecionar todos

aCampos2 := {} 
aAdd( aCampos2 , { "NUMCXA" , "N" ,  1 , 0 } )
aAdd( aCampos2 , { "DESCRI" , "C" ,  10, 0 } )
aAdd( aCampos2 , { "STSCXA" , "C" ,  1 , 0 } )
aAdd( aCampos2 , { "FLGAUT" , "C" ,  1 , 0 } )
aAdd( aCampos2 , { "DATCXA" , "D" ,  8 , 0 } )
aAdd( aCampos2 , { "OPECXA" , "C" ,  3 , 0 } )
aAdd( aCampos2 , { "SLDCXA" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "SLDDIN" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "SLDCHQ" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "SLDVAL" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "CXAANT" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "DINANT" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "CHQANT" , "N" ,  13, 2 } )
aAdd( aCampos2 , { "VALANT" , "N" ,  13, 2 } )

dbCreate( "A07CXA.TMP" , aCampos2 , "DBFCDX" )  // crio arquivo com extenção TMP

DBCLOSEALL() // fecho todos arquivos
USE A07CXA.TMP // abro arquivo com NOVA estrutura
APPEND FROM A07CXA.DBF // copio dados do ANTIGO arquivo
USE // fecho banco de dados
FERASE("A07CXA.DBF") // apago arquivo ANTIGO
FERASE("A07CXA.CDX") // apago indice tbem
FRENAME("A07CXA.TMP", "A07CXA.DBF") // renomeio o novo para DBF

USE A07CXA EXCLUSIVE  // recrio as chaves de indices
PACK
INDEX ON NUMCXA TAG CHAVE1 TO A07CXA
INDEX ON DESCRI TAG CHAVE2 TO A07CXA
USE
Janio

Enviado: 14 Mar 2006 21:04
por jpalma
Segue rotina.


********************************
// ALTERAR ESTRUTURA ARQUIVO
********************************

PROCEDURE ALT_ESTRU()

#include "directry.ch"
#include "dbstruct.ch"
//#include "inkey.ch"

//#define true .t.
//#define false .f.

LOCAL TELA1 := SAVESCREEN(01,00,24,79)
local diretorio:=directory("*.dbf","D"),;
arquivos:={},;
campos:={},;
contador

for contador = 1 to len(diretorio)
aadd(arquivos,diretorio[contador,1])
next contador

WHILE .T.
ThreeD_Bord(03,00,23,79,2,JANAZ,"B",.F.,' ALTERAR ESTRUTURA DE ARQUIVO ',PRINCIP)

SETCOLOR(PRINCIP)
MENSAGEMI('<ESC> Desistir ou <ENTER> Selecionar Arquivo',24)
SETCOLOR(JANAZ)
@ 05,10 say "A R Q U I V O"; @ 06,10 say replicate('-',13)
//asort(arquivos)
option := achoice(07,10,20,22,arquivos) //diretorio[F_NAME])
if lastkey() == K_ESC; setcursor(0); exit; endif
if lastkey() == K_ENTER
use (diretorio[option,1]) new alias table
estrutura := table->(DbStruct())
for contador := 1 to len(estrutura)
aadd(campos,estrutura[contador,1]+space(10-len(estrutura[contador,1]))+" | "+estrutura[contador,2]+" | "+strzero(estrutura[contador,3],4)+" | "+strzero(estrutura[contador,4],2))
next contador

SETCOLOR(PRINCIP)
MENSAGEMI('<ESC> Desistir ou <ENTER> Informar Dados',24)
SETCOLOR(JANAZ)
@ 05,40 say "ESTRUTURA DO ARQUIVO"; @ 06,40 say replicate('-',26)
option1 := achoice(07,40,15,65,campos)
if lastkey() == K_ENTER
while .t.
setcursor(1)
xname := space(10)
xtype := space(1)
xleng := xdeci:=0
@ 17,40 say "Nome do novo campo :" get xname picture "@!" valid !empty(xname)
@ 18,40 say "Tipo do campo :" get xtype picture "!" valid xtype$"CNDLM"
@ 19,40 say "Tamanho do campo :" get xleng picture "999" valid xleng > 0
@ 20,40 say "Casas decimais :" get xdeci picture "99" when xtype == 'N'
read
if lastkey() == K_ESC; setcursor(0); exit; endif
setcursor(0)
if alert("*** ATENCAO ***;Deseja realmente criar o novo campo",{"Sim","Nao"})=1
atual:=len(estrutura)
aadd(estrutura,{alltrim(xname),xtype,xleng,xdeci})
DbCreate("tmp.dbf",estrutura)
use tmp.dbf new alias tmp
table->(DbGoTop())
c_c:=0
While table->(!eof())
tmp->(DbAppend())
for contador:=1 to table->(FCount())
tmp->(FieldPut(contador,table->(FieldGet(contador))))
next contador
tmp->(DbCommit())
c_c++
table->(DbSkip(1))
@ 24,00 say padc(c_c,80)
end
DbCloseAll()
Delete File (diretorio[option,1])
Rename TMP.DBF TO (diretorio[option,1])
else
select('table'); use
endif
end
// select('table'); use
else
select('table'); use
endif
endif
end

RESTSCREEN(01,00,24,79,TELA1)
RETURN NIL

Enviado: 15 Mar 2006 11:16
por Tim9
Olá Jpalma e Janio!

Agora sim, vou saber como fazer, de maneira fácil.

Obrigado.
Vcs foram brilhantes ao postarem aqui rotina de tamanho interesse público.

Realmente, este é o melhor forum sobre o velho e querido Clipper!!
:))

Enviado: 20 Mar 2006 10:33
por marbio
Bom dia galera..............



Nao tive tempo de dar uma olha neste final de semana porque estava no litoral de SP.

Muito obrigado pela ajuda.


t+





:* -:] :xau :D :))