Skip to main content

Utilisation des variables fixes et des fonctions d’agrégation

Objectifs de formation

Une fois cette unité terminée, vous pourrez :

  • Rendre une requête dynamique en insérant des variables fixes Apex
  • Utiliser une fonction d’agrégation pour cumuler et résumer les données d’une requête
  • Appliquer un regroupement aux résultats de requête
  • Savoir quand utiliser la clause WHERE et quand utiliser la clause HAVING

Vidéo de démonstration Trail Together

Vous souhaitez être guidé pas à pas par un expert pendant que vous travaillez sur cette étape ? Regardez cette vidéo qui fait partie de la série Trail Together sur Trailhead Live.

(Ce clip commence à 1 h 10 min 42 s, au cas où vous voudriez revenir en arrière et regarder à nouveau le début de l’étape.)

Introduction

Nous avons expliqué comment écrire une requête SOQL de base et comment formuler des requêtes qui comportent des champs dans des objets parent ou enfant. Cependant, comme vous le savez, chaque projet de développement d’application est unique. Il est important de savoir comment adapter la logique métier pour résoudre un problème spécifique.

Variables fixes

L’utilisation de variables fixes vous permet d’adapter votre code. Cela revient à ouvrir un formulaire dans l’interface utilisateur et à modifier un champ de saisie pour rechercher certains résultats. Examinons un exemple dans l’application DreamHouse. Vous êtes un agent immobilier et vous souhaitez vérifier l’inventaire de vos propriétés dont le prix est inférieur à 200 000 $. Vous écrivez donc la requête suivante :

List<Property__c> property = [SELECT Id, Name, Price__c FROM Property__c WHERE Price__c < 200000];

Le processus est assez simple (pour vous), mais cette requête est statique. Elle renvoie systématiquement les maisons de moins de 200 000 $. Qu’en est-il des autres agents immobiliers et acheteurs potentiels qui ne peuvent pas écrire de requêtes SOQL et les exécuter dans la Developer Console ? Ils ont besoin d’un moyen plus simple de filtrer les maisons en fonction du prix qui leur convient. Comment pouvez-vous écrire une requête qui fonctionne pour un acheteur dont le budget est de 200 000 $ et pour un autre acheteur dont le budget est de 800 000 $ ? C’est là qu’interviennent les variables fixes. Une variable fixe est une variable Apex que vous utilisez dans une requête SOQL. Utilisez les variables fixes en tant qu’espaces réservés pour des valeurs spécifiques renseignées ultérieurement.

Remarque

Il ne s’agit pas d’un nouveau concept. Dans Programmation orientée objet pour les administrateurs, vous avez appris à utiliser un paramètre en tant qu’espace réservé dans une méthode. Lorsque vous appelez la méthode, vous transmettez un argument qui remplace ce paramètre. Une variable fixe dans une requête est l’équivalent d’un paramètre dans une méthode. La variable fixe est remplacée par une valeur spécifique lors de l’exécution de la requête.

Prenons l’exemple d’une variable fixe appelée maxHomeValue. Nous déclarons la variable dans Apex, puis utilisons cette variable dans une requête, comme suit :

Integer maxHomeValue = 200000;
List<Property__c> property = [SELECT Name, Price__c FROM Property__c WHERE Price__c < :maxHomeValue];

Vous remarquerez que dans la requête, la variable fixe est précédée d’un signe deux-points ( : ). Cette requête renvoie le nom et le prix de l’objet Propriété. Cependant, les résultats sont filtrés en fonction du prix de la maison : WHERE Price__c < :maxHomeValue. La valeur de la variable fixe, maxHomeValue, est définie en dehors de la requête. Voyons comment cela se traduit dans les faits.

  1. Dans votre Trailhead Playground, cliquez sur Lanceur d’application, saisissez Dream dans la zone de recherche, puis sélectionnez l’application DreamHouse.
  2. Cliquez sur Explorateur de propriétés.
    L’explorateur de propriétés recherche les propriétés disponibles en fonction d’un certain nombre de filtres, tels qu’une fourchette de prix maximale. Le curseur de prix maximal accepte des valeurs pour la variable fixe maxHomeValue.
  3. Déplacez le curseur de prix maximal vers la valeur 550 000.

À chaque fois qu’un curseur se déplace, sa valeur associée est modifiée dans le code par le biais de sa variable fixe. La requête s’exécute et ajoute les résultats à une liste de propriétés affichées sur la page de l’explorateur de propriétés.

Le curseur définit la valeur de la variable dans le code Apex. Ces valeurs remplacent les espaces réservés des variables dans la requête.

L’utilisation de variables fixes dans la clause WHERE vous permet de définir des valeurs de variable dans votre code avant l’exécution de la requête. Les variables fixes rendent une requête dynamique. Pour personnaliser une requête pour chaque utilisateur, définissez les valeurs de variables fixes en fonction de la saisie de l’utilisateur. Au fur et à mesure que vous modifierez et réviserez votre code, vous découvrirez de nombreux types de champs dont les données évoluent constamment.

Fonctions d'agrégation

Dans les rapports, vous utilisez des champs récapitulatifs de cumul pour calculer des valeurs à partir d’enregistrements associés. À titre d’exemple, vous souhaiterez peut-être calculer le nombre total de propriétés ou bien le prix moyen des propriétés dans une ville, ou encore le prix le plus élevé. Dans SOQL, vous utilisez des fonctions d’agrégation pour effectuer, entre autres, ces calculs.

Fonctions d’agrégation pour les requêtes SOQL

Fonction d’agrégation
Description
Exemple
COUNT()
Renvoie le nombre de lignes associées au champ
SELECT COUNT(Name)
FROM Broker__c
COUNT_DISTINCT()
Renvoie le nombre de lignes uniques qui correspondent aux critères de la recherche
SELECT COUNT_DISTINCT(City__c)
FROM Property__c
MIN()
Renvoie la valeur minimale d’un champ
SELECT MIN(Days_On_Market__c)
FROM Property__c
MAX()
Renvoie la valeur maximale d’un champ
SELECT MAX(Beds__c)
FROM Property__c
AVG()
Renvoie la valeur moyenne d’un champ numérique
SELECT City__c, AVG(Days_On_Market__c)
FROM Property__c
GROUP BY City__c
SUM()
Renvoie la valeur totale d’un champ numérique
SELECT SUM(Price__c), Broker__r.Name
FROM Property__c
GROUP BY Broker__r.Name

Prenons l’exemple des propriétés situées dans une ville. Imaginons que nous commencions par cette requête simple :

SELECT City__c FROM Property__c

La requête renvoie la ville pour chacune des 12 propriétés.

Résultats de requête – Total des lignes : 12. Le tableau comporte une seule colonne, qui affiche les villes.

Comme nous ne voulons pas la liste complète des villes, modifiez la requête pour utiliser une fonction d’agrégation. Pour obtenir le nombre total de propriétés, utilisez la fonction COUNT().

La fonction d’agrégation est placée dans la clause SELECT d’une requête, comme suit :

SELECT COUNT(City__c) FROM Property__c. COUNT est la fonction d’agrégation, City__c est le champ et Property__c est l’objet.

Les parenthèses après le nom de la fonction contiennent le nom du champ à utiliser dans le calcul. Dans cet exemple, nous comptons les valeurs du champ City__c.

Exécution d’une requête COUNT()

  1. Dans l’éditeur de requête, saisissez :
    SELECT City__c FROM Property__c
  2. Cliquez sur Exécuter.
    Les résultats de votre requête doivent comporter 12 lignes contenant la ville de chaque propriété.
  3. Modifiez la requête afin que le champ City__c soit inséré dans la fonction COUNT(), comme suit :
    SELECT COUNT(City__c) FROM Property__c
  4. Cliquez sur Exécuter.
    Le résultat de votre requête doit être 12, le nombre de propriétés indiqué par le champ City__c.

    Résultats de requête – Total des lignes : 1. Le tableau affiche une seule valeur : 12.

Si vous avez remarqué que les 12 propriétés se trouvent dans seulement 2 villes, vous vous demandez peut-être pourquoi leur nombre est de 12 et non de 2. En effet, la fonction COUNT() compte toutes les valeurs, ce qui inclut souvent plusieurs enregistrements contenant la même valeur.

Imaginons que nous voulions attribuer un seul courtier à toutes les propriétés d’une ville. De combien de courtiers avons-nous besoin ? Autrement dit, combien de villes uniques les 12 propriétés représentent-elles ? Pour compter uniquement les villes uniques, nous avons besoin d’une autre fonction. (Dans cette situation, « unique » signifie « distinct ».)

COUNT_DISTINCT() est semblable à COUNT(), sauf que cette fonction ne renvoie que des valeurs uniques (sans doublons).

Exécution d’une requête COUNT_DISTINCT

  1. Dans l’éditeur de requête, modifiez la requête afin d’utiliser la fonction COUNT_DISTINCT(), comme suit :
    SELECT COUNT_DISTINCT(City__c) FROM Property__c
  2. Cliquez sur Exécuter.
    Votre résultat doit maintenant être 2, le nombre de valeurs City__c uniques parmi toutes les propriétés.

    Résultats de requête – Total des lignes : 1. Colonne : count_distinct(City__c) Valeur : 2

Cambridge, Boston et Brookline sont les seules valeurs uniques qui se trouvent dans le champ City__c. Notez que les fonctions COUNT() et COUNT_DISTINCT() sont sensibles à la casse. Cela signifie que Cambridge n’est pas un doublon de cambridge. Cambridge et cambridge sont considérées comme deux valeurs uniques.

MIN(), MAX(), AVG() et SUM()

MIN(), MAX(), AVG() et SUM() sont d’autres fonctions d’agrégation utiles.

Les fonctions MIN() et MAX() sont simples : MIN() trouve la valeur minimale (la plus basse) et MAX() trouve la valeur maximale (la plus élevée). Elles ont cependant une caractéristique particulière : elles prennent en charge les dates et les heures ainsi que les nombres.

  1. Dans l’éditeur de requête, saisissez :
    SELECT MIN(Date_Listed__c) FROM Property__c
  2. Cliquez sur Execute (Exécuter).

La fonction MIN() renvoie la date la plus proche. La fonction MAX() renvoie la dernière date (la plus récente).

Les fonctions MIN() et MAX() reconnaissent également l’ordre de tri des valeurs de liste de sélection, ce qui vous permet de rechercher la première ou la dernière valeur d’une liste de sélection.

La fonction AVG() calcule la moyenne de toutes les valeurs. La fonction SUM() calcule la somme de toutes les valeurs. Étant donné que ces deux fonctions effectuent des calculs, elles ne fonctionnent qu’avec des champs contenant des valeurs numériques.

Regroupement des résultats des fonctions d’agrégation

Après avoir calculé des valeurs reposant sur des données agrégées, vous souhaiterez peut-être rendre compte des résultats par groupes, comme vous le faites dans les rapports récapitulatifs. Pour regrouper des valeurs dans une requête SOQL, utilisez la clause GROUP BY. Par exemple, un client de DreamHouse Realty souhaite savoir quels courtiers ont vendu une propriété (c’est-à-dire fermé l’affaire).

Mise en pratique de la clause GROUP BY

Ensuite, utilisez la clause GROUP BY dans une requête.

  1. Dans l’éditeur de requête, saisissez :
    SELECT MAX(Status__c), Broker__r.Name
    FROM Property__c
    GROUP BY Broker__r.Name
  2. Cliquez sur Exécuter.
    Vos résultats doivent comporter huit lignes.

    Résultats de requête – Total des lignes : 8, Colonne 1 : max(Status__c), Colonne 2 : Nom.

N’oubliez pas que cette requête regroupe les propriétés par courtier. Pour les propriétés de chaque courtier, nous répertorions la valeur Status__c la plus avancée. Il s’agit de la valeur de liste de sélection de statut la plus proche de la valeur de liste de sélection finale. Comme nous voulons obtenir les courtiers qui ont vendu des propriétés, nous allons affiner davantage les résultats. Remettons-nous au travail.

Filtrage des résultats des fonctions d’agrégation

Une autre manière d’affiner les résultats consiste à utiliser une clause HAVING. La clause HAVING filtre les résultats renvoyés par une fonction d’agrégation.

Hmm… On dirait que nous pourrions utiliser cette fonction pour trouver les courtiers qui ont vendu des propriétés. Notre requête précédente a renvoyé une liste de courtiers qui ont des propriétés à n’importe quel statut. Essayez d’utiliser la clause HAVING pour affiner ces résultats.

  1. Dans l’éditeur de requête, saisissez :
    SELECT MAX(Status__c), Broker__r.Name
    FROM Property__c
    GROUP BY Broker__r.Name
    HAVING MAX(Status__c) = 'Closed'
  2. Cliquez sur Requête. Normalement, vous ne devriez voir qu’un seul courtier.

    Résultats de requête – Total des lignes : 1. Colonne 1 : max(Status__c). Colonne 2 : Nom.

Oui ! Comme vous le voyez, l’utilisation de la clause HAVING limite les résultats aux propriétés dont le statut est Fermé. Vous avez bien travaillé !

La clause WHERE ressemble beaucoup à la clause HAVING, n’est-ce pas ? Voici comment décider quand utiliser WHERE et quand utiliser HAVING.

  • La clause WHERE filtre les enregistrements dans une requête SOQL qui n’a pas de fonction d’agrégation.
  • La clause HAVING filtre les résultats une fois les données agrégées par une fonction d’agrégation.

Comme vous l’avez appris dans ce module, SOQL est un excellent outil pour accéder aux données de votre organisation Salesforce. Au fur et à mesure que vous renforcerez et approfondirez vos compétences en matière de code Apex, vous rencontrerez de nombreuses occasions d’utiliser vos connaissances relatives à SOQL. Ce faisant, n’oubliez pas que vous pouvez trouver des précisions, des exemples et plus d’informations sur Apex et SOQL dans les ressources fournies dans ce module. Alors, lancez-vous et faites des requêtes… avec SOQL.

Ressources

Formez-vous gratuitement !
Créez un compte pour continuer.
Qu’est-ce que vous y gagnez ?
  • Obtenez des recommandations personnalisées pour vos objectifs de carrière
  • Mettez en pratique vos compétences grâce à des défis pratiques et à des questionnaires
  • Suivez et partagez vos progrès avec des employeurs
  • Découvrez des opportunités de mentorat et de carrière