Apex - SOQL

Si tratta di Salesforce Object Query Language progettato per funzionare con SFDC Database. Può cercare un record su un dato criterio solo in un singolo oggetto.

Come SOSL, non può eseguire ricerche su più oggetti ma supporta query annidate.

Esempio SOQL

Considera il nostro esempio continuo di Chemical Company. Supponiamo di aver bisogno di un elenco di record che vengono creati oggi e il cui nome cliente non è "test". In questo caso, dovremo utilizzare la query SOQL come indicato di seguito:

// 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
}

È possibile eseguire la query SOQL tramite l'Editor di query nella Console per gli sviluppatori come mostrato di seguito.

Esegui la query indicata di seguito nella Developer Console. Cerca i record delle fatture creati oggi.

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

È necessario selezionare i campi per i quali sono necessari i valori, altrimenti può generare errori in fase di esecuzione.

Attraversare i campi di relazione

Questa è una delle parti più importanti in SFDC poiché molte volte abbiamo bisogno di attraversare la relazione dell'oggetto padre figlio

Inoltre, potrebbero verificarsi casi in cui è necessario inserire due record di oggetti associati nel database. Ad esempio, l'oggetto Fattura ha una relazione con l'oggetto Cliente e quindi un Cliente può avere molte fatture.

Supponiamo che tu stia creando la fattura e quindi sia necessario correlare questa fattura al cliente. È possibile utilizzare il codice seguente per questa funzionalità:

// 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

Esegui questo snippet di codice nella Developer Console. Una volta eseguito, copia l'ID della fattura dalla Console per gli sviluppatori e quindi apri lo stesso in SFDC come mostrato di seguito. Puoi vedere che il record genitore è già stato assegnato al record fattura come mostrato di seguito.

Recupero di record figlio

Consideriamo ora un esempio in cui tutte le fatture relative a un particolare record cliente devono essere in un unico posto. Per questo, devi conoscere il nome della relazione figlio. Per vedere il nome della relazione figlio, vai alla pagina dei dettagli del campo sull'oggetto figlio e controlla il valore "Relazione figlio". Nel nostro esempio, sono le fatture aggiunte da __r alla fine.

Esempio

In questo esempio, dovremo impostare i dati, creare un cliente con il nome come record "Cliente ABC" e quindi aggiungere 3 fatture a quel cliente.

Ora recupereremo le fatture del cliente "Cliente ABC". Di seguito è riportata la query per lo stesso:

// 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

Puoi vedere i valori dei record nei registri di debug.

Recupero record genitore

Supponiamo che sia necessario recuperare il nome cliente della fattura la cui data di creazione è oggi, quindi è possibile utilizzare la query fornita di seguito per lo stesso -

Esempio

Recupera il valore del record padre insieme all'oggetto figlio.

// 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
}

Qui abbiamo usato la notazione APEX_Customer__r.Name, dove APEX_Customer__r è il nome della relazione genitore, qui devi aggiungere __r alla fine del campo Parent e poi puoi recuperare il valore del campo genitore.

Funzioni aggregate

SOQL ha una funzione di aggregazione come in SQL. Le funzioni aggregate ci consentono di raggruppare e riepilogare i dati. Vediamo ora di capire la funzione in dettaglio.

Supponi di voler sapere qual è il ricavo medio che otteniamo dal cliente "Cliente ABC", quindi puoi utilizzare questa funzione per calcolare la media.

Esempio

// 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);

Controlla l'output nei registri di debug. Si noti che qualsiasi query che include una funzione di aggregazione restituisce i risultati in una matrice diAggregateResultoggetti. AggregateResult è un oggetto di sola lettura e viene utilizzato solo per i risultati della query. È utile quando è necessario generare il Report su dati di grandi dimensioni.

Esistono anche altre funzioni aggregate che è possibile utilizzare per eseguire il riepilogo dei dati.

MIN() - Questo può essere utilizzato per trovare il valore minimo

MAX() - Questo può essere utilizzato per trovare il valore massimo.

Variabili Apex vincolanti

È possibile utilizzare la variabile Apex nella query SOQL per recuperare i risultati desiderati. Le variabili Apex possono essere referenziate dalla notazione due punti (:).

Esempio

// 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