Página 1 de 1

Adicionar um campo em um arquivo dbf via sw.

Enviado: 02 Mar 2011 11:26
por locio
Tenho um arquivo dbf e quero adicionar um campo novo no arquivo.

Alguem pode me auxiliar

Locio

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

Enviado: 02 Mar 2011 13:04
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

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

Enviado: 02 Mar 2011 21:38
por marcos.gurupi
Perfeito Alexandre, mas como faria para verificar primeiro se o campo existe?

Marcos Roberto.

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

Enviado: 02 Mar 2011 22:20
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

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

Enviado: 02 Mar 2011 22:25
por marcos.gurupi
Show amigo. Obrigado!

Marcos Roberto.

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

Enviado: 02 Mar 2011 23:08
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().