Utilisation des sObjects et de DML
Objectifs de formation
Une fois cette unité terminée, vous pourrez :
- Définir un sObject
- Expliquer la différence entre les sObjects et les autres types de données Apex
- Utiliser DML pour insérer des enregistrements dans la base de données
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 à 21 min 39 s, au cas où vous voudriez revenir en arrière et regarder à nouveau le début de l’étape.)
Qu’est-ce qu’un sObject ?
Un sObject est un type de données Apex correspondant à un objet Salesforce (sObject) dans une organisation. Les sObjects sont des types de données complexes contenant plusieurs valeurs dans une variable. Ils renferment un enregistrement de données unique provenant d’un objet Salesforce, tel qu’un compte, un contact ou une opportunité. Souvenez-vous : nous avions mentionné dans le module Bases d’Apex pour les administrateurs que les variables s’apparentaient à des conteneurs. La plupart des variables contiennent une information. Les sObjects, eux, sont des conteneurs qui contiennent d’autres conteneurs. Les conteneurs inclus dans un conteneur sObject peuvent comporter différents types de données, tels que string (chaîne), date (date), integer (entier) ou boolean (booléen).
Nouveaux comptes
Nom |
Numéro de compte |
Téléphone |
---|---|---|
La fabrique à thé |
356281 |
555-0158 |
Les thés de Tina |
623956 |
555-0129 |
Regardez les informations présentes dans ce tableau. Si vous avez utilisé Data Loader, vous connaissez déjà ce format de compte. Ici, les champs de compte sont Name (Nom), Account Number (Numéro de compte) et Phone (Téléphone). Les données correspondent à ce que vous verriez si vous récupériez les informations à partir d’un rapport ou d’une vue de liste.
Les champs d’un objet dans une organisation sont appelés propriétés sObject dans le code Apex. À l’instar de chaque champ d’un objet dans une organisation, chaque propriété sObject présente un type de données. Par exemple, comme le champ Name (Nom) d’un objet de compte contient le type de données string, la propriété Name
du sObject myAcct
contient également le type de données string : myAcct.Name = 'La fabrique à thé'
.
Que vous créiez un compte manuellement (dans l’interface utilisateur de Salesforce) ou par programmation (à l’aide de code Apex), vous définissez les mêmes valeurs, avec les mêmes types de données. Par exemple, dans l’interface utilisateur de Salesforce, vous pouvez créer un compte ayant les valeurs de champ contenues dans la première ligne du tableau Nouveaux comptes ci-dessus. Pour créer le même compte par programmation, utilisez un sObject de compte dans le code Apex, comme ceci :
Account myAcct = new Account(); myAcct.Name = 'The Tea Factory'; myAcct.Phone= '555-0129'; myAcct.AccountNumber = '356281';
Utilisez le sObjectName, la notation pointée et les mêmes champs par défaut (Name, Phone et AccountNumber) que ceux que vous utilisez déjà dans votre organisation.
Dans cet exemple, les propriétés de myAcct
(Name
, Phone
et AccountNumber
) présentent des types de données que vous connaissez bien : string et integer.
Définition de la valeur du champ
Pour attribuer une valeur à un sObject, utilisez la notation pointée. Dans l’exemple de code précédent, reportez-vous aux lignes 2 à 4. Si nous considérons le sObject comme un conteneur de conteneurs, ces lignes ouvrent le conteneur le plus grand, myAcct
, trouvent les conteneurs Name
, Phone
et AccountNumber
, et leur ajoutent des valeurs.
Obtention d’une valeur de champ
De même, utilisez la notation pointée pour obtenir (récupérer) une valeur d’un sObject.
Exemple : String accountName = myAcct.Name;
(Chaîne accountName = myAcct.Name;)
Cet exemple de code ouvre le conteneur myAcct
, effectue une recherche dans celui-ci, trouve le conteneur Name
et obtient sa valeur. Dans cet exemple, la valeur renvoyée est La fabrique à thé.
Déclarer un sObject revient à ajouter une ligne dans une feuille de calcul. Lorsque vous êtes prêt à créer un autre compte, attribuez un nouveau nom à l’objet de compte. Par exemple :
Account myAcct2 = new Account(); myAcct2.Name = 'Tina\'s Teas'; myAcct2.AccountNumber = '623956'; myAcct2.Phone = '555-0129';
Ajout de données dans une organisation Salesforce
Prêt à écrire du code Apex pour ajouter des données dans votre organisation Salesforce ? Vous savez créer des classes et des méthodes, ainsi que déclarer un sObject. Mais comment vous y prendriez-vous pour ajouter un sObject à votre base de données Salesforce ? Pour envoyer de nouveaux enregistrements à votre organisation Salesforce, vous devez utiliser un outil appelé langage de manipulation de données ou DML (pour Data Manipulation Language).
En tant qu’administrateur, vous connaissez déjà DML. Il s’agit des instructions Insert (créer un enregistrement), Update (modifier un enregistrement) et Delete (supprimer un enregistrement) que vous utilisez avec des outils de manipulation de données tels que Data Loader. Au lieu d’utiliser des fichiers .csv et Data Loader pour ajouter des lignes, insérer ou encore mettre à jour des enregistrements, vous pouvez écrire du code Apex qui fera le travail à votre place. Utilisez du code Apex et les instructions DML Insert
, Update
et Delete
. Pas mal, non ? Dans cette unité, nous nous concentrons sur l’instruction Insert
.
Définition de la classe
- Dans la Developer Console, cliquez sur File (Fichier) | New (Nouveau) | Apex Class (Classe Apex).
- Saisissez le nom de classe
NewAccounts
.
- Cliquez sur OK.
- Remplacez le code par défaut par ce code :
public class NewAccounts { public static void sObjectsInsert(){ Account store = new Account(); store.Name = 'The Tea Factory'; store.AccountNumber = '356281'; store.Phone = '555-0158'; insert store; } }
- Cliquez sur File (Fichier)| Save (Enregistrer).
Vous avez maintenant une classe NewAccounts
qui crée un nouvel enregistrement et définit ses propriétés. La classe utilise également l’instruction insert
pour ajouter le nouvel enregistrement de compte dans la base de données. Il est maintenant temps d’exécuter votre code !
Exécution du code
- Cliquez sur Debug (Débogage) | Open Execute Anonymous Window (Ouvrir une fenêtre d’exécution anonyme).
- Dans la fenêtre Enter Apex Code (Entrer du code Apex), collez le code suivant :
NewAccounts.sObjectsInsert();
- Cliquez sur la case à cocher Open Log (Ouvrir le journal), puis sur Execute (Exécuter).
- Dans le lanceur d’application, cherchez et sélectionnez Accounts (Comptes). The Tea Factory (La fabrique à thé) apparaît dans la liste des comptes. Si vous ne voyez pas The Tea Factory (La fabrique à thé), actualisez la page.
- Cliquez sur The Tea Factory (La fabrique à thé).
- Cliquez sur Details (Détails). Vous remarquerez que les champs Account Name (Nom de compte), Phone (Téléphone) et Account Number (Numéro de compte) affichent les valeurs que vous avez définies en tant que propriétés sObject dans la classe
NewAccounts
.
Utilisation d’une boucle pour créer plusieurs enregistrements
Il n’est pas très pratique d’ajouter les comptes un par un. Le plus souvent, l’importation ou la mise à jour d’enregistrements vous impose en effet de créer plusieurs comptes à la fois.
Vous pourriez ajouter plusieurs enregistrements tout comme nous en avons ajouté un dans l’exemple précédent, mais vous devriez alors répéter le code pour chacun d’entre eux, comme ceci :
Account store1 = new Account(); Account store2 = new Account(); store1.Name = 'The Tea Factory 1'; store1.AccountNumber = '356281'; store1.Phone = '555-0158'; store2.Name = 'The Tea Factory 2'; store2.AccountNumber = '356282'; store2.Phone = '555-4012'; insert store1; insert store2;
Dans le module Bases d’Apex pour les administrateurs, vous avez découvert les boucles et les listes. Voici une occasion de mettre ces concepts en application. En utilisant une boucle while
et une liste, vous pouvez créer simultanément de nombreux enregistrements et tous les ajouter à votre base de données. C’est comme si vous utilisiez Data Loader pour charger un fichier .csv comprenant trois enregistrements et les insérer dans la base de données.
Écriture de la méthode
- Revenez à la classe NewAccounts dans la Developer Console.
- Remplacez le code existant par le code suivant :
public class NewAccounts { public static void sObjectsInsert(Integer value){ Integer counter = 1; //create a list to add our accounts List<Account> teaFactoryAccounts = new List<Account>(); while(counter <= value){ //display the current counter value System.debug('Counter Value before Incrementing ' + counter); //create a new account Account store = new Account(); store.Name = 'The Tea Factory ' + counter; store.AccountNumber = '35629' + counter; teaFactoryAccounts.add(store); System.debug(teaFactoryAccounts); //increment the counter counter = counter + 1; System.debug('Counter Value after incrementing ' + counter); } System.debug('Size of Account List: ' + teaFactoryAccounts.size() ); System.debug('Elements in Account List: ' + teaFactoryAccounts); //insert all of the accounts in the list insert teaFactoryAccounts; } }
- Cliquez sur File (Fichier) | Save (Enregistrer).
Exécutez la méthode.
- Cliquez sur Debug (Débogage) | Open Execute Anonymous Window (Ouvrir une fenêtre d’exécution anonyme).
- Dans la fenêtre Enter Apex Code (Entrer du code Apex), collez le code suivant :
NewAccounts.sObjectsInsert(3);
- Sélectionnez Ouvrir le journal, puis cliquez sur Exécuter. La fenêtre du journal s’ouvre.
- Sélectionnez Debug Only (Déboguer uniquement).
La dernière entrée du journal indique que le code a créé trois comptes, avec un nom et un numéro de compte pour chacun d’entre eux :
La fabrique à thé 1, 356291
La fabrique à thé 2, 356292
La fabrique à thé 3, 356293
La liste teaFactoryAccounts
créée à la ligne 5 se présente comme suit :
Chaque fois que la valeur de la variable de compteur est incrémentée, un sObject est créé dans l’index (position) ouvert suivant de la liste.
Retournez à la liste des comptes de votre organisation Trailhead Playground et cliquez sur Accounts (Comptes). Les trois restaurants que vous avez insérés sont inclus dans la liste des comptes.
Examen du code de la boucle
Examinez le code de la boucle while
. Il crée une instance d’un nouveau sObject de compte nommé store
. Ensuite, la boucle définit le nom « La fabrique à thé ». Pour différencier les enregistrements de compte, la valeur actuelle du compteur est ajoutée à la fin de la chaîne store.Name
lors de chaque itération de la boucle.
Une fois les propriétés définies, teaFactoryAccounts.add
ajoute un sObject store
à la liste teaFactoryAccounts
lors de chaque itération de la boucle while
, jusqu’à ce que la condition de boucle soit remplie lorsque la valeur est supérieure ou égale à celle du compteur.
Lorsque la condition est remplie, la boucle while
se termine et la dernière ligne insère en une seule fois l’ensemble du contenu de la liste teaFactoryAccounts
dans la base de données.
Pourquoi cette insertion se fait-elle en une seule fois ? Les ressources étant limitées, vous ne pouvez utiliser l’instruction insert que 150 fois dans votre code. Si chaque instruction n’insère qu’un seul enregistrement, vous pouvez donc insérer 150 enregistrements au total. Cependant, si chaque instruction insert insère 10 enregistrements, ce total monte à 1 500. L’insertion simultanée de plusieurs objets facilite le traitement en masse (c’est-à-dire la combinaison de tâches répétitives par l’écriture d’un code efficace). Au démarrage, vous n’insérerez peut-être que 10 enregistrements à la fois. Toutefois, au fur et à mesure que votre application se développera, vous commencerez peut-être à insérer simultanément 200 enregistrements. En utilisant le traitement en masse dès le départ, vous préparez donc l’évolution de votre application.
Ressources
- Apex Developer Guide: Working with sObjects
- Trailhead Module: Concepts Apex de base et base de données