Vamos a explicar en contexto lo
que es una macro y una constante en DYN365FO, como también porque usar una u otra.
Constante.
Una
constante representa un valor que nunca cambia.En AX2012 no existía este tipo
de variable que ahora en DYN365 ya cuenta con ello y estas constantes son
campos cuyos valores se establecen en tiempo de compilación y no se pueden
cambiar en tiempo de ejecución.
Para
definir una variable constante declaramos de esta manera:
class Constants
{
public const double Pi = 3.14159;
public const int SpeedOfLight = 600000;
}
Macros.
Son
fragmentos de código los cuales no se puede ejecutar de forma independiente,
pero se puede usar en cualquier lugar donde se pueda escribir código en el
sistema, por ejemplo en Jobs, clases y formularios. En AX2012 como en
DYN365 el nodo Macros contiene las macros utilizadas por la aplicación
estándar.
Además
de ver el código existente, puede agregar sus propias macros.
Definición
de macros
class Macros
{
#define.MyMacro("Value");
}
Puede
usar macros de la misma manera que lo hicimos en AX 2012. Sin embargo, en
algunos casos es imprescindible esto para la reutilizar bloques de código. Por
ejemplo
class SecurityDigitClass
{
static void MyMacroInSelect()
{
Bom bom;
date emptyDate;
//
parameters: %1 = table instance, %2 date, %3 empty date value
#localmacro.bomDateFilter
&& ( %2 == dateNull() || (
((%1.FromDate <= %2) && (%1.ToDate >= %2)) ||
((%1.FromDate == %3) && (%1.ToDate == %3)) ||
((%1.FromDate <= %2) && (%1.ToDate == %3)) ||
((%1.FromDate == %3) && (%1.ToDate >= %2))
))
#endMacro
;
while select bom
where bom.ItemId == '123'
#bomDateFilter(bom, systemDateGet(), emptyDate)
{
info(bom.bomid);
}
}
}
¿Macro o Constate?
En DYN365 X++ ahora el tipo de variable constante con la palabra clave const es compatible, podemos y debemos usar CONS (Constantes) como vemos a continuación presentamos el uso de ambos.
#define.macroValue("Macro value");
#define.macroValue("Macro value");
const str constValue = "Constant value";info(strFmt("%1 - %2",#macroValue, constValue));
Para usar "const" de la misma manera que estábamos usando antes con un archivo Macro, debe reemplazarlo por una "clase estática".
static class ConstClass()
{
static const public str constValue = "Constant
value";
}
Usando la clase constante
str constValue = constClass::ConsValue;
Microsoft recomienda usar "const" en lugar de
"macro", y enumeran algunos beneficios:
- IntelliSense en el editor.
- Soporte para "Ir a definición" en el editor.
- Control total del tipo de la constante.
- Compilación más rápida: las macros son notoriamente difíciles de manejar para el compilador.
En
resumen el uso de macros fue poderoso para también
reutilizar bloques de codificación.
En la compilación, la parte macro se insertará en la codificación, lo
que requiere tiempo de compilación adicional.Por esta razón, trate de evitar el uso de macros.
Microsoft apunta a
obtener compilaciones lo más rápido posible,por esta razón, podría ocurrir que las macros se deprecien en el futuro.
Además
del rendimiento, las macros rompen muchas herramientas de desarrollo. Si usa
macros para insertar bloques de código, ninguna de las herramientas de
desarrollo puede ver ese código. Así
que cosas como las herramientas de actualización de código, los complementos de
Visual Studio y cualquier herramienta futura nunca podrán comprender las
macros, ya que esas herramientas funcionan en contra del código, y las macros
no se "resuelven" (reemplazan) hasta la compilación.
Por
todos estos motivos ya descritos apostamos a que se utilice lo menos posibles
macros y usemos ya constantes, y no arriesguemos a una penalizacion de
rendimiento al usar macros.
