¿Que son los controladores de eventos de Acumatica Framework?

Los controladores de eventos de Acumatica de los Graph se definen como métodos en una clase Business Logic Controller (BLC) para una Data Class Access (DAC) o un campo en particular perteneciente al DAC.

Los controladores de eventos de Acumatica de Atributo se definen como métodos en clases de atributos. La lógica de estos controladores de eventos de Acumatica es adjuntar a todos los objetos DACs o campos de datos anotados con estos atributos. El atributo en el que se implementa un controlador de eventos debe derivarse de la clase PXEventSubscriberAttribute y debe implementar la interfaz del formato (donde se reemplaza con el nombre del evento necesario), como se muestra en el siguiente ejemplo IPX<EventName>Subscriber<EventName>

// El atributo implementa controladores FieldVerifying
// y el evento RowPersisting
public class MiAtributo: PXEventSubscriberAttribute,
                           IPXFieldVerifyingSubscriber,
                           IPXRowPersistingSubscriber
{
     public virtual void FieldVerifying(PXCache sender,
                                        PXFieldVerifyingEventArgs e)
     {
         ...
     }
     public virtual void RowPersisting(PXCache sender,
                                       PXRowPersistingEventArgs e)
     {
         ...
     }
}

Tipos de controladores de eventos de los Graph

Acumatica Framework ofrece dos tipos de controladores de eventos de gráficos: clásicos y genéricos. Para declarar un controlador de eventos clásico, debe especificar el nombre del DAC, el nombre del campo y el tipo de evento en el nombre del controlador mientras que, para declarar un controlador genérico, se especifica el nombre del campo y el nombre del DAC como parámetros de tipo del tipo de evento.

Recomendamos utilizar los controladores de eventos de Acumatica genéricos porque son más sencillos de declarar, usar y validar.

Controladores de eventos clásicos

Para evento a nivel de línea o detalle:

protected virtual void [DACName]_[RowEventName](…)

Para eventos a nivel de campo:

public virtual void [DACName]_[FieldName]_[FieldEventName](…)

Controladores de eventos genéricos

Para evento anivel de línea o detalle:

public virtual _(Events.[RowEventName]<[DACName]> e)

Por ejemplo, un controlador genérico para el evento RowSelected del DAC ARInvoice se define de la siguiente manera:

protected virtual void _(Events.RowSelected<ARInvoice> e)

Para eventos a nivel de campo:

public virtual _(Events.[FieldEventName]<[DACName], [FieldName]> e)

Por ejemplo, un controlador genérico para el evento FieldUpdated del campo ARInvoice.CustomerID se define de la siguiente manera:

protected virtual void _(Events.FieldUpdated<ARInvoice.CustomerID> e)

Ejecución de los controladores de eventos

Todos los controladores de eventos de un evento determinado comparten la misma instancia PXCache que ha generado este evento. El sistema crea una instancia PXCache para poder controlar los registros de datos modificados de un tipo de DAC determinado. La instancia de PXCache siempre estará disponible como primer argumento en un controlador de eventos. El segundo argumento proporcionará los datos específicos que corresponden al evento.

Una vez que se genera un evento, el orden en que se ejecutan los controladores de eventos asociados puede diferir. Para algunos eventos, la cadena de controladores de eventos del graph se ejecuta antes que los controladores de eventos de atributos, mientras que que los controladores de atributo solo se ejecutan si la propiedad Cancel de los argumentos del evento no es igual a true después de la ejecución de los controladores de eventos del graph.

Para otros eventos, los controladores de eventos de atributo se ejecutan primero y los controladores de eventos del graph se ejecutan a continuación.

Escenarios de manipulación de datos

La mayoría de los eventos dentro se generan dentro de escenarios comunes relacionados con la manipulación de registros de datos. Los escenarios son invocados por Acumatica Framework cuando los usuarios realizan ciertas acciones en la interfaz de usuario, cuando se realizan solicitudes correspondientes a la API de servicios web y cuando se ejecutan métodos especiales dentro del Business Logic Controller (BLC).

 

El siguiente diagrama muestra cómo se involucran los distintos tipos de controladores de eventos.

escenarios del controlador de eventos
controladores de eventos de Acumatica

Inserción de un registro de datos

Cuando un usuario crea un nuevo registro de datos en la interfaz de usuario, el sistema lo inserta en el PXCache. Para insertar un registro de datos en PXCache en el código, se invoca el método Insert() de la vista de datos aplicable, como se muestra en el siguiente ejemplo de código.

ShipmentLine line = new ShipmentLine();
line.ProductID = card.ProductID;
...
ShipmentLines.Insert(line);

Además, en el ejemplo de arriba, este método no hace que la línea de envío que inserte esté relacionada con el envío actual; solo inserta la línea en el PXCache de líneas de envío. La relación maestro-detalle entre la nueva línea de envío y el envío actual se crea debido al atributo PXDefault del campo ShipmentNbr del DAC de ShipmentLine.

El evento FieldDefaulting, que se genera para cada campo durante la inserción de un nuevo registro de datos, establece el valor predeterminado para el campo de datos.

La siguiente figura ilustra la secuencia de eventos generados durante la inserción de un registro de datos.

Inserción de un registro de datos

Cuando se inserta un registro de datos, los eventos de campo de datos se generan para cada campo de datos en el siguiente orden:

  1. FieldDefaulting
  2. FieldUpdating Si la propiedad es igual a true e.Cancel
  3. FieldVerifying
  4. FieldUpdated

A continuación, se generan los siguientes eventos de registro de datos:

  1. RowInserting (Si la propiedad es , no se generan más eventos). e.Cancel true
  2. RowSelected
  3. RowInserted

La instancia de registro de datos insertados está disponible en la propiedad de los argumentos del evento. e.Row

Actualización de un registro de datos

Al modificar un registro de datos en el código, debe actualizar el registro de datos en la memoria caché llamando al método Update() de la vista de datos o la memoria caché. Cuando el usuario modifica los campos de datos en la interfaz de usuario y las modificaciones se confirman, se llama automáticamente al método Update().

Durante la ejecución del método Update(), la caché genera una serie de eventos: primero los eventos de nivel de campo y, a continuación, los eventos de nivel de fila. Durante el proceso de actualización, tiene acceso a la versión modificada del registro de datos a través de la propiedad NewRow de los argumentos de evento en los controladores de eventos RowUpdating o la propiedad Row en otros controladores de eventos.

La siguiente figura ilustra la secuencia de eventos generados durante la actualización de un registro de datos.

Actualización de un registro de datos

El evento RowUpdating se desencadena antes de que se produzca la actualización, mientras que el evento RowUpdated se desencadena después de la actualización. Puedes controlar estos eventos y tiene acceso al registro de datos actualizado y a la versión anterior del registro de datos que se mantiene en el objeto PXCache. La actualización real se produce entre estos dos eventos cuando el registro de datos se copia en el objeto PXCache.

Cuando se actualiza un registro de datos, se generan los siguientes eventos de campo de datos para cada campo de datos actualizado:

  1. FieldUpdating
  2. FieldVerifying
  3. FieldUpdated

A continuación, los eventos de registro de datos se generan de la siguiente manera:

  1. RowUpdating se ejecuta. En este momento, en la variable que representa los datos del evento, contiene la versión del registro de datos de la caché, mientras que contiene el registro de datos actualizado. Todavía puede detener la actualización mediante el lanzamiento de una instancia de PXException. e.Rowe e.NewRow
  2. Si no es igual a: e.Canceltrue
    1. RowSelected se ejecuta. Solo se puede acceder al registro de datos actualizado a través de .e.Row
    2. RowUpdated se ejecuta. Ahora contiene la instancia actualizada, mientras que contiene una copia del registro de datos anterior con los valores anteriores. e.Rowe.OldRow

Eliminación de un registro de datos

Cuando un usuario elimina un registro de datos a través de la interfaz de usuario, el sistema llama al método Delete() de la caché correspondiente. Si necesita eliminar un registro de datos en el código, también debe llamar al método Delete() de PXCache o de la vista de datos (que simplemente llama al método Delete() de PXCache).

Mientras se elimina un registro de datos, la memoria caché genera un aserie de eventos. Antes de que se desencadenen los eventos RowDeleting y RowDeleted, el registro de datos se coloca en la memoria caché y se le asigna y se le asigna el estado Deleted o el estado InsertedDeleted (lo que significa que el registro de datos se ha insertado pero aún no se ha guardado en la base de datos). Si se cancela la operación de eliminación, el registro de datos volverá al estado anterior y no se generará el evento RowDeleted.

La siguiente figura ilustra la secuencia de eventos generados durante la eliminación de un registro de datos.

Eliminación de un registro de datos.

Si la eliminación ha sido iniciada por un usuario en la interfaz de usuario o a través de la API de servicios web, se generan los siguientes eventos de campo para cada campo de datos clave antes de que se generen otros eventos:

  1. FieldUpdating
  2. FieldUpdated

A continuación, independientemente de cómo se haya iniciado la eliminación, los eventos de registro de datos se generan de la siguiente manera:

  1. RowDeleting se ejecuta. En este punto, aún puedes detener la eliminación mediante el lanzamiento de una instancia de PXException. En la variable que representa los datos del evento, contiene el registro de datos que se está eliminando. e e.Row
  2. Si no es igual a: e.Cancel true
    1. RowDeleted y sigue manteniendo el registro de datos. e.Row
    2. RowSelected se eleva, y es igual a . e.Row NULL

El registro de datos se revertirá al estado anterior y el evento RowDeleted no se generará si se cancela la operación de eliminación.

Guardar cambios en la base de datos

Un graph proporciona el guardado transaccional de cambios de todos los objetos de caché en la base de datos. El graph confirma los datos en la base de datos cuando invocas el método Actions.PressSave() del gráfico o cuando el usuario hace clic en Guardar en la interfaz de usuarios. En ambos casos, se invoca el método Persist() del graph. El método Actions.PressSave() también verifica que la acción Guardar exista en el graph y esté habilitada. Después de esto, la acción Guardar invoca el método Persist().

El proceso general de guardar los cambios de los objetos de caché en la base de datos
Proceso de guardar los cambios de un grupo de objetos de caché en la base de datos

Cuando se genera el evento RowPersisting, se puede cancelar el guardado de una fila determinada en la base de datos estableciendo la propiedad e.Cancel en el controlador de gráficos del evento.

La siguiente figura ilustra la secuencia de eventos generados durante el guardado de un registro de datos.

Guardar (confirmar) un registro de datos en la base de datos

Cuando los cambios se guardan en la base de datos, los eventos se generan de la siguiente manera:

  1. RowPersisting se ejecuta. En este momento, ya se ha abierto una transacción de base de datos. Si alguno de los controladores se establece en true, el proceso se cancelará. Para cancelar el proceso de confirmación de cambios e indicar el error al usuario, debe iniciar la excepción PXException.e.Cancel
  2. Si no es igual a verdadero: e.Cancel
    1. RowPersisted se ejecuta. La operación de confirmación para el registro de datos actual se ha completado, pero la transacción sigue abierta: es igual a .e.Rowe.TranStatusOpen
    2. RowPersisted se ejecuta una vez más, ya sea con igual a Completado (si todos los cambios se han guardado correctamente) o con igual a Abortado si se ha producido un error y se han cancelado todos los cambios. e.TranStatuse.TranStatus

Si quieres entrar más en detalle con cada controlador de eventos puedes ver el Listado de Eventos en la página de ayuda oficial de Acumatica. Adicional te recomendamos leer esta otra entrada con los tipos de pantalla de Acumatica

Si está evaluando un ERP para su empresa, esto se resuelve de raíz con un ERP. Vea cómo funciona el ERP Acumatica que implementamos en México.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *