GD Access    GD Access    Grupo de Discussão  Ir para Categorias  Grupos técnicos  Ir para Fóruns  Access    Função EVAL - Preciso de Ajuda
Go
Novo
Procurar
Notificar
Ferramentas
Responder
  
-star Rating Vote!  Login/Cadastrar 
Analista Júnior

postado
Pessoal propositalmete escrevi E val separado, pois o fórum diz que não permite eu ecrever E val junto.

Pessoal a alguns dias postei uma dúvida e me deram a dica de usar a função E val.

Então fiz um teste, criei uma tabela

COD |COMPR |FORMULA
1 | 1000 |[compr] + 30

E fiz um consulta

COMPR |FORMULA |CALC_MANUAL: E val([compr] + 30]) | CALC_TABELA: E val([formula])

Coloquei na funçaõ E VAL do campo CALC_MANUAL, exatamente o que está na tabela no campo FORMULA

No campo CALC_MANUAL me retornou 1030 - OK
Mas no campo CALC_TABELA me retornou #Erro

Pq acontece isso, se o valor colocado manual é idêntico ao da tabela?

Já tentei usas " na tabela mas aí retorna a string [compr] + 30 e não calcula nada.

Alguém pode me ajudar a resolver

 
Postagens: 782 | Localização: Camaquã | Porto Alegre - RS | Registrado: 22 March 2002Reply With QuoteEditar ou Apagar MensagemReport This Post
Analista Júnior

postado Hide Post
Existe alguma outra função que faça algo parecido?
 
Postagens: 782 | Localização: Camaquã | Porto Alegre - RS | Registrado: 22 March 2002Reply With QuoteEditar ou Apagar MensagemReport This Post
Analista Sênior

postado Hide Post
Diretamente como você está tentando, acho que não funciona, pois e_val é uma função que na realidade é executada fora da consulta, onde [compr] não representa nada!

Uma maneira de se conseguir é forçar para que o conteúdo, e não o nome do campo, seja passado para e_val. Para isto, devemos montar a fórmula na passagem, mais ou menos assim:

Primeiro defina sua formula como "+ 30";
Em seguida, defina a coluna CALC_TABELA como:
CALC_TABELA: E_val([compr] & [formula])
 
Postagens: 1589 | Localização: Porto Alegre | Registrado: 03 April 2002Reply With QuoteEditar ou Apagar MensagemReport This Post
Moderador
Diretor

Figura de  Sampaio Lima
postado Hide Post
Com
E-vall([compr] + 30)
a questão substitui a string " [compr] " com o valor do
campo COMPR - i.e. 1000. Passa " 1000 então + 30 " para E-vall (),
que devolve 1030.


>no campo CALC_TABELA voltou eu #Erro

Com
E-vall([formula])
a query substitui a string " [fórmula] " com o valor do FÓRMULA de campo, i.e ". [compr] + 30 ". passa isto então para
E-vall () - que não tem nenhum mecanismo para interpretar " [compr] " como o
valor de um campo.

Pode ser possível trabalhar o problema em volta usando uma função na query
CALC_TABELA: MYEVALl([COMPR], [FÓRMULA])

A função poderia se assemelhar a este código não experimentado:
Public Function MyEvall( _
Compr As Long, Formula As String) As Long
Dim strF1 As String, strF2 As String)
Dim lngPos As Long, lngLen As Long

'Exemplo: Formula = "[COMPR] + 30"
lngPos = Instr("[COMPR]", Formula)
lngLen = Len("[COMPR]")
strF1 = Left(Formula, lngPos - 1)
strF2 = Mid(Formula, lngPos + Len)

MyEvall = E-vall(strF1 & CStr(Compr) * strF2)
End Function

Esta aproximação pode ser ampliada para acomodar mais campos e um gama mais largo de fórmulas.


OBS:. Veja que o nome foi mudado E-VALL você deverá alterar para o nome correto.

Boa sorte

sl

[ 30-09-2002: Mensagem editada por: Sampaio lima ]
 
Postagens: 4349 | Localização: Fortaleza - ce | Registrado: 29 January 2001Reply With QuoteEditar ou Apagar MensagemReport This Post
Analista Júnior

postado Hide Post
quote:

Eduardo Oliveira
Tenho uma tabela chamada calculo, onde se tem campo chamada formula onde armazeno coisa do tipo : ([VALOR_PARCELA]*[Honorario]), preciso que numa consulta ou formulario me mostre o resultado, ja tentei a função Eval sem exito . Ja pesquisei no forum achei alguns topicos naum me ajudaram ... Tentei usar da seguinte maneira Eval([formula]) e sugerida por um amigo do topico Eval(Eval([formula]), todas me retornam #Erro . Grato pela atençao de todos .



Eduardo
Na época cheguei a analisar a sugestão do mestre Sampaio, mas infelizmente o projeto foi engavetado...
Como o Sampaio havia comentado a função não havia sido experimentada, mas lembro que precisou de pequenas modificações para funcionar, veja como ficou:
Public Function MyEvall(Compr As Long, Formula As String) As Long
    Dim strF1 As String, strF2 As String
    Dim lngPos As Long, lngLen As Long
    'Exemplo: Formula = "[COMPR] + 30"
    lngPos = InStr(Formula, "[COMPR]")
    lngLen = Len("[COMPR]")
    strF1 = Left(Formula, lngPos - 1)
    strF2 = Mid(Formula, lngPos + lngLen)
    MyEvall = Eval(strF1 & CStr(Compr) + strF2)
End Function


A idéia é boa, mas dará um pouco de trabalho para implementar como uma função mais genérica que se adapte a todas as possíveis fórmulas.

____________________________________________________
"É melhor voltar atrás do que perder-se no caminho!"
"As palavras assim como as abelhas tem mel e ferrão!"
 
Postagens: 782 | Localização: Camaquã | Porto Alegre - RS | Registrado: 22 March 2002Reply With QuoteEditar ou Apagar MensagemReport This Post
Analista Júnior

postado Hide Post
Eduardo

Acho que encontrei uma solução mais fácil de implementar:



  • 1º Defina os campos que a fórmula poderá utilizar
  • Crie uma função que receba como parametros esses campos e o campo fórmula também
  • Num campo da consulta chame a função
  • Na função vamos substituir os campos da fórmula pelos valores passados pela consulta



Abaixo o exemplo da função:

Public Function MyEval(Compr As Long, Larg As Long, Esp As Long, Formula As String) As Long
    Formula = Replace(Formula, "[COMPR]", Compr)
    Formula = Replace(Formula, "[LARG]", Larg)
    Formula = Replace(Formula, "[ESP]", Esp)
    MyEval = Eval(Formula)
End Function


Aqui um exemplo da consulta:

SELECT tbl_teste.compr, tbl_teste.larg, tbl_teste.esp, tbl_teste.formula, myeval([compr],[larg],[esp],[formula]) AS result
FROM tbl_teste;


É interessante criar um construtor de fórmulas para que o usuário insira apenas campos válidos, bem como impedir a o erro de digitação e sintaxe das fórmulas...

Espero ter ajudado

____________________________________________________
"É melhor voltar atrás do que perder-se no caminho!"
"As palavras assim como as abelhas tem mel e ferrão!"
 
Postagens: 782 | Localização: Camaquã | Porto Alegre - RS | Registrado: 22 March 2002Reply With QuoteEditar ou Apagar MensagemReport This Post
Programador Pleno

Figura de  Eduardo Oliveira
postado Hide Post
Estou adaptando ainda ... naum vai funcionar como eu quero ainda , mas resolve momentaneamente .. Grato Vladimir ...

Para a galera que usa o Access97 a função replace pode ser substituida por "FindAndReplace" :

'This code was originally written by Alden Streeter.
'It is not to be altered or distributed,
'except as part of an application.
'You are free to use it in any application,
'provided the copyright notice is left unchanged.
'
'Code Courtesy of
'Alden Streeter
'
Function FindAndReplace(ByVal strInString As String, _
strFindString As String, _
strReplaceString As String) As String
Dim intPtr As Integer
If Len(strFindString) > 0 Then 'catch if try to find empty string
Do
intPtr = InStr(strInString, strFindString)
If intPtr > 0 Then
FindAndReplace = FindAndReplace & Left(strInString, intPtr - 1) & _
strReplaceString
strInString = Mid(strInString, intPtr + Len(strFindString))
End If
Loop While intPtr > 0
End If
FindAndReplace = FindAndReplace & strInString
End Function
'************ Code End **********

Eduardo Oliveira
ICQ: 45141911
foleyjf@terra.com.br
 
Postagens: 164 | Localização: Juiz de Fora MG Brasil | Registrado: 28 December 2001Reply With QuoteEditar ou Apagar MensagemReport This Post
 Tópico Anterior | Próximo Tópico Powered by Eve For Enterprise  
 

GD Access    GD Access    Grupo de Discussão  Ir para Categorias  Grupos técnicos  Ir para Fóruns  Access    Função EVAL - Preciso de Ajuda

©