18/7/2024

L’incontournable Apex Dynamique

Flexibilité et réutilisabilité pour vos apps Salesforce

Flexibilité et réutilisabilité pour vos apps Salesforce

Afin de mettre en place des applications flexibles et réutilisables, la mise en place d’Apex dynamique est un must have

Voyons en quoi cela consiste. 

Qu'est-ce que l’Apex dynamique ?

Apex est un langage orienté objet typé statiquement, mais il possède des fonctionnalités de langage de programmation dynamique. Par exemple, il est possible de créer des classes et des méthodes génériques pouvant fonctionner avec n'importe quel objet standard ou personnalisé au lieu de coder en dur les noms et les champs d'objet.

Ce facteur de réutilisabilité est excellent et peut être utilisé pour une couche d'accès aux données générique qui peut interroger/insérer/mettre à jour n'importe quel objet, et ce, même lors de l'intégration avec des systèmes externes où la logique d'intégration peut être sujette à des changements.

Presque tous les frameworks Apex (ou tout produit Salesforce ISV) utiliseront les fonctionnalités dynamiques du langage. Cela permet que les modifications apportées à la configuration d'une organisation soient reflétées dans le code sans avoir à modifier les métadonnées.

Ainsi, la logique qui aura été écrite ne dépendra pas d’un objet en particulier mais s’adaptera en fonction de l’objet reçu en paramètre. En outre, il est possible de rendre les requêtes SOQL, SOSL ainsi que les instructions DML dynamiques.

Voici quelques cas d'utilisation qui vont permettre d’illustrer les cas d’usage d’Apex Dynamique.

Accès au sObject et au champs décrivant les informations

Le Schema Programming dans Salesforce permet de dynamiser les applications. Il s’agit d’une classe système disposant de différentes méthodes qui permettra de disposer d’un descriptif pour un ou plusieurs sObjects. Ainsi, il sera possible de récupérer les informations de métadonnées relatives à un sObject telles que le nom, le type et l'étiquette du sObject, les champs et les objets enfants. Cette classe permet également de connaître les informations de description d'un champ comme la longueur du champ, le type, etc.

La documentation Salesforce à ce propos peut être trouvée ici.

SOQL, SOSL et DML Dynamiques

Dans Salesforce, le SOQL et SOSL dynamique fait référence à la génération d'une requête SOQL / SOSL de type String au moment de l'exécution du code Apex. 

Sur la base des entrées utilisateur, les requêtes sont créées et exécutées avec des méthodes de base de données prédéfinies. 

L’utilisation de DML (Data Manipulation Language) dynamique, permet entre autre de créer un enregistrement de manière dynamique et de l'insérer dans la base de données..

Apex Describe

Apex Describe permet de décrire les sObjects en utilisant leur Token les sObjects à l'aide de jetons ou de la méthode describeSObjects de la classe Schema.

  • Token – une référence à un sObject ou à un champ validé au moment de la compilation.
  • Méthode describeSObjects – une méthode de la classe Schema qui implémente des descriptions sur un ou plusieurs types sObject.
  • Description du résultat – un objet de type Schema.DescribeSObjectResult qui contient toutes les propriétés d’un sObject ou d'un champ. Lors de l'implémentation de la description à l'aide du jeton sObject ou de la méthode describeSObjects, l'objet issu du  résultat est renvoyé.

Exemple de Token pour l’objet Account

Afin de récupérer le Token (jeton) d’un champ on procédera comme ci-après :

Le résultat de la récupération du champ Account.Description sera comme suit : 

On utilisera la méthode DescribeFieldResult() afin d’obtenir les métadonnées d’un champ :

Le résultat pour ce champ sera ainsi : 

Afin de décrire un sObject à l’aide de la classe Schema : 

Ci-après, vous visualiserez les entrées loguées dans la console développeur : 

Exemple de SOQL Dynamique

(API version 57.0 et ultérieure)

Une des options possible consiste à utiliser la méthode Database.queryWithBinds. Avec cette méthode, les variables de liaison dans la requête sont résolues à partir d'un paramètre Map directement avec une clé, plutôt qu'à partir d’une variable de code Apex. Cela supprime la nécessité que les variables soient dans le scope lorsque la requête est exécutée. 

L’exemple ci-après montre une requête SOQL utilisant une variable de liaison pour un nom de compte ; sa valeur est transmise avec la map acctBinds .

Les méthodes Database.query et Database.queryWithBinds peuvent être utilisées partout où une requête SOQL peut être utilisée. Les résultats sont traités à peu près de la même manière que les requêtes SOQL statiques. 

Fonctionnement : 

Le code récupère essentiellement la valeur du champ standard Id de l’enregistrement de l'objet Account nommé “Salesforce” (réputé unique) et le stocke dans la variable accRecord. Une fois la requête exécutée, il sera possible de parcourir l’enregistrement pour le manipuler ou examiner les valeurs du champ Id.

Il s'agit d'un modèle courant pour construire dynamiquement une requête SOQL dans Apex basée sur des variables prédéfinies pour les noms d'objet et de champ. Il est également possible de rendre les noms d'objet et les noms de champs dynamiques en utilisant des métadonnées personnalisées ou des paramètres personnalisés via l'interface utilisateur ou par programme.

Le résultat logué dans la console sera le suivant : 

Exemple de SOSL Dynamique 

Les instructions SOSL dynamiques sont évaluées en une liste de listes de sObjects, où chaque liste contient les résultats de recherche pour un type de sObject particulier. Les listes de résultats sont toujours renvoyées dans le même ordre que celui spécifié dans la requête SOSL dynamique. D'après l'exemple ci-après, les résultats de Compte sont d'abord retournés, puis Contact et enfin Lead.

Les requêtes SOSL dynamiques ont les mêmes limites de gouverneur que les requêtes statiques.

Exemple de gestion des autorisations

L’utilisation de l’Apex Dynamique peut être utilisée afin de vérifier les autorisations des utilisateurs pour accéder aux objets ou aux champs.

Un scénario utile ici consiste à utiliser les méthodes de description de la classe Schema afin de vérifier la sécurité au niveau du champ. Il est possible de  déterminer par programme si l'utilisateur actuel a accès au champ « E-mail » sur l'objet « Contact » dans cet exemple, ce qui peut être utile pour appliquer la sécurité au niveau du champ dans une organisation ou une application.

Conclusion

Il existe différentes manières de rendre son code plus dynamique et réutilisable à travers différentes applications. 

Le code Apex Dynamique offre une multitude d'opportunités aux développeurs Salesforce, en leur permettant d'écrire du code à la fois flexible et puissant. De la gestion des autorisations à la création de requêtes dynamiques en passant par la création de frameworks puissants, Dynamic Apex est un outil essentiel pour le développement Salesforce moderne.

La puissance de Dynamic Apex réside dans sa capacité à s'adapter et à répondre aux exigences changeantes sans qu'il soit nécessaire de modifier la structure du code. En comprenant ses fonctionnalités, ses cas d'utilisation et ses meilleures pratiques, les développeurs peuvent exploiter cette fonctionnalité à son plein potentiel, en créant des applications robustes, adaptables et innovantes.

Sources : 

Contactez-nous pour un échange personnalisé.

Je contacte !