Apex - Триггеры

Триггеры Apex похожи на хранимые процедуры, которые выполняются при наступлении определенного события. Триггер выполняется до и после того, как событие произошло в записи.

Синтаксис

trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }

Выполнение триггера

Ниже приведены события, по которым мы можем запустить триггер.

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

Пример триггера 1

Предположим, мы получили бизнес-требование о том, что нам необходимо создать запись счета-фактуры, когда поле «Статус клиента» меняется с «Активно» на «Неактивно». Для этого мы создадим триггер для объекта APEX_Customer__c, выполнив следующие шаги:

Step 1 - Перейти к sObject

Step 2 - Нажмите "Клиент"

Step 3 - Нажмите кнопку «Новый» в списке связанных триггеров и добавьте код триггера, как показано ниже.

// 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;
}

Объяснение

Trigger.new- Это контекстная переменная, в которой хранятся записи, которые в данный момент находятся в контексте триггера, либо вставляемые, либо обновляемые. В этом случае эта переменная содержит обновленные записи объекта «Клиент».

Есть и другие переменные контекста, которые доступны в контексте - trigger.old, trigger.newMap, trigger.OldMap.

Пример запуска 2

Вышеупомянутый триггер будет выполняться, когда есть операция обновления для записей клиента. Предположим, запись счета-фактуры необходимо вставлять только тогда, когда Статус клиента меняется с Неактивный на Активный, а не каждый раз; для этого мы можем использовать другую переменную контекстаtrigger.oldMap который будет хранить ключ как идентификатор записи и значение как старые значения записи.

// 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;
}

Объяснение

Мы использовали переменную Trigger.oldMap, которая, как объяснялось ранее, является контекстной переменной, в которой хранятся идентификатор и старое значение обновляемых записей.