Учебники

Апекс — Триггеры

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

Синтаксис

trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }

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

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

  • вставить
  • Обновить
  • удалять
  • сливаться
  • upsert
  • восстановить

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

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

Шаг 1 — Перейти к sObject

Шаг 2 — Нажмите на клиента

Шаг 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 — это переменная контекста, которая хранит записи, которые в настоящее время находятся в контексте триггера, либо вставляются, либо обновляются. В этом случае эта переменная содержит записи объекта Customer, которые были обновлены.

Существуют другие контекстные переменные, которые доступны в контексте — 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, которая, как объяснялось ранее, является контекстной переменной, которая хранит Id и старое значение обновляемых записей.