Триггеры 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 и старое значение обновляемых записей.