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:
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:
Read More »
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(); }