AX TIP: Ejecutar una expresión matemática desde X++

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:

HOWTO: Eventos en AX 2012 para minimizar conflictos

Como se puede adivinar de algunos de mis anteriores post,  soy un fiel defensor de uno de los grandes olvidados de AX 2012: Los eventos

En mi afán de evangelizar a favor de uso, he dado con un ejemplo muy evidente de sus ventajas. A estas alturas supongo que casi todo el mundo conoce la posibilidad de añadir nuevas opciones al menú Add-Ins del entorno de desarrollo de AX 2012 y anteriores. Es realmente fácil, sólo hay que crear una nueva clase con un método main al uso, un menú ítem que apunte a esa clase, y añadir el menú ítem al menú estándar SysContextMenu. Con esto conseguimos que nuestro menú ítem se muestre al hacer click-derecho sobre los elementos del AOT, por ejemplo (Startup Project es el nuevo add-in):

SysContextMenu Add-In

Sin embargo, para hacerlo realmente bien es necesario alguna modificación más. En mi ejemplo, el nuevo add-in sirve para convertir el proyecto seleccionado en el proyecto de inicio para el usuario actual. Es simple, pero nos sirve como ejemplo de un add-in que solo debe mostrarse cuando hacemos click derecho en un proyecto, y no en cualquier otro tipo de elemento del AOT. Para eso, como muestra la documentación, debemos modificar el método verifyItem de la clase SysContextMenu, que es un infierno de if-else in switches para determinar si el elemento debe mostrarse o no, dependiendo de la clase que lo llama, el tipo de elemento y un larguísimo y desastroso etcétera.

Continue Reading…