Adicionar um campo em um arquivo dbf via sw.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

locio
Usuário Nível 2
Usuário Nível 2
Mensagens: 98
Registrado em: 27 Out 2006 14:21

Adicionar um campo em um arquivo dbf via sw.

Mensagem por locio »

Tenho um arquivo dbf e quero adicionar um campo novo no arquivo.

Alguem pode me auxiliar

Locio
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Adicionar um campo em um arquivo dbf via sw.

Mensagem por alxsts »

Olá!

Não testei...

Código: Selecionar todos

Function Main()

   LOCAL aStru
   
   Use OldDbf Exclusive New
   
   aStru := OldDbf->( DbStruct() )
   
   AAdd( aStru, { "NovoCampo", "C", 10, 0 } )
   
   DbCreate( "NewDbf", aStru )
   
   OldDbf->( DbCloseArea() )
   
   Use NewDbf Exclusive new
   
   Append from OldDbf
   
   NewDbf->( DbCloseArea() )
   
   Return NIL
[]´s
Alexandre Santos (AlxSts)
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Adicionar um campo em um arquivo dbf via sw.

Mensagem por marcos.gurupi »

Perfeito Alexandre, mas como faria para verificar primeiro se o campo existe?

Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Adicionar um campo em um arquivo dbf via sw.

Mensagem por sygecom »

Olá Marcos.
Acrescentei ao código do Alexandre, exemplo abaixo:

Código: Selecionar todos

Function Main()

 LOCAL aStru

 Use OldDbf Exclusive New

 aStru := OldDbf->( DbStruct() )

 // ADICIONANDO CAMPO
 IF AScan( aStru,{|a| UPPER(a[1]) == "NOVOCAMPO" } ) = 0 // se não achar ele acresenta
    AAdd( aStru, { "NOVOCAMPO", "C", 10, 0 } )
 ENDIF

 // ALTERANDO CAMPO EXISTENTE
 nPOS:= AScan( aStru,{|a| UPPER(a[1]) == "NOMECAMPO" } )
 IF nPOS > O
    aStru[nPOS,3] := 20  // AUMENTOU O TAMANHO
 ENDIF

 DbCreate( "NewDbf", aStru )

 OldDbf->( DbCloseArea() )

 Use NewDbf Exclusive new

 Append from OldDbf

 NewDbf->( DbCloseArea() )

 Return NIL
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Re: Adicionar um campo em um arquivo dbf via sw.

Mensagem por marcos.gurupi »

Show amigo. Obrigado!

Marcos Roberto.
Marcos Roberto
NetService Software
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Adicionar um campo em um arquivo dbf via sw.

Mensagem por alxsts »

Olá!

Ótima intervenção Leo!

Para ficar perfeito e mais claro, só mesmo acrescentando informações do arquivo de cabeçalho DBStruct.ch:

Código: Selecionar todos

#ifndef _DBSTRUCT_CH
#define _DBSTRUCT_CH

/* Positions for field structure array */
#define DBS_NAME        1
#define DBS_TYPE        2
#define DBS_LEN         3
#define DBS_DEC         4

/* Length of the field structure array */
#define DBS_ALEN        4

#endif /* _DBSTRUCT_CH */
Ficaria assim:

Código: Selecionar todos

#include  "dbstruct.ch"
Function Main()

 LOCAL aStru

 Use OldDbf Exclusive New

 aStru := OldDbf->( DbStruct() )

 // ADICIONANDO CAMPO
 IF AScan( aStru,{|a| UPPER(a[DBS_NAME]) == "NOVOCAMPO" } ) = 0 // se não achar ele acresenta
    AAdd( aStru, { "NOVOCAMPO", "C", 10, 0 } )
 ENDIF

 // ALTERANDO CAMPO EXISTENTE
 nPOS:= AScan( aStru,{|a| UPPER(a[DBS_NAME]) == "NOMECAMPO" } )
 IF nPOS > O
    aStru[nPOS,DBS_LEN] := 20  // AUMENTOU O TAMANHO
 ENDIF

 DbCreate( "NewDbf", aStru )

 OldDbf->( DbCloseArea() )

 Use NewDbf Exclusive new

 Append from OldDbf

 NewDbf->( DbCloseArea() )

 Return NIL
Como informação adicional, pode-se inserir um campo entre outros dois através da função AIns().
[]´s
Alexandre Santos (AlxSts)
Responder