Página 1 de 1
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 07 Jan 2013 19:08
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.
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 07 Jan 2013 20:31
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
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 07 Jan 2013 21:17
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.
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 07 Jan 2013 22:08
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.
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 08 Jan 2013 00:59
por rochinha
Amiguinhos,
Parabens, aos poucos vamos introduzindo mais recursos.
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 09 Jan 2013 23:14
por lucimauro
Tentei usar a funcao isfield() em harbour 3.0 mais foi encontrada!!
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 09 Jan 2013 23:26
por lucimauro
Desculpe foi falta de atenção,deu certo.
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 09 Jan 2013 23:47
por lugab
Rochinha e Jelias
Hoje eu aprendi mais um pouco, graças a vcs.
Obrigado
FUNÇÃO: IsField() retorna existência de campo na tabela
Enviado: 10 Jan 2013 00:45
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 )