Clipper On Line • Ver Tópico - Nome dos campos como Variaveis

Nome dos campos como Variaveis

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Nome dos campos como Variaveis

Mensagempor lugab » 18 Abr 2018 17:44

Pessoal, bom dia...

1) eu queria criar variáveis (k+nome-campo)a partir dos nomes dos campos de um DBF (que eu não sei quais são)
Ex:campos do Arquivo ....: Nome, Quant, Valor, Texto, cidade, etc
Variáveis a serem criadas : Knome, Kquant, Kvalor, Ktexto,kcidade

2) Depois eu queria digitar dados nessas variaveis
@ lin(),col() Get Knome


3) por ultimo, mandar gravar
Repl Nome with knome


Se for possivel, me digam como fazer...

Valeu
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Nome dos campos como Variaveis

Mensagempor JoséQuintas » 18 Abr 2018 18:38

Independente da linguagem, melhor fazer um a um mesmo.

Mas... Clipper mesmo?
Vai precisar testar:

pegar nomes dos campos:
aCampos := dbStruct()


Criar variáveis:

#include "dbstruct.ch"
FOR nCont =1  TO Len( aCampos )
   &( "m" + aCampos[ nCont, F_NAME ] ) := FieldGet( nCont )
NEXT

// ou

FOR nCont = 1 TO Len( aCampos )
   &( "m" + aCampos[ nCont, F_NAME ] ) := &( aCampos[ nCont, F_NAME ] )


Digitar:
@ 2, 0 SAY ""
FOR nCont = 1 TO Len( aCampos )
   @ Row() + 1, 0 SAY Pad( aCampos[ nCont, F_NAME ], 10 ) + ":" ;
   GET &( "m" + aCampos[ nCont, F_NAME ] )
NEXT
READ


Gravar:
FOR nCont = 1 TO Len( aCampos )
   FieldPut( nCont, &( "m" + aCampos[ nCont, F_NAME ] ) )
NEXT

// ou

FOR nCont = 1 TO Len( aCampos )
   REPLACE &( aCampos[ nCont, F_NAME ] ) WITH &( "m" + aCampos[ nCont, F_NAME ] )
NEXT


Mas repetindo: o ideal é digitar cada nome, pra não complicar em VALID e outras coisas mais.

Aonde não aceitar o &( ... ), a saída vai ser criar variável temporária.
xCampo := "m" + aCampos[ nCont, F_NAME ]
@ 2, 2 GET &xCampo PICTURE "9999.99" VALID &xCampo > 10


Se fosse Harbour seria mais fácil, poderia usar array e FOR EACH...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome dos campos como Variaveis

Mensagempor JoséQuintas » 18 Abr 2018 18:41

Só repetindo: eu acho muito ruim fazer desse jeito.
O problema é que não vai saber qual fonte usa o que, na hora de pesquisar, e nem mesmo os nomes dos campos que estão em uso.
Uso só em exceções mesmo.

Vai economizar pra fazer o fonte, mas depois vai perder muito tempo pra fazer manutenção.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18008
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome dos campos como Variaveis

Mensagempor Toledo » 18 Abr 2018 18:44

Outro exemplo. Faça o seguinte... abra o arquivo DBF e depois este código para criar as variáveis:

lin:=5
col:=10
FOR i=1 TO FCOU()
   msg=FIEL(i)
   cVar:="k"+FIEL(i)
   PRIV &cVar. := &msg.
   @ lin+i,col GET &cVar.
NEXT
READ


Depois para gravar os campos:

 APPEND BLANK
FOR i=1 TO FCOU()
   msg=FIEL(i)
   cVar:="k"+FIEL(i)
   REPL &msg. WITH &cVar.
NEXT
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

Nome dos campos como Variaveis

Mensagempor lugab » 18 Abr 2018 19:42

Professores, muito obrigado.....

E sim, Quintas, eu compilo em Harbour 3.2, mas só consigo entender se a sintaxe for clipper e olha q tem coisas q mesmo em clipper eu não entendo :%

Grato Quintas e Toledo
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes

Nome dos campos como Variaveis

Mensagempor rubens » 18 Abr 2018 22:45

Boa noite...

Gabriel, eu uso a muito tempo, antes mesmo do Pctoledo.com.br uma rotinas que vieram como exemplo no clippersclub.com.br Eu particularmente acho muito prático e quando preciso fazer alguma comparação abro o dbf e localizo o campo. Cada ação tem uma função respectiva.

Para criar as variáveis:
Sele Area
FOR NI:= 1 TO FCOUNT() ; &(TYPE(FIELD(NI))+FIELD(NI)) := &(FIELD(NI))  ;    NEXT

Para essa ação não pode criar variável tem que ser na função que a variável vai ser usada mesmo.
Por exemplo você tem um Arquivo Cliente com os campos
Codigo - C - 5
Nome - C - 40
DataNasc - D - 10
Salário - N - 12,2
Aí você usa
Sele Area
FOR NI:= 1 TO FCOUNT() ; &(TYPE(FIELD(NI))+FIELD(NI)) := &(FIELD(NI))  ;    NEXT

Serão criadas as variáveis:
cCodigo
cNome
dDatanasc
nSalario
Cada variável será criada com o início do tipo da variável no caso Nome -> cNome, Datanasc -> dDatnasc, Salario->nSalario.

Para Limpar as Variáveis
Aqui já pode ser criada uma função para uso genérico
FUNCTION Limpa_Var( cALIAS)
LOCAL nI
DBSELECTAREA(cALIAS)
FOR nI:= 1 TO FCOUNT() ; &(TYPE(FIELD(nI))+FIELD(nI)) := IF(TYPE(FIELD(nI))=="C",SPACE(LEN(&(FIELD(nI)))),IF(TYPE(FIELD(nI))=="N",0,IF(TYPE(FIELD(nI))=="L",.F.,IF(TYPE(FIELD(nI))=="D",CTOD(""),""))) ) ; NEXT
RETURN NIL
Uso Limpa_Var('Cli')

Pronto todas as variáveis da área Cli serão zeradas, limpas.

Para buscar dados do dbf.
FUNCTION Igual_Var( cALIAS )
LOCAL nI
DBSELECTAREA( cALIAS )
FOR nI:= 1 TO FCOUNT() ; &(TYPE(FIELD(nI))+FIELD(nI)) := &(FIELD(nI)) ; NEXT
RETURN NIL
Uso Igual_var('Cli')

A mesma coisa de digitar cCodigo := Cli->Codigo, cNome:=Cli-Nome, dDataNasc:=Cli->dDatanasc, nSalario:=Cli->Salario
Imagina um dbf com 30 campos, vai ser feito automaticamente e você não atribuirá um campo a uma variavel errada.

Para gravar dados no dbf
FUNCTION Grava_Var( cALIAS )
LOCAL nI
Hb_Default( @cAlias, Select() )
SELE &cALIAS
FOR nI := 01 TO FCOUNT() ;_FIELD->&(FIELD(nI)) := &(TYPE(FIELD(nI))+FIELD(nI)) ; NEXT
RETURN NIL
Uso
Grava_var('Cli')

A operação inversa do Igual_Var()... Na mesma comparação evita salvar uma variável em um campo errado.

E por último
FUNCTION Apaga_Var( cAlias )
LOCAL nI
FOR nI := 01 TO FCOUNT(); NomeCampo := (TYPE(FIELD(nI))+FIELD(nI)) ; RELEASE &NomeCampo ; NEXT
RETURN NIL
Uso
Apaga_var('Cli')

Cuidado ao usar esta função...kkkk... eu uso mais tem funções de cadastro... em funções de movimentação não recomendo. É claro que o harbour apaga as variáveis criadas na função, quando você a destroi, mas, que mal tem estar no controle..

Bom analise e tire suas conclusões. O Próprio Ramalho escreveu um capítulo inteiro sobre isso. O que você ganha produtividade e organização. Só depende de você...
Eu uso e tiro muito proveito !!! Esta é minha opinião...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar de usuário

rubens
Colaborador

Colaborador
 
Mensagens: 1518
Data de registro: 16 Ago 2003 09:05
Cidade/Estado: Nova Xavantina - MT
Curtiu: 77 vezes
Mens.Curtidas: 104 vezes

Nome dos campos como Variaveis

Mensagempor lugab » 19 Abr 2018 18:19

Obrigado tb, Rubens, por compartilhar mais uma solução ...

Um abraço a todos
lugab
lugab
Colaborador

Colaborador
 
Mensagens: 843
Data de registro: 19 Mai 2009 15:58
Curtiu: 126 vezes
Mens.Curtidas: 38 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro