Página 1 de 1

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 07:32
por juniorcamilo
ola amigos veja o codigo abaixo:
onde ALIAS->CAMPO := "(cVal1*(cVal2/100))" e de um arquivo qualquer

Código: Selecionar todos

Function teste()
            Private cMostra := ALIAS->CAMPO
            Private cVal1 := 10, cVal2 := 10
            @ 10,10 say &cMostra.
            wait
          return .t.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 09:26
por Pablo César
Junior, você já utilizou a função FieldGet(<número do campo>) ?
FIELDGET()
Recupera o valor de um campo usando a posiçao ordinal deste dentro da
estrutura do arquivo de dados
─────────────────────────────────────────────────────────────────────────

Sintaxe

FIELDGET(<nCampo>) --> valorCampo

Argumentos

<nCampo> é a posiçao ordinal do campo na estrutura do registro para
a área de trabalho corrente.

Retorna

FIELDGET() retorna o valor do campo especificado. Se <nCampo> nao
corresponde a posiçao de qualquer campo no arquivo de dados, FIELDGET()
retorna NIL.

Descriçao

FIELDGET() é uma funçao de arquivo de dados que recupera o valor de um
campo usando sua posiçao dentro da estrutura do arquivo de dados ao
invés de seu nome. Dentro das funçoes genéricas de acesso a arquivos
de daods isto permite entre outras coisas, a recuperaçao de valores de
campos sem o uso do operador macro.

Exemplos

O exemplo a seguir compara FIELDGET() ao código funcionalmente
equivalente que usa o macro operador para recuperar o valor de um
campo:

LOCAL nField := 1, FName, FVal
USE Customer NEW
//
// Usando o macro operador
FName := FIELD( nField ) // Obtem nome do campo
FVal := &FName // Obtem valor do campo

// Using FIELDGET()
FVal := FIELDGET( nField ) // Obtem valor do campo

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 10:12
por juniorcamilo
Pablo César escreveu:Junior, você já utilizou a função FieldGet(<número do campo>) ?
sim o fielget pega o conteudo do campo, mas nao consegui fazer a formula matematica. o conteudo do campo do arquivo é (ALIAS->X*(ALIAS->Y/100)) calculo de porcentagem. no arquivo que estoutentando idealizar possui varias formulas matematicas e quando for preciso usarei a escolhida para dar o resultado na tela.. onde declaro que ALIAS->X e ALIAS->Y vem de uma arquivo com definicoes armazendas de um caddastro previo. o conteudo de X e Y pode ser trocado com o sistema rodando.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 10:28
por Pablo César
Entendi, o resultado é algo lógico, foi por isso que indiquei a FieldGet que fica mais fácil caso você montar uma lógica de sequência na criação do seu banco de dados. Só que você não deu exemplo algum e fica dificil dar uma outra dica. Não sabemos a que se refere e quantas possibilidades existem nessa composição.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 10:39
por juniorcamilo
Pablo César escreveu:Entendi, o resultado é algo lógico, foi por isso que indiquei a FieldGet que fica mais fácil caso você montar uma lógica de sequência na criação do seu banco de dados. Só que você não deu exemplo algum e fica dificil dar uma outra dica. Não sabemos a que se refere e quantas possibilidades existem nessa composição.
é se vc ver outros post meus eu sempre penso mas nao escrevo oq real mente quero,rsrsrs, mas vamos la...


arquivo nome 'TESTE', campos X, Y e FORMULA onde TESTE->X := 10, TESTE->Y := 10 e TESTE->FORMULA := "(TESTE->X*(TESTE->Y/100))"

Código: Selecionar todos

Function teste()

Sele 1
use TESTE alias TESTE

@ 10,10 say &TESTE->FORMULA.
wait

return .t.
espero que entenda...

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 11:05
por Pablo César
juniorcamilo escreveu:é se vc ver outros post meus eu sempre penso mas nao escrevo oq real mente quero,rsrsrs, mas vamos la...
kkk pois é...
Você me desculpa mas para dar uma boa indicação é preciso entender e juro que está difícil de eu entender.

Você esqueceu de listar a estrutura do seu BD. E o que fiquei confuso é que você tinha mencionado dois BD.
Eu fiz este teste:

Código: Selecionar todos

X := 10
Y := 10
FORMULA := "(TESTE->"+StrZero(X,3,0)+"*(TESTE->"+StrZero(Y,3,0)+"/100))"
RESULTADO:= X*Y/100

@ 10,10 say StrZero(RESULTADO,3,0)
@ 11,10 say FORMULA
// @ 12,10 say (&FORMULA)
inkey(0)
Pois acredito que o seu problema maior é resolver primeiramente o cálculo matemático (acho que é uma porcentagem) e depois compor o nome do campo. Mas preciso ver como você definiu a sua estrutura. Para facilitar utilize o STRU.exe para postar aqui no fórum.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 11:10
por Jairo Maia
Olá Júnior,

Qual o erro você está tendo? Acabei de testar o exemplo abaixo em Harbour, e nada muda com o Clipper pelo que sei neste caso. Tente compilar este exemplo em Clipper e veja se funciona:

Código: Selecionar todos

//Func Main()

 If !File( "Macros.dbf" )
  aEstr := {;
            {"valor1" ,"N", 10, 0},;
            {"valor2" ,"N", 10, 0},;
            {"macro"  ,"C", 50, 0};
           }
  DBCreate( "Macros", aEstr )

  Use Macros Shared New
  Appen Blank
  Repl valor1 with 10
  Repl valor2 with 10
  Repl macro with "(cVal1*(cVal2/100))"
  Use

 EndIf

 Use Macros Shared New

 Teste()

//Return Nil

Function teste()
 Private cMostra := MACROS->macro
 Private cVal1 := MACROS->valor1
 Private cVal2 := MACROS->valor2

 Clear Screen
 @ 10,10 say ( &cMostra. )  // Retorna 1.00 (correto)
 //wait

Return .t.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 11:18
por Pablo César
Ahhh você sabia a estrutura do dbf Jairo ? Agora entendi.

Eu sempre utilizei macros entre parenteses e o sinal de macro no inicio mas dentro do parentese. E nunca tive problemas, nem em Harbour nem em Clipper. E não vejo que no Harbour possa haver algum problema.

O único que achei que pode estar errado no seu código, Jairo. É na linha 15 onde cVal1 e cVal2 não estão declaradas.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 11:26
por Jairo Maia
Olá Pablo,
Pablo César escreveu:você sabia a estrutura do dbf Jairo
Não sabia. Montei com as informações do último post dele.
Jairo Maia escreveu:É na linha 15 onde cVal1 e cVal2 não estão declaradas
Na linha 15 é uma linha string. Depois de ser gravada no DBF, elas serão substituidas na funcão Teste() via Macro.

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 11:44
por Pablo César
Bom dia Jairo. Ahhh tem razão, nessa linha não irá dar erro pois está como string.
Jairo Maia escreveu:Montei com as informações do último post dele
Imaginei... rs

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 14:57
por juniorcamilo
amigos achei o erro, erro tao idiota da minha parte que nao m dei conta, oq postei foi um ex. para facilitar o entendimento, mas na minha aplicacao é um pouco mais complexa, errei o nome do campo...... :^|

Macro substituicao, é possivel?

Enviado: 12 Jul 2013 15:09
por Pablo César
ahh ainda bem... acho que você se tocou quando te pedi a listagem de estrutura do dbf...

Mas se está resolvido, isso é o que importa.