viernes, 23 de febrero de 2018

X++ | USO DEL SysExtension Framework

USO DEL SysExtension Framework

El SysExtension Framework es incorporado en Dynamics AX para solventar el diseño de extensión de clases (jerarquías). En el siguiente ejemplo motraremos el uso de esta solución.
Espero sea de su ayuda.

1. Lo primero que necesitamos es un diseño de jerarquía de clases. De manera sencilla, para este ejemplo se crearán las clase HACustInvoice y HACustInvoice_Sales.


class HACustInvoice
{
}


public void run()
{
    info("clase HACustInvoice");
}


 
class HACustInvoice_Sales extends HACustInvoice
{
}


public void run()
{
    info("clase HACustInvoice_Sales");
    //super();
}


2. Ahora, creamos una clase que extiende de SysAttribute. Donde definiremos el atributo que en el contructor nos retorne la clase derivada.


 Esta clase almacena un valor recibido por parámetros y lo devuelve por un método parm.

class HACustInvoiceTypeAttribute extends SysAttribute
{
    str     classType;
}


public void new(str     _classType)
{
    super();

    if(_classType == "")
        throw error(error::missingParameter(this));

    classType = _classType;
}
 


public str parmClassType(str    _classType = classType)
{
    classType = _classType;

    return classType;
}


3. Editamos la classDeclaration de la clase (HACustInvoice_Sales)derivada para añadir este atributo.

[HACustInvoiceTypeAttribute("Sales")]
class HACustInvoice_Sales extends HACustInvoice
{
}


4. Por ultimo, editamos el constructor de la clase HACustInvoice con una nueva definición que utilice el atributo de la clase derivada.
 
public static HACustInvoice construct(str _classType)
{
    HACustInvoiceTypeAttribute     custInvoiceTypeAttribute;
    HACustInvoice                  custInvoice;

    custInvoiceTypeAttribute = new HACustInvoiceTypeAttribute(_classType);

    custInvoice = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(HACustInvoice),
                                                                        custInvoiceTypeAttribute);

    return custInvoice;
}


Segun éste diseño, no tendremos que modificar en absoluto nuevamente el constructor para añadir nuevas clases derivadas. Bastaría con indicar un nuevo atributo en la declaración de las nuevas clases derivadas.

5. Ejecutamos nuestro ejemplo de la siguiente manera:

static void JobHMAE(Args _args)
{
    HACustInvoice   custInvoice;

    custInvoice = HACustInvoice::construct("Sales");
    custInvoice.run();
}