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.
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.
- Dans votre Trailhead Playground, cliquez sur , saisissez
Dream
dans la zone de recherche, puis sélectionnez l’application DreamHouse.
- Cliquez sur Property Explorer (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.
- 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.
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.
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 :
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()
- Dans l’éditeur de requête, saisissez :
SELECT City__c FROM Property__c
- Cliquez sur Exécuter.
Les résultats de votre requête doivent comporter 12 lignes contenant la ville de chaque propriété.
- 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
- 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.
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
- 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
- Cliquez sur Exécuter.
Votre résultat doit maintenant être 2, le nombre de valeurs City__c uniques parmi toutes les propriétés.
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.
- Dans l’éditeur de requête, saisissez :
SELECT MIN(Date_Listed__c) FROM Property__c
- 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.
- Dans l’éditeur de requête, saisissez :
SELECT MAX(Status__c), Broker__r.Name FROM Property__c GROUP BY Broker__r.Name
- Cliquez sur Exécuter.
Vos résultats doivent comporter huit lignes.
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.
- 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'
- Cliquez sur Requête. Normalement, vous ne devriez voir qu’un seul courtier.
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
-
Documentation des développeurs Salesforce : Utilisation de variables Apex dans les requêtes SOQL et SOSL
-
Documentation des développeurs Salesforce : Fonctions d'agrégation
-
Documentation des développeurs Salesforce : Exemple de clauses SELECT
-
Documentation des développeurs Salesforce : GROUP BY