Uno dei principali gradi di personalizzazione di un qualsiasi software è quello di essere in grado di eseguire azioni quando una delle seguenti operazioni viene eseguita:
- Inserimento nel database
- Aggiornamento di dati su un database
- Eliminazione di un record dal database
In Salesforce esistono alcuni tool “point and click” che consentono di eseguire delle operazioni automatiche quando un record viene inserito e/o aggiornato (per saperne di più clicca qui e qui).
Per quanto i tool “point and click” stiano diventando più potenti ad ogni nuova release di Salesforce, esistono però alcune operazioni che non possono essere effettuate tramite questi strumenti. In questi casi è necessario ricorrere al codice.
Per questo motivo esistono dei meccanismi Apex, chiamati trigger, che consentono di effettuare operazioni automatiche prima o dopo l’inserimento, aggiornamento o eliminazione di un record dal database.
Tipi di triggers
Esistono essenzialmente 2 tipi di trigger:
- I trigger cosiddetti “Before” perchè effettuano le operazioni scritte prima del salvataggio vero e proprio (commit) su database
- I trigger detti “After” perchè effettuano le operazioni soltanto dopo che il record è stato salvato (la commit è già stata effettuata) sul database
In base al tipo di trigger che si sceglie possono essere effettuate o meno alcune operazioni.
Nei trigger di tipo “Before” si può:
- Effettuare delle validazioni sul record prima di salvarlo (per esempio validazioni riguardo la formattazione di un campo ecc.)
- Aggiornare i valori di alcuni campi prima che il salvataggio venga effettuato. In questo modo si evita di dover effettuare un secondo aggiornamento più tardi.
Nei trigger di tipo “After” si può:
- Si ha accesso ai campi che verranno salvati quando si effettua il commit vero e proprio (per esempio nei trigger di tipo after si ha accesso all’Id Salesforce del record appena salvato)
- Si possono effettuare operazioni di inserimento/aggiornamento sui record che hanno una relazione con l’oggetto su cui è scattato il trigger (per esempio una volta cambiato un valore su un Account su cui è scattato il trigger, si possono aggiornare tutti i relativi contact con questo valore ecc.)
Anatomia di un trigger
Nello snippet di codice seguente trovi la struttura di un tipico trigger:
trigger ExampleAccountTrigger on Account (before insert, after insert) {
if (Trigger.isInsert) {
if (Trigger.isBefore) {
// Process before insert
} else if (Trigger.isAfter) {
// Process after insert
}
}
Alcuni punti da sottolineare:
- È necessario dichiarare il trigger con la parola riservata “trigger”.
- Un trigger deve essere esplicitamente legato ad un oggetto e si utilizza “on NomeOggetto” come sintassi.
- Nella prima riga tra parentesi, bisogna esplicitamente registrare a quale evento il trigger dovrà scattare. Nel nostro esempio abbiamo scelto “before insert, after insert”, ma esistono anche i valori: before update, after update, before delete, after delete.
- Quando un trigger è registrato a diversi tipi di eventi (insert, update ecc.), per evitare che le istruzioni scritte vengano eseguite ad ogni evento, si utilizzano le variabili d’ambiente “Trigger.isNomeDellEvento” e poi “isBefore/isAfter” per specificare se si tratta di un evento prima del commit o dopo il commit nel database.
Come accedere ai record all’interno di un trigger
Quando si scrive un nuovo trigger, è necessario accedere ai record che hanno subito la modifica.
Esistono delle variabili d’ambiente, liste e mappe che consentono di accedere ai record inseriti, modificati e/o cancellati. Le variabili d’ambiente che contengono i record modificati sono le seguenti:
- Trigger.new è una lista che contiene i record dopo la modifica.
- Trigger.old è una lista che contiene i record prima della modifica. Particolarmente utile quando bisogna verificare il valore di un campo prima della modifica.
- Trigger.newMap è una mappa in cui la chiave è l’id del record e il value è il record dopo la modifica.
- Trigger.oldMap è una mappa in cui la chiave è l’id del record e il value è il record prima la modifica.
Alcune eccezioni alla disponibilità di queste variabili:
- Trigger.old e Trigger.oldMap non sono disponibili per l’evento “before insert” (se ci pensi ha senso: se stai inserendo adesso non esiste il record prima dell’inserimento)
- Trigger.new e Trigger.newMap non sono disponibili in un evento “after delete”
- Trigger.newMap non è disponibile per l’evento “before insert” (prima dell’inserimento l’id di un record non è disponibile)
Di seguito trovi un piccolo snippet su come utilizzare Trigger.new in un trigger “before insert” per aggiornare un qualsiasi campo sull’oggetto. Da notare che essendo un before insert, non è necessario scrivere esplicitamente l’operazione di inserimento dell’account.
trigger ExampleAccountTrigger on Account (before insert, after insert) {
if (Trigger.isInsert) {
if (Trigger.isBefore) {
for(Account account : Trigger.new){
account.source = 'business';
}
}
}
}
Considerazioni finali
Questo articolo vuole rappresentare una panoramica generica rispetto al mondo dei trigger. Se vuoi approfondire la conoscenza dei trigger, un primo step potrebbe essere completare i trailhead che trovate a questo link.
Alla prossima guida!