Apex - SOQL

Il s'agit du langage de requête d'objet Salesforce conçu pour fonctionner avec la base de données SFDC. Il ne peut rechercher un enregistrement sur un critère donné que dans un seul sObject.

Comme SOSL, il ne peut pas rechercher dans plusieurs objets, mais il prend en charge les requêtes imbriquées.

Exemple SOQL

Prenons notre exemple actuel de Chemical Company. Supposons que nous ayons besoin d'une liste d'enregistrements qui sont créés aujourd'hui et dont le nom de client n'est pas «test». Dans ce cas, nous devrons utiliser la requête SOQL comme indiqué ci-dessous -

// fetching the Records via SOQL
List<apex_invoice__c> InvoiceList = new List<apex_invoice__c>();
InvoiceList = [SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM
   APEX_Invoice__c WHERE createdDate = today AND APEX_Customer__r.Name != 'Test'];
// SOQL query for given criteria

// Printing the fetched records
System.debug('We have total '+InvoiceList.size()+' Records in List');

for (APEX_Invoice__c objInvoice: InvoiceList) {
   System.debug('Record Value is '+objInvoice); 
   // Printing the Record fetched
}

Vous pouvez exécuter la requête SOQL via l'éditeur de requête dans la console développeur comme indiqué ci-dessous.

Exécutez la requête ci-dessous dans la Developer Console. Recherchez les enregistrements de facture créés aujourd'hui.

SELECT Id, Name, APEX_Customer__r.Name, APEX_Status__c FROM APEX_Invoice__c
   WHERE createdDate = today

Vous devez sélectionner les champs pour lesquels vous avez besoin des valeurs, sinon cela peut générer des erreurs d'exécution.

Traverser les champs de relation

C'est l'une des parties les plus importantes de SFDC car nous devons souvent parcourir la relation d'objet parent enfant

En outre, il peut y avoir des cas où vous devez insérer deux enregistrements d'objets associés dans la base de données. Par exemple, l'objet Facture a une relation avec l'objet Client et, par conséquent, un Client peut avoir plusieurs factures.

Supposons que vous créez la facture et que vous devez ensuite associer cette facture au client. Vous pouvez utiliser le code suivant pour cette fonctionnalité -

// Now create the invoice record and relate it with the Customer object
// Before executing this, please create a Customer Records with Name 'Customer
// Creation Test'
APEX_Invoice__c objInvoice = new APEX_Invoice__c();

// Relating Invoice to customer via id field of Customer object
objInvoice.APEX_Customer__c = [SELECT id FROM APEX_Customer__c WHERE Name =
   'Customer Creation Test' LIMIT 1].id;
objInvoice.APEX_Status__c = 'Pending';
insert objInvoice;  //Creating Invoice
System.debug('Newly Created Invoice'+objInvoice);  //Newly created invoice

Exécutez cet extrait de code dans la Developer Console. Une fois exécuté, copiez l'identifiant de la facture depuis la console développeur, puis ouvrez-la dans SFDC comme indiqué ci-dessous. Vous pouvez voir que l'enregistrement Parent a déjà été affecté à l'enregistrement Facture comme indiqué ci-dessous.

Récupération des enregistrements enfants

Prenons maintenant un exemple dans lequel, toutes les factures liées à un dossier client particulier doivent se trouver au même endroit. Pour cela, vous devez connaître le nom de la relation enfant. Pour voir le nom de la relation enfant, accédez à la page de détails du champ sur l'objet enfant et vérifiez la valeur «Relation enfant». Dans notre exemple, ce sont les factures ajoutées par __r à la fin.

Exemple

Dans cet exemple, nous devrons configurer les données, créer un client avec le nom comme enregistrement «Client ABC», puis ajouter 3 factures à ce client.

Maintenant, nous allons récupérer les factures du client «Client ABC». Voici la requête pour le même -

// Fetching Child Records using SOQL
List<apex_customer__c> ListCustomers = [SELECT Name, Id, 
   (SELECT id, Name FROM Invoices__r) FROM APEX_Customer__c WHERE Name = 'ABC Customer'];

// Query for fetching the Child records along with Parent
System.debug('ListCustomers '+ListCustomers); // Parent Record

List<apex_invoice__c> ListOfInvoices = ListCustomers[0].Invoices__r;
// By this notation, you could fetch the child records and save it in List
System.debug('ListOfInvoices values of Child '+ListOfInvoices);
// Child records

Vous pouvez voir les valeurs d'enregistrement dans les journaux de débogage.

Récupération du dossier parental

Supposons que vous deviez récupérer le nom du client de la facture dont la date de création est aujourd'hui, vous pouvez alors utiliser la requête ci-dessous pour la même chose -

Exemple

Récupérez la valeur de l'enregistrement parent avec l'objet enfant.

// Fetching Parent Record Field value using SOQL
List<apex_invoice__c> ListOfInvoicesWithCustomerName = new List<apex_invoice__c>();
ListOfInvoicesWithCustomerName = [SELECT Name, id, APEX_Customer__r.Name 
   FROM APEX_Invoice__c LIMIT 10];

// Fetching the Parent record's values
for (APEX_Invoice__c objInv: ListOfInvoicesWithCustomerName) {
   System.debug('Invoice Customer Name is '+objInv.APEX_Customer__r.Name);
   // Will print the values, all the Customer Records will be printed
}

Ici, nous avons utilisé la notation APEX_Customer__r.Name, où APEX_Customer__r est le nom de la relation parent, ici vous devez ajouter le __r à la fin du champ Parent, puis vous pouvez récupérer la valeur du champ parent.

Fonctions d'agrégation

SOQL a une fonction d'agrégation comme nous l'avons dans SQL. Les fonctions d'agrégation nous permettent de regrouper et de résumer les données. Comprenons maintenant la fonction en détail.

Supposons que vous vouliez savoir quel est le revenu moyen que nous obtenons du client «Client ABC», vous pouvez alors utiliser cette fonction pour prendre la moyenne.

Exemple

// Getting Average of all the invoices for a Perticular Customer
AggregateResult[] groupedResults = [SELECT
   AVG(APEX_Amount_Paid__c)averageAmount FROM APEX_Invoice__c WHERE
   APEX_Customer__r.Name = 'ABC Customer'];
Object avgPaidAmount = groupedResults[0].get('averageAmount');
System.debug('Total Average Amount Received From Customer ABC is '+avgPaidAmount);

Vérifiez la sortie dans les journaux de débogage. Notez que toute requête qui inclut une fonction d'agrégation renvoie ses résultats dans un tableau deAggregateResultobjets. AggregateResult est un sObject en lecture seule et n'est utilisé que pour les résultats de requête. Il est utile lorsque nous devons générer le rapport sur des données volumineuses.

Il existe également d'autres fonctions d'agrégation que vous pouvez utiliser pour effectuer un résumé des données.

MIN() - Cela peut être utilisé pour trouver la valeur minimale

MAX() - Cela peut être utilisé pour trouver la valeur maximale.

Liaison des variables Apex

Vous pouvez utiliser la variable Apex dans la requête SOQL pour récupérer les résultats souhaités. Les variables Apex peuvent être référencées par la notation Colon (:).

Exemple

// Apex Variable Reference
String CustomerName = 'ABC Customer';
List<apex_customer__c> ListCustomer = [SELECT Id, Name FROM APEX_Customer__c
   WHERE Name = :CustomerName];

// Query Using Apex variable
System.debug('ListCustomer Name'+ListCustomer); // Customer Name