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