Miklix

Descripción rápida de Dynamics AX 2012 SysOperation Framework

Publicado: 15 de febrero de 2025, 22:34:47 UTC

Este artículo proporciona una descripción general rápida (o una hoja de trucos) sobre cómo implementar clases de procesamiento y trabajos por lotes en el marco SysOperation en Dynamics AX 2012 y Dynamics 365 for Operations.


Esta página ha sido traducida automáticamente del inglés para hacerla accesible al mayor número de personas posible. Lamentablemente, la traducción automática no es todavía una tecnología perfeccionada, por lo que pueden producirse errores. Si lo prefiere, puede consultar la versión original en inglés aquí:

Dynamics AX 2012 SysOperation Framework Quick Overview

La información de este artículo se basa en Dynamics AX 2012 R3. Puede que sea válida o no para otras versiones. (Actualización: puedo confirmar que la información de este artículo también es válida para Dynamics 365 for Operations)


Esta publicación tiene como único fin ofrecer una descripción general rápida y una hoja de referencia. Si no está familiarizado con el marco SysOperation, le recomiendo encarecidamente que lea también el informe técnico de Microsoft sobre el tema. La información que se incluye aquí puede resultar útil si solo necesita repasar rápidamente las diferentes clases involucradas en el desarrollo de operaciones con este marco.

Hay variaciones, pero cuando uso el marco normalmente implemento tres clases:

  • Contrato de datos (debería extender SysOperationDataContractBase)
  • Servicio (debe extender SysOperationServiceBase)
  • Controlador ( debe extender SysOperationServiceController)

Además, también puedo implementar una clase UIBuilder ( debe extender SysOperationUIBuilder), pero eso solo es necesario si el diálogo por alguna razón tiene que ser más avanzado que lo que el marco genera automáticamente.


Contrato de datos

El contrato de datos contiene los miembros de datos necesarios para su operación. Se puede comparar con la macro CurrentList típica definida en el marco RunBase, pero implementada como una clase. El contrato de datos debería extender SysOperationDataContractBase, pero funcionará incluso si no lo hace. La ventaja de extender la superclase es que proporciona cierta información de sesión que puede resultar útil.

[DataContractAttribute]
class MyDataContract extends SysOperationDataContractBase
{
    ItemId itemId;
}

En este ejemplo, itemId es un miembro de datos. Debe implementar un método parm para cada miembro de datos y etiquetarlo con DataMemberAttribute para que el marco sepa qué es. Esto permite que el marco cree automáticamente el cuadro de diálogo para usted.

[DataMemberAttribute]
public ItemId parmItemId(ItemId _itemId = itemId)
{
    ;

    itemId = _itemId;
    return itemId;
}


Servicio

La clase de servicio es la clase que contiene la lógica empresarial real. No se ocupa de mostrar cuadros de diálogo, procesamiento por lotes ni nada por el estilo; eso es responsabilidad de la clase del controlador. Al separar esto, es más probable que diseñe bien su código y genere un código más reutilizable.

Al igual que la clase de contrato de datos, la clase de servicio no necesita heredar de nada en particular, pero debe heredar de la clase SysOperationServiceBase, al menos si espera que el servicio se ejecute como un trabajo por lotes, ya que la superclase proporciona cierta información sobre el contexto del lote. El método que inicia la operación (es decir, ejecuta la lógica empresarial) debe tomar un objeto de su clase de contrato de datos como entrada y debe estar decorado con [SysEntryPointAttribute]. Por ejemplo:

class MyService extends SysOperationServiceBase
{
}

con un método llamado ejecutar:

[SysEntryPointAttribute]
public void run(MyDataContract _dataContract)
{
    // run business logic here
}


Controlador

La clase controladora se encarga de la ejecución y el procesamiento por lotes de la operación. También se asegura de que el código se ejecute en CIL para obtener el máximo rendimiento. La clase controladora normalmente hereda de la clase SysOperationServiceController, aunque también existen otras opciones.

class MyController extends SysOperationServiceController
{
}

El constructor de la superclase toma un nombre de clase, un nombre de método y (opcionalmente) un modo de ejecución como parámetros. Los nombres de clase y método deben ser el nombre de la clase de servicio y el método que se debe ejecutar en ella. Por lo tanto, puede implementar el método de construcción de su controlador de la siguiente manera:

public static MyController construct()
{
    ;

    return new MyController(classStr(MyService),
    methodStr(MyService, run));
}

Entonces el método principal de la clase MyController puede ser tan simple como

public static void main(Args _args)
{
    ;

    MyController::construct().startOperation();
}

Y ya está, básicamente, listo. Obviamente, lo anterior es un ejemplo muy simple y el marco contiene una gran cantidad de otras opciones y posibilidades, pero esto sirve como una descripción general rápida si necesita un repaso cuando no ha usado el marco durante un tiempo.

Compartir en BlueskyCompartir en FacebookCompartir en LinkedInCompartir en TumblrCompartir en XCompartir en LinkedInPin en Pinterest

Mikkel Bang Christensen

Sobre el autor

Mikkel Bang Christensen
Mikkel es el creador y propietario de miklix.com. Tiene más de 20 años de experiencia como programador informático profesional y desarrollador de software, y actualmente trabaja a tiempo completo para una gran empresa europea de TI. Cuando no está escribiendo en su blog, dedica su tiempo libre a una gran variedad de intereses, aficiones y actividades, que en cierta medida pueden verse reflejados en la variedad de temas tratados en este sitio web.