Apex - gatilhos
Os gatilhos do Apex são como procedimentos armazenados que são executados quando ocorre um determinado evento. Um gatilho é executado antes e depois da ocorrência de um evento no registro.
Sintaxe
trigger triggerName on ObjectName (trigger_events) { Trigger_code_block }
Executando o gatilho
A seguir estão os eventos em que podemos disparar o gatilho -
- insert
- update
- delete
- merge
- upsert
- undelete
Exemplo 1 de gatilho
Suponha que recebemos um requisito de negócios de que precisamos criar um Registro de Fatura quando o campo 'Status do Cliente' do Cliente muda para Ativo de Inativo. Para isso, criaremos um gatilho no objeto APEX_Customer__c seguindo estas etapas -
Step 1 - Vá para sObject
Step 2 - Clique em Cliente
Step 3 - Clique no botão 'Novo' na lista relacionada do acionador e adicione o código do acionador conforme abaixo.
// 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;
}
Explicação
Trigger.new- Esta é a variável de contexto que armazena os registros atualmente no contexto do acionador, sendo inseridos ou atualizados. Neste caso, esta variável contém os registros do objeto Cliente que foram atualizados.
Existem outras variáveis de contexto que estão disponíveis no contexto - trigger.old, trigger.newMap, trigger.OldMap.
Exemplo de gatilho 2
O gatilho acima será executado quando houver uma operação de atualização nos registros do Cliente. Suponha que o registro da fatura precise ser inserido apenas quando o Status do cliente mudar de Inativo para Ativo e não sempre; para isso, podemos usar outra variável de contextotrigger.oldMap que armazenará a chave como id de registro e o valor como valores de registro antigos.
// 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;
}
Explicação
Usamos a variável Trigger.oldMap que, conforme explicado anteriormente, é uma variável de contexto que armazena o Id e o valor antigo dos registros que estão sendo atualizados.