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.