Adicionar novos compos no DBFs

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
marbio
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 29 Jul 2004 16:26

Adicionar novos compos no DBFs

Mensagem por marbio »

Ola, turma,

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


t+
Sempre há uma solucao para os nossos problema clipper.....
jpalma
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 18 Ago 2003 14:15

Mensagem por jpalma »

Informe seu email que lhe envio a rotina.


sds
Josmar dos Santos
Usuário Nível 3
Usuário Nível 3
Mensagens: 277
Registrado em: 11 Jan 2006 18:36
Localização: Botucatu-SP

dbs

Mensagem 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
Avatar do usuário
marbio
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 29 Jul 2004 16:26

Mensagem 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+
Sempre há uma solucao para os nossos problema clipper.....
Avatar do usuário
Tim9
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 14 Ago 2003 15:18
Localização: Ribeirão Preto
Contato:

Mensagem 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+
:(
Até Breve!
Luz e Paz!
Tim9
------------------------------------------
olynthes@gmail.com
** Somos livres para escolher, mas prisioneiros das conseqüências **
------------------------------------------
Uso Clipper 5.2e, Blinker 7.0, Prwin 1.0 BFNTX migrando p/ xHarbour e Hwgui Dbfcdx
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Mensagem 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
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
jpalma
Usuário Nível 3
Usuário Nível 3
Mensagens: 153
Registrado em: 18 Ago 2003 14:15

Mensagem 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
Avatar do usuário
Tim9
Usuário Nível 3
Usuário Nível 3
Mensagens: 154
Registrado em: 14 Ago 2003 15:18
Localização: Ribeirão Preto
Contato:

Mensagem 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!!
:))
Até Breve!
Luz e Paz!
Tim9
------------------------------------------
olynthes@gmail.com
** Somos livres para escolher, mas prisioneiros das conseqüências **
------------------------------------------
Uso Clipper 5.2e, Blinker 7.0, Prwin 1.0 BFNTX migrando p/ xHarbour e Hwgui Dbfcdx
Avatar do usuário
marbio
Usuário Nível 3
Usuário Nível 3
Mensagens: 206
Registrado em: 29 Jul 2004 16:26

Mensagem 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 :))
Sempre há uma solucao para os nossos problema clipper.....
Responder