A ver como se puede hacer y ver si me explico:
en una aplicación tengo acumuladores o totalizadores, ejemplo
mTOTAL:=1000, mCANT := 5
El usuario de un programa cargaría una formula en un campo o variable,
ejemplo: mVARIABLECALCULO := '((mTOTAL*mCANT) *10/100)' ; la idea es
generar una funciones que me arroje el resultado de la variable
cargada por el ususario .
)
chas gracias
David Barrio
Foruma matematica armada por el usuario
-
- Posts: 325
- Joined: Sun Feb 03, 2008 11:04 pm
- Location: Argetnina
Re: Foruma matematica armada por el usuario
Hola David
Igual que con MsgInfo(), puedes hacerlo dentro de cualquier función que tú definas, solo cuida que las variables contenidas en la expresión a evaluar sean visibles para dicha función, no podrán ser variables locales ni estáticas.
Saludos.
Manuel Mercado
Usa el evaluador de macros: &( cExpression ), te doy un ejemplo:dobfivewin wrote:El usuario de un programa cargaría una formula en un campo o variable,
ejemplo: mVARIABLECALCULO := '((mTOTAL*mCANT) *10/100)' ; la idea es
generar una funciones que me arroje el resultado de la variable
cargada por el ususario
Code: Select all
#include "FiveWin.ch"
MemVar mTOTAL, mCANT
Function Main()
Local mVARIABLECALCULO := '((mTOTAL*mCANT) *10/100)'
mTOTAL := 1000
mCant := 5
MsgInfo( &( mVARIABLECALCULO ) )
Return Nil
Saludos.
Manuel Mercado
-
- Posts: 325
- Joined: Sun Feb 03, 2008 11:04 pm
- Location: Argetnina
Foruma matematica armada por el usuario
Antes de todo Muchas gracias por la respuesta, cargué el ejemplo y funciona.... pero.....
Es raro o normal??
If &(LIQUSUM)->TIPO == 4
mCANTID:= &(LIQUSUM)->CANT
*------------------------------------------------- ACA FUNCIONA
mCALCU := (mACUM01 * mCANTID / 100)
*------------------------------------------------- ACA NO FUNCIONA
* Me dice No existe la Variable mACUM01
mCALCUX := '(mACUM01 * mCANTID / 100)'
mCALCU := &( mCALCUX )
EndIf
La variable mACUM01 es un acumulador que viene sumando importes varios y la variable mCANTID lo traigo de la base de dato.
David Barrio
Argentina
Es raro o normal??
If &(LIQUSUM)->TIPO == 4
mCANTID:= &(LIQUSUM)->CANT
*------------------------------------------------- ACA FUNCIONA
mCALCU := (mACUM01 * mCANTID / 100)
*------------------------------------------------- ACA NO FUNCIONA
* Me dice No existe la Variable mACUM01
mCALCUX := '(mACUM01 * mCANTID / 100)'
mCALCU := &( mCALCUX )
EndIf
La variable mACUM01 es un acumulador que viene sumando importes varios y la variable mCANTID lo traigo de la base de dato.
David Barrio
Argentina
David:
Para que el evaluador de macros funcione correctamente, las variables contenidas en la expresión que se va a evaluar deben ser declaradas como MEMVAR y ser visibles para la función que evalúa la expresión, normalmente yo las defino como Public o Private. Si no se hace así, no funciona o el resultado es impredecible.
Saludos.
Manuel Mercado
Para que el evaluador de macros funcione correctamente, las variables contenidas en la expresión que se va a evaluar deben ser declaradas como MEMVAR y ser visibles para la función que evalúa la expresión, normalmente yo las defino como Public o Private. Si no se hace así, no funciona o el resultado es impredecible.
Saludos.
Manuel Mercado
Te alcanzo una funciones que utilizao para manejo de formulas definidas em tiempo de ejecucion
Salu2[/code]
Code: Select all
Function Main()
Local cFormula := 'VALOR1 * VALOR2 / VALOR3"
Local lOk
//Chequear formula
? lOk := CheckFormula( cFormula, { 'VALOR1', 'VALOR2', 'VALOR3' }, .T. )
// obtener resultado
If lOk
? Compile( ReplaceFormula( cFormula, { 'VALOR1', 'VALOR2', 'VALOR3' }, { 10, 40, 2 } ) )
EndIf
Return Nil
//-------------------------------------------------------------------------------//
// Formulas
Function CheckFormula( cFormula, aVar, lMsg )
Local lReturn := .T.
Local bOldManejador := ErrorBlock( { |oError| __ErrorFormula( oError, aVar, lMsg ) } )
Local nValor
Local oError
DEFAULT lMsg := .T.
If !Empty( Alltrim( cFormula ) )
cFormula := ReplaceFormula( cFormula, aVar )
Do While .T.
BEGIN SEQUENCE // control de errores
nValor := Eval( Compile( cFormula ) )
RECOVER USING oError
If Valtype( oError:cargo ) == 'L'
If oError:cargo
//
Else
//Error en la formula una item o constante no encontrado
nValor := 0
lReturn := .F.
Exit
EndIf
Else
cFormula := StrTran( cFormula, oError:operation, Alltrim( Str( oError:cargo ) ) )
EndIf
LOOP
END
Exit
EndDo
ERRORBLOCK( bOldManejador )
Endif
If lMsg .and. lReturn
MsgInfo( 'Formula Ok' )
EndIf
Return lReturn
Function ReplaceFormula( cFormula, aVar, aVal )
DEFAULT aVal := {'(1)'}
ASize( aVal, Len( aVar ) )
AEval( aVal, { |x,n| If( Empty( aVal[ n ] ), aVal[ n ] := '(1)', ) } )
AEval( aVar, { |x,n| cFormula := StrTran( cFormula, x, aVal[ n ] ) } )
Return cFormula
Function __ErrorFormula( e, aVar, lMsg )
If Ascan( aVar, { |x| e:operation == upper( x ) } ) > 0
e:cargo := 1
Else
If lMsg
If e:operation == '&'
MsgInfo( "Error in Formula: Operation Error" )
Else
MsgInfo( "Error in Formula: Constant: " + e:operation + " not found" + CRLF + ;
"GenCode : " + Str( e:GenCode ) + CRLF + ;
"SubCode : " + Str( e:SubCode ) )
EndIf
EndIf
e:cargo := .F. //Error en la formula
EndIf
BREAK e
Return .T.
//-------------------------------------------------------------------------------//