Création et gestion de déclencheurs (Triggers) dans Salesforce
Objectifs
- Comprendre ce qu’est un déclencheur (Trigger) Apex dans Salesforce.
- Apprendre à créer et déployer des déclencheurs Apex.
- Comprendre les différents contextes d’exécution des déclencheurs.
- Apprendre à gérer les déclencheurs pour maintenir des performances et une organisation efficaces.
Prérequis
- Un compte Salesforce. Vous pouvez en créer un gratuitement sur Salesforce Developer.
- Connexion à votre compte Salesforce.
1. Qu’est-ce qu’un déclencheur (Trigger) Apex ?
Un déclencheur Apex est un morceau de code qui s’exécute automatiquement en réponse à certains événements sur des enregistrements Salesforce, tels que l’insertion, la mise à jour ou la suppression d’un enregistrement. Les déclencheurs sont utilisés pour effectuer des opérations avant ou après les événements DML (Data Manipulation Language).
Types de déclencheurs :
- Avant les événements (before insert, before update, before delete)
- Après les événements (after insert, after update, after delete, after undelete)
2. Création d’un déclencheur Apex
Exemple : Déclencheur Simple sur l’objet Account
- Accéder à l’éditeur Apex
- Connectez-vous à Salesforce et naviguez vers Setup.
- Dans la barre de recherche rapide, tapez “Apex Triggers” et sélectionnez Apex Triggers.
- Cliquez sur New pour créer un nouveau déclencheur.
- Écrire le déclencheur
- Nom du déclencheur :
AccountTrigger
- Objet associé :
Account
- Code du déclencheur :
- Nom du déclencheur :
trigger AccountTrigger on Account (before insert) {
for (Account acc : Trigger.new) {
acc.Description = 'New Account Created: ' + acc.Name;
}
}
- Cliquez sur Save pour enregistrer le déclencheur.
3. Contextes d’exécution des déclencheurs
Les déclencheurs peuvent s’exécuter dans différents contextes, déterminés par des mots-clés spéciaux dans Apex :
Contexte | Description | Utilisation |
---|---|---|
Trigger.new | Liste des nouveaux enregistrements pour les déclencheurs d’insertion et de mise à jour. | Utilisé pour accéder aux enregistrements récemment insérés ou mis à jour. |
Trigger.old | Liste des anciens enregistrements pour les déclencheurs de mise à jour et de suppression. | Utilisé pour accéder aux valeurs avant la mise à jour ou la suppression. |
Trigger.newMap | Map des nouveaux enregistrements par leur ID pour les déclencheurs d’insertion et de mise à jour. | Permet de récupérer rapidement un enregistrement à partir de son ID après insertion ou mise à jour. |
Trigger.oldMap | Map des anciens enregistrements par leur ID pour les déclencheurs de mise à jour et de suppression. | Permet de récupérer rapidement un enregistrement à partir de son ID avant mise à jour ou suppression. |
Trigger.isExecuting | Renvoie true si le déclencheur est en cours d’exécution. | Utilisé pour vérifier si le déclencheur est actuellement exécuté. |
Trigger.isInsert | Renvoie true si le déclencheur a été invoqué par une opération d’insertion. | Utilisé pour déterminer si l’événement DML déclencheur est une insertion. |
Trigger.isUpdate | Renvoie true si le déclencheur a été invoqué par une opération de mise à jour. | Utilisé pour déterminer si l’événement DML déclencheur est une mise à jour. |
Trigger.isDelete | Renvoie true si le déclencheur a été invoqué par une opération de suppression. | Utilisé pour déterminer si l’événement DML déclencheur est une suppression. |
Trigger.isBefore | Renvoie true si le déclencheur est avant un événement DML. | Utilisé pour exécuter la logique avant que l’événement DML ne se produise. |
Trigger.isAfter | Renvoie true si le déclencheur est après un événement DML. | Utilisé pour exécuter la logique après que l’événement DML s’est produit. |
Explications détaillées
- Trigger.new et Trigger.old : Utilisez ces contextes pour accéder aux enregistrements avant et après les événements de déclenchement respectivement. Par exemple, lors de l’insertion d’un nouvel enregistrement,
Trigger.new
contiendra les valeurs de l’enregistrement inséré. - Trigger.newMap et Trigger.oldMap : Utilisez ces maps pour accéder rapidement aux enregistrements par leur ID. Cela est particulièrement utile lorsque vous avez besoin de comparer les valeurs d’un enregistrement avant et après une mise à jour.
- Trigger.isExecuting : Vérifie si le déclencheur est actuellement en cours d’exécution, ce qui peut être utile pour éviter des boucles infinies ou des appels récursifs.
- Trigger.isInsert, Trigger.isUpdate, et Trigger.isDelete : Utilisez ces contextes pour déterminer le type d’événement DML qui a déclenché l’exécution du déclencheur. Cela permet de conditionner l’exécution du code en fonction de l’opération en cours.
- Trigger.isBefore et Trigger.isAfter : Utilisez ces contextes pour exécuter la logique avant ou après l’événement DML respectivement. Par exemple, vous pouvez valider ou modifier des valeurs d’enregistrement avant leur insertion en utilisant
Trigger.isBefore
.
4. Gestion des déclencheurs
Meilleures pratiques pour gérer les déclencheurs
- Un déclencheur par objet : Limitez un seul déclencheur par objet pour simplifier la gestion et la maintenance du code.
- Utiliser des gestionnaires de déclencheurs : Déléguez la logique des déclencheurs à des classes de gestionnaires séparées.
- Gérer les exécutions en masse : Écrivez du code qui peut traiter plusieurs enregistrements à la fois pour respecter les limites de gouvernance de Salesforce.
Exemple : Gestionnaire de déclencheurs
- Créer la classe de gestionnaire
- Dans l’éditeur Apex, créez une nouvelle classe nommée
AccountTriggerHandler
. - Code de la classe :
- Dans l’éditeur Apex, créez une nouvelle classe nommée
public class AccountTriggerHandler {
public static void onBeforeInsert(List<Account> newAccounts) {
for (Account acc : newAccounts) {
acc.Description = 'New Account Created: ' + acc.Name;
}
}
}
- Modifier le déclencheur pour utiliser le gestionnaire
- Code du déclencheur modifié :
trigger AccountTrigger on Account (before insert) {
if (Trigger.isBefore && Trigger.isInsert) {
AccountTriggerHandler.onBeforeInsert(Trigger.new);
}
}
5. Exemples avancés de déclencheurs
Déclencheur avant mise à jour
Mettre à jour le champ Last_Activity_Date__c
lorsque le champ Activity__c
change.
trigger AccountTrigger on Account (before update) {
for (Account acc : Trigger.new) {
Account oldAcc = Trigger.oldMap.get(acc.Id);
if (acc.Activity__c != oldAcc.Activity__c) {
acc.Last_Activity_Date__c = Date.today();
}
}
}
Déclencheur après suppression
Supprimer les contacts associés lorsqu’un compte est supprimé.
trigger AccountTrigger on Account (after delete) {
List<Contact> contactsToDelete = [SELECT Id FROM Contact WHERE AccountId IN :Trigger.oldMap.keySet()];
delete contactsToDelete;
}
Conclusion
Vous avez maintenant appris les bases de la création et de la gestion des déclencheurs Apex dans Salesforce. Vous savez comment écrire des déclencheurs pour différentes opérations DML et comment organiser le code des déclencheurs pour une gestion efficace. En suivant ces meilleures pratiques, vous pouvez maintenir la performance et la lisibilité de votre code Apex.