AX TIP: Ejecutar Una Expresión Matemática Desde X++

!
Warning: This post is over 365 days old. The information may be out of date.

Un truco antiguo, pero muy útil en algunos casos, es la posibilidad de utilizar el compilador de X++ para calcular expresiones matemáticas. Una simplificación de este interprete matemático está implementada en todos los campos numéricos de la aplicación, donde, en vez de un número, se puede introducir una expresión sencilla. Por ejemplo: +15+7-10/3

El compilador va un poco mas ayá y nos permite utilizar funciones matemáticas más complejas. La lista completa de funciones, según la documentación, es: abs, acos, asin, atan, corrFlagGet, corrFlagSet, cos, cosh, decRound, exp, exp10, frac, log10, logN, power, round, sin, sinh, tan, tanh y trunc, aunque probablemente haya más, la lista de funciones en MSDN no ha sido nunca totalmente completa.

Para poder interpretar estas funciones utilizamos la clase XppCompiler, de la que hablaré también en el siguiente artículo dentro de unos días, de esta forma:

static void JAEE\_XppCompiler\_Math(Args \_args)
{
    XppCompiler comp;
    
    str expr = "sin(3 \* 3.14159265358979323 / 2)";

    new ExecutePermission().assert();
    
    comp = new XppCompiler();
    if (comp.compileExpr(expr))
    {
        info(comp.execute());
    }
    else
    {
        throw error("Expresión inválida.");
    }
    
    CodeAccessPermission::revertAssert();
}

La clase XppCompiler es una de las llamadas API’s seguras del sistema, y por tanto, son un riesgo para la seguridad de la aplicación (pueden permitir inyección de código X++ en las formulas, por ejemplo). Antes de utilizar esta clase en producción es necesario tener en cuenta la seguridad del código. Más información: