Suivez votre progression
Accueil Trailhead
Accueil Trailhead

Optimisation à l’aide de formules avancées

Objectifs de formation

Une fois cette unité terminée, vous pourrez :
  • Mettre en œuvre des formules avancées pour répondre à des cas d’utilisation complexes
  • Écrire des formules claires et faciles à comprendre

Formules avancées

Dans ce module, nous avons abordé de nombreuses formules complexes. Cependant, il n’est pas toujours simple de concevoir une formule en mesure de répondre à un problème commercial. Cette unité vous présente quelques astuces qui vous permettront de concrétiser vos idées de formules.

Écriture de la formule en langage courant

Lorsque vous avez une idée de formule, réfléchissez-y en langage courant avant de tenter de l’écrire dans l’éditeur de formule avancée. Commencez par vous demander quel est votre objectif et décrivez-le comme si vous conversiez avec quelqu’un.

Cet exemple provient de la communauté Trailblazer Community de Salesforce : imaginons que vous ayez pour objectif de faire en sorte que si une opportunité est marquée comme « Fermée perdue » par une personne autre qu’un administrateur système, cette dernière ait à fournir une explication.

Pour les besoins de cet exemple, nous supposons que des raisons valables pour la perte d’une opportunité sont déjà renseignées dans le champ de liste de sélection personnalisée Motif de la perte. Comme personne ne doit pouvoir sauvegarder un enregistrement sans fournir de justification, nous utilisons une formule de règle de validation pour parvenir au résultat recherché.

En langage courant, votre formule est la suivante :

afficher une erreur lorsque l’Étape d’une opportunité est définie sur « Fermée perdue » par une personne qui n’est pas un administrateur système et que le champ Motif de la perte n’est pas renseigné.

Une fois que vous aurez écrit votre formule, recherchez-y des mots clés tels que « et », « ou » et « si », correspondant aux fonctions que nous avons utilisées tout au long de ce module. Ces fonctions sont les éléments constitutifs de formules plus volumineuses et complexes : les repérer dans vos cas d’utilisation vous aide à mettre en œuvre lesdites formules.

Pour vérifier que l’utilisateur n’est pas un administrateur système, insérez $Profile.Name, un champ de fusion qui représente le profil apportant des modifications à l’enregistrement. Pour vérifier si le paramètre StageName a été mis à jour, utilisez ISCHANGED(). ISCHANGED() renvoie « true » si la valeur actuelle d’un champ diffère de sa valeur précédente.

ISPICKVAL() vous permet de vérifier le reste de vos exigences. Pour en savoir plus sur la fonction ISPICKVAL(), consultez l’unité Utilisation de listes de sélection dans les formules.

  1. Dans Configuration, accédez à Gestionnaire d’objet via la case Recherche rapide.
  2. Cliquez sur Opportunité | Règles de validation.
  3. Cliquez sur Nouveau.
  4. Dans Nom de la règle, saisissez Motif de la perte requis.
  5. Dans Formule de condition d’erreur, saisissez la formule suivante :
    AND(
      $Profile.Name <> "System Administrator",
      ISCHANGED(StageName),
      ISPICKVAL(StageName, "Closed Lost"),
      ISPICKVAL(Loss_Reason__c, "")
    )
  6. Dans Message d’erreur, saisissez « Aucune opportunité ne peut être marquée comme Fermée perdue sans que le champ Motif de la perte ne soit renseigné ».
  7. Sélectionnez Champ et Motif de la perte comme emplacement de l’erreur.
  8. Cliquez sur Enregistrer.

Dorénavant, à chaque fois qu’un utilisateur qui n’est pas un administrateur système marque une opportunité comme étant Fermée perdue, un message d’erreur s’affichera.

Utilisation d’un espacement et d’un formatage clairs

Les formules sont plus faciles à lire et à comprendre lorsque vous utilisez un espacement et un formatage appropriés. Lors de notre travail sur les formules de texte, nous avions écrit une formule qui attribuait de manière dynamique une note à une piste en fonction de son pays, de son chiffre d’affaires et de sa source.

IF(AND(AnnualRevenue > 1000000, CONTAINS(CASE(Country,
"United States", "US", "America", "US", "USA", "US", "US", "US",
"NA"), "US")), IF(ISPICKVAL(LeadSource, "Partner Referral"),
"Hot", IF(OR(ISPICKVAL (LeadSource, "Purchased List"),
ISPICKVAL(LeadSource, "Web")), "Warm”, "Cold")), "Cold")

Bien que cette formule soit correcte sur le plan de la syntaxe, il est presque impossible de déterminer ce qu’elle fait ou comment fonctionne sa logique. Les espaces et les retours à la ligne n’ayant pas d’incidence sur le fonctionnement des formules, il est facile de rendre celles-ci plus lisibles en les aérant. Voici la même formule, dont la présentation a été remaniée à l’aide de retraits et de retours à la ligne.

IF(
  AND(AnnualRevenue > 1000000,
  CONTAINS(CASE(Country, "United States", "US", "America",
    "US", "USA", "US", "US", "US", "NA"), "US")),
  IF(
    ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
    IF(
      OR(
        ISPICKVAL(LeadSource, "Purchased List"),
        ISPICKVAL(LeadSource, "Web")
      ), "Warm”, "Cold"
    )
  ), "Cold"
)

Bien que le formatage des formules ne soit pas soumis à des règles strictes, nous vous recommandons d’utiliser un retrait de deux espaces à chaque fois que vous imbriquez une instruction logique. En procédant ainsi de manière adéquate et cohérente, il vous sera plus simple d’identifier la fonction dans laquelle vous travaillez et d’éviter des erreurs dans le placement des parenthèses.

Pour rendre les instructions logiques plus faciles à lire, vous pouvez également remplacer les fonctions par des opérateurs logiques. Lorsque vous utilisez && au lieu de AND() ou || au lieu de OR(), il est plus facile de suivre le flux logique de votre formule. Voici à nouveau la même formule, qui emploie cette fois && et || au lieu de AND() et OR().

IF(
  AnnualRevenue > 1000000 &&
  CONTAINS(CASE(Country, "United States", "US", "America", "US",
    "USA", "US", "US", "US", "NA"), "US"),
  IF(
    ISPICKVAL(LeadSource, "Partner Referral"), "Hot",
    IF(
      ISPICKVAL(LeadSource, "PurchasedList") ||
      ISPICKVAL(LeadSource, "Web"),
      "Warm", "Cold"
    )
  ), "Cold"
)

La simplicité a du bon

Lors de l’écriture d’une formule complexe, il est facile de se perdre dans les instructions logiques imbriquées et les références à d’autres champs. Souvent, la formule la plus simple est la meilleure.

Cette formule de règle de validation renvoie la valeur true si la date de clôture d’une opportunité n’est pas dans le mois en cours.
OR (
CloseDate < DATE( YEAR(TODAY()), MONTH(TODAY()), 1),
IF (
AND (
MONTH (TODAY() ) =1,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =2,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 28)),
true,
IF (
AND (
MONTH (TODAY() ) =3,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =4,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =5,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =6,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =7,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =8,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =9,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =10,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true,
IF (
AND (
MONTH (TODAY() ) =11,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 30)),
true,
IF (
AND (
MONTH (TODAY() ) =12,
CloseDate > DATE( YEAR(TODAY() ), MONTH(TODAY() ), 31)),
true, false
)))))))))))))
Ce processus de vérification complexe détermine si la valeur de date de clôture est antérieure au premier jour du mois en cours ou ultérieure au dernier jour de ce même mois. Toutefois, le jour n’est en fait d’aucune d’importance : si le mois et l’année de la date de clôture sont les mêmes que ceux du mois en cours, alors il s’agit forcément du même mois. Nous pouvons donc réécrire la formule comme suit :
NOT(
  AND(
    MONTH( CloseDate ) = MONTH( TODAY() ),
    YEAR( CloseDate ) = YEAR( TODAY() )
  )
)
Cette nouvelle version est beaucoup plus lisible et ne contient que 200 caractères, contre plus de 3 000 pour la formule originale. Si votre formule vous semble plus complexe qu’elle ne devrait l’être, c’est probablement le cas. Essayez alors d’aborder le problème sous un angle différent pour simplifier les choses.