Nome dos campos como Variaveis

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Nome dos campos como Variaveis

Mensagem 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
lugab
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome dos campos como Variaveis

Mensagem 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...
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
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome dos campos como Variaveis

Mensagem 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.
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
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Nome dos campos como Variaveis

Mensagem 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
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
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Nome dos campos como Variaveis

Mensagem 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
lugab
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Nome dos campos como Variaveis

Mensagem 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
"Eu e minha casa servimos ao Senhor e você ???"
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Nome dos campos como Variaveis

Mensagem por lugab »

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

Um abraço a todos
lugab
Responder