Introduzione ai trigger di Salesforce

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: 

  1. I trigger cosiddetti “Before” perchè effettuano le operazioni scritte prima del salvataggio vero e proprio (commit) su database
  2. 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!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *