Página 1 de 1

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 17:44
por lugab
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

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 18:38
por JoséQuintas
Independente da linguagem, melhor fazer um a um mesmo.

Mas... Clipper mesmo?
Vai precisar testar:

pegar nomes dos campos:

Código: Selecionar todos

aCampos := dbStruct()
Criar variáveis:

Código: Selecionar todos

#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:

Código: Selecionar todos

@ 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:

Código: Selecionar todos

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.

Código: Selecionar todos

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...

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 18:41
por JoséQuintas
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.

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 18:44
por Toledo
Outro exemplo. Faça o seguinte... abra o arquivo DBF e depois este código para criar as variáveis:

Código: Selecionar todos

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:

Código: Selecionar todos

 APPEND BLANK
 FOR i=1 TO FCOU()
   msg=FIEL(i)
   cVar:="k"+FIEL(i)
   REPL &msg. WITH &cVar.
 NEXT

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 19:42
por lugab
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

Nome dos campos como Variaveis

Enviado: 18 Abr 2018 22:45
por rubens
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:

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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.

Código: Selecionar todos

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

Código: Selecionar todos

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

Código: Selecionar todos

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

Nome dos campos como Variaveis

Enviado: 19 Abr 2018 18:19
por lugab
Obrigado tb, Rubens, por compartilhar mais uma solução ...

Um abraço a todos