Função pra testar se campo existe

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

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função pra testar se campo existe

Mensagem por JoséQuintas »

Tem alguma função pronta no Harbour pra testar se campo existe?

Por enquanto criei esta:

Código: Selecionar todos

FUNCTION TemCampo( cCampo )

   LOCAL nCont

   FOR nCont = 1 TO FCount()
      IF FieldName( nCont ) == cCampo
         RETURN .T.
      ENDIF
   NEXT
   RETURN .F.
Motivo:
Estou acrescentando campos em arquivos, e estou deixando preparado pra funcionar com e sem o campo.
Só precaução, caso tenha que atualizar versão antes de modificar a estrutura.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Função pra testar se campo existe

Mensagem por fladimir »

Pronta não conheço, eu usava como vc depois refiz pra forma abaixo (outra opção)

Código: Selecionar todos

function TemCampo( cCampo )
return (fieldpos( cCampo ) != 0 )
[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função pra testar se campo existe

Mensagem por JoséQuintas »

Valeu.
Com FieldPos() acaba nem precisando de função extra.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
paiva_dbdc
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 12 Nov 2012 09:58
Localização: uberlandia mg

Função pra testar se campo existe

Mensagem por paiva_dbdc »

BOM dia
precisei semana pasada (rs)

if type("p_id_dav") = "U"
p_id_dav = [ ]
endif


o try tambem funciona


Paiva
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Função pra testar se campo existe

Mensagem por sambomb »

If aScan(DbStruct(),,{|X| x[1] = cCampo}) > 0
Imagem

Rca Sistemas - Itaocara - RJ
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Função pra testar se campo existe

Mensagem por porter »

ola pessoal, gostaria de saber, em qual momento voces fazem o teste se o campo existe, seria testar em todos os arquivos procurando todos os campos, ou somente no momento que vai gravar um campo do arquivo ?

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

Função pra testar se campo existe

Mensagem por alxsts »

Olá!
JoséQuintas escreveu:Motivo:
Estou acrescentando campos em arquivos, e estou deixando preparado pra funcionar com e sem o campo.
Em meu entendimento, este tratamento é aplicado apenas em rotinas que alteram estruturas de tabelas via programa. Seria um programa que verifica e atualiza versões de tabelas. Em situações normais de processamento, cada programa tem que, obrigatoriamente, conhecer as tabelas que lê e grava. Ficaria inviável ter que, antes de gravar qualquer campo, verificar se o mesmo existe.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Função pra testar se campo existe

Mensagem por asimoes »

Pode testar assim também:

Código: Selecionar todos

use tabela alias tabela shared new
aStruct:=tabela->(DbStruct())

nPosicao:=ASCAN(aStruct,{|AVAL|AVAL[1] == "CODIGO"})    
If  nPosicao > 0
   ? "Campo: " + aStruct[nPosicao,1]
Endif

* ou

If aScan(tabela ->(DbStruct()),{|x| x[1] = cCampo}) > 0
   MsgInfo("Tem o campo: " + cCampo)
Endif
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Função pra testar se campo existe

Mensagem por JoséQuintas »

Uso atualização automática no meu aplicativo.
Tudo que vou fazendo vou deixando na internet.
Atualiza tudo automático, EXE e estruturas se precisar.

Acontece que tenho outro aplicativo além desse.
O EXE também pode ser atualizado, mas as estruturas são atualizadas somente se solicitada a reindexação.
Vai que por algum motivo precise atualizar o EXE, a estrutura não vai coincidir com o programa.
Só precaução temporária.

Código: Selecionar todos

      IF TemCampo( "CRDATPAG" ); REPLACE corrente->crDatPag WITH Date(); ENDIF
Esse aplicativo continua me surpreendendo.
Pra mim, a coisa mais comum num arquivo que registra pagamentos, e é apresentado ao cliente, é a data do pagamento.
Como está há muitos anos sem isso, apenas deixei preparado.
Assim que foi feita a reindexação, já começou a registrar, sem precisar atualizar novamente.

Foi um jeito diferente que encontrei pra adiantar o serviço, sem precisar manter uma versão de espera, e sem correr o risco de liberar uma versão que poderia causar erro.

É um único cliente, com aplicativo exclusivo, então é temporário.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
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 pra testar se campo existe

Mensagem por rochinha »

Amiguinhos,

"Vivendo e aprendendo..."

Eu também tive muito trabalho no inicio pois todos os dias criava campo novo e o sistema já estava rodando. Fui criando o meu módulo de manutenção que logo ficou monstruoso. Fazia uma comparação prévia de uma tabela e marcava como para atualizar caso encontrasse diferenças em campos.

No caso do JoséQuintas ele levou em consideração somente a existência do campo. Mas pode ser que tenhamos de aumentar tamanho, decimais, etc.

E ai entra a atualização automática que deve fazer antes um backup dos dados antes de alterar, travar o sistema para evitar acesso enquanto o processo roda, fazer o append dos dados quando concluída a alteração e verificar se os registros foram recuperados com exito.

É coisa de louco.
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