Apex - Gatillos

Los disparadores de Apex son como procedimientos almacenados que se ejecutan cuando ocurre un evento en particular. Un disparador se ejecuta antes y después de que ocurra un evento registrado.

Sintaxis

trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }

Ejecutando el gatillo

Los siguientes son los eventos en los que podemos disparar el gatillo:

  • insert
  • update
  • delete
  • merge
  • upsert
  • undelete

Ejemplo de activador 1

Supongamos que recibimos un requisito comercial de que debemos crear un Registro de factura cuando el campo 'Estado del cliente' del cliente cambia a Activo de Inactivo. Para esto, crearemos un disparador en el objeto APEX_Customer__c siguiendo estos pasos:

Step 1 - Ir a sObject

Step 2 - Haga clic en Cliente

Step 3 - Haga clic en el botón 'Nuevo' en la lista relacionada Desencadenador y agregue el código de disparo como se indica a continuación.

// Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   List InvoiceList = new List();
   
   for (APEX_Customer__c objCustomer: Trigger.new) {
      
      if (objCustomer.APEX_Customer_Status__c == 'Active') {
         APEX_Invoice__c objInvoice = new APEX_Invoice__c();
         objInvoice.APEX_Status__c = 'Pending';
         InvoiceList.add(objInvoice);
      }
   }
   
   // DML to insert the Invoice List in SFDC
   insert InvoiceList;
}

Explicación

Trigger.new- Esta es la variable de contexto que almacena los registros que se encuentran actualmente en el contexto de activación, ya sea que se estén insertando o actualizando. En este caso, esta variable tiene los registros del objeto Cliente que se han actualizado.

Hay otras variables de contexto que están disponibles en el contexto: trigger.old, trigger.newMap, trigger.OldMap.

Ejemplo de activador 2

El activador anterior se ejecutará cuando haya una operación de actualización en los registros del Cliente. Supongamos que el registro de la factura debe insertarse solo cuando el Estado del cliente cambia de Inactivo a Activo y no siempre; para esto, podemos usar otra variable de contextotrigger.oldMap que almacenará la clave como ID de registro y el valor como valores de registro antiguos.

// Modified Trigger Code
trigger Customer_After_Insert on APEX_Customer__c (after update) {
   List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
   
   for (APEX_Customer__c objCustomer: Trigger.new) {
      
      // condition to check the old value and new value
      if (objCustomer.APEX_Customer_Status__c == 'Active' &&
      
      trigger.oldMap.get(objCustomer.id).APEX_Customer_Status__c == 'Inactive') {
         APEX_Invoice__c objInvoice = new APEX_Invoice__c();
         objInvoice.APEX_Status__c = 'Pending';
         InvoiceList.add(objInvoice);
      }
   }
   
   // DML to insert the Invoice List in SFDC
   insert InvoiceList;
}

Explicación

Hemos utilizado la variable Trigger.oldMap que, como se explicó anteriormente, es una variable de contexto que almacena el Id y el valor antiguo de los registros que se están actualizando.