FUNÇÃO: IsField() retorna existência de campo na tabela

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por rochinha »

Amiguinhos.

Tava pesquisando nos comandos do Clipper a existência de comando com intuito de verificar se um campo existe em uma tabela e encontrei o seguinte:

Código: Selecionar todos

Function IsField( cField ) 
  Return( fieldpos( cField ) != 0 ) 
Uso:

Código: Selecionar todos

function Filiais()
   ...
   USE clientes SHARED NEW
   if ! IsField( "SENHA" ) 
       ? "Campo SENHA não existe na estrutura. Fazer backup, Recriar tabela."
   endif
O intuito é auxiliar nas manutenções de bancos de dados, já que não uso nenhum esquema de dicionário, quando crio algum campo novo tenho de fazer backup das tabelas que sofreram alteração, recriar e recuperar os dados.

O problema é que ao aumentar o numero de clientes este tipo de trabalho toma muito tempo.

Para isto entra em cena rotinas de manutenção automática. Mas isto é história para outro post.

Bom trabalho.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por lugab »

Rochinha,

E constatada a inexistência do campo no DBF, pode-se criá-lo durante a execução do programa ?

Se sim, seria através da função Dbcreate() ? Como seria ?

Eu só uso a DbCereate() para criar um DBF inteiro e não sei com usá-lo para apenas adicionar novos campos em um DBF já existente.

Grato,

Gabriel
lugab
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por rochinha »

Amiguinho,

Use algo assim:

Código: Selecionar todos

         USE original EXCLUSIVE             // Abre o arquivo atual 
         COPY TO TEMP                         // Copia dados para arquivo TEMPorario
         USE                                          // Fecha-o
         DBCREATE( "novo", aSTRUCT )  // Cria nova estrutura baseada em vetor com dados dos campos
         USE novo EXCLUSIVE                 // Abre nova estrutura exclusivamente
         APPEND FROM TEMP                 // Adiciona os registros antigos
Em aSTRUCT estará contida a estrutura com campos atualizados.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por jelias »

Amiguinhos,

A pergunta foi direcionado ao Mestre Rochina, entretanto gostaria de compartilhar uma função:

Código: Selecionar todos

FUNCTION AtualizaDBF(nArquivo,nCampos)
//-----------------------------------------------------------------------------
// nArquivo      -> Nome do arquivo DBF sem extensão 
// nCampos       -> Matriz com os campos a serem acrescentados
//                  Conteúdo da matriz: AADD(nCampos, {"ID-1","ID-2","ID-3","ID-4"})
//                  ID-1 -> Nome do campo para acrescentar no DBF. Usar letras maiúsculas
//                  ID-2 -> Tipo do campo 
//                  ID-3 -> Tamanho do campo
//                  ID-4 -> Decimal
LOCAL aStru := {}   // matriz com o conteúdo do banco de dados     
LOCAL nMod  := .F.  // Verifica se precisa acrescentar ou modificar o campo
// Realiza um teste para certificar se o arquivo esta sendo usado.
ndbf:=FOPEN(nArquivo, 1 )
IF FERROR() <> 0
   ? "Arquivo aberto"
   RETU .F.
ENDIF
FCLOSE(ndbf)
// Abre o arquivo 
Use &nArquivo Exclusive New  ALIAS OLDDBF
aStru := OLDDBF->( DbStruct() )
nPost:=1	 
do while nPost<=LEN(nCampos) 
   IF AScan( aStru,{|a| ALLTRIM(UPPER(a[1])) == nCampos[nPost,1] } ) = 0 
      AAdd( aStru, { nCampos[nPost,1],nCampos[nPost,2],nCampos[nPost,3],nPost[nPost,4] )
      nMod:=.T.
   ENDIF
   // Se o campo já existir confere o tamanho.
   nPOS:= AScan( aStru,{|a| ALLTRIM(UPPER(a[1])) == nCampos[nPost,1] } )
   IF nPOS > O .and. aStru[nPos,3]#nCampos[nPost,3]
      aStru[nPOS,3] := nCampos[nPost,3]
      nMod:=.T.
   ENDIF
   nPost++
END
// Verifica se há modificação de novos campos ou alteração de tamanho.
if nMod
   // Cria um novo arquivo com a extensao .TMP para que você possa conferir.
   nNovoArq:=nArquivo+."TMP"
   DbCreate(nNovoArq, aStru)
   OldDbf->(DbCloseArea())
   Use &nNovoArq Exclusive new ALIAS NovoDBF
   Append from &nArquivo
   NovoDBF->(DbCloseArea())
else 
   ? "Nenhuma modificacao foi realizada"
end
retu
Observação: Não testei o código, mais qualquer coisa sinta-se á vontade para alterá-lo.

Saudações,
Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por rochinha »

Amiguinhos,

Parabens, aos poucos vamos introduzindo mais recursos.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por lucimauro »

Tentei usar a funcao isfield() em harbour 3.0 mais foi encontrada!!
lucimauro
Usuário Nível 3
Usuário Nível 3
Mensagens: 465
Registrado em: 21 Set 2004 21:02
Localização: Sobral-CE

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por lucimauro »

Desculpe foi falta de atenção,deu certo.
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por lugab »

Rochinha e Jelias

Hoje eu aprendi mais um pouco, graças a vcs.

Obrigado
lugab
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

FUNÇÃO: IsField() retorna existência de campo na tabela

Mensagem por rochinha »

Amiguinhos,

A função IsField() não existe como padrão no mundo Harbour, pode até existir algo em algum biblioteca, estilo CT.lib(mas não sei). Acrescente a função que esta disponibilizada no inicio do tópico aos seus códigos.

Vejam um exemplo de no código e descubram onde poderia acontecer um erro de runtime:

Código: Selecionar todos


#command REPLACE <f1> WITH <v1> ;
      => if IsField( <(f1)> ); _FIELD-><f1> := <v1> ; endif

function main()
   if !file("usuario.dbf")
      aStru := { { "idusuario" , "N", 3, 0 } , ;
                 { "usuario"   , "C",20, 0 } , ;
                 { "senha"     , "C",10, 0 } }
                 dbCreate( "usuario", aStru )
   endif
   USE usuario SHARED NEW
       IF RECCO() = 0
          APPEND BLANK
       ELSE
          RLOCK()
       ENDIF
       REPLACE idusuario  WITH 1
       REPLACE usuario    WITH "JUCACHAVES"
       REPLACE senha      WITH "X@12$"
       REPLACE TERMINAL   WITH "TERMINAL1"
       COMMIT
   BROWSE()
   USE
   return .t.

Function IsField( cField )
   return( fieldpos( cField ) != 0 )
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder