Учебники

Apex — SOQL

Это язык запросов Salesforce, разработанный для работы с базой данных SFDC. Он может искать запись по заданному критерию только в одном sObject.

Как и SOSL, он не может выполнять поиск по нескольким объектам, но поддерживает вложенные запросы.

Пример SOQL

Рассмотрим наш постоянный пример химической компании. Предположим, нам нужен список записей, которые созданы сегодня и чье имя клиента не «test». В этом случае нам нужно будет использовать запрос SOQL, как указано ниже:

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

Вы можете выполнить запрос SOQL через редактор запросов в консоли разработчика, как показано ниже.

Запустите приведенный ниже запрос в консоли разработчика. Поиск записей счетов-фактур, созданных сегодня.

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

Вы должны выбрать поля, для которых вам нужны значения, иначе он может выдавать ошибки времени выполнения.

Обход поля отношений

Это одна из самых важных частей в SFDC, так как много раз нам нужно проходить через отношения родительского дочернего объекта

Также могут быть случаи, когда вам нужно вставить две записи связанных объектов в базу данных. Например, объект Invoice связан с объектом Customer и, следовательно, один Customer может иметь много счетов.

Предположим, вы создаете счет-фактуру, а затем вам нужно связать этот счет-фактуру с Заказчиком. Вы можете использовать следующий код для этой функции —

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

Выполните этот фрагмент кода в консоли разработчика. После выполнения скопируйте идентификатор счета-фактуры из консоли разработчика, а затем откройте его в SFDC, как показано ниже. Вы можете видеть, что родительская запись уже была назначена записи счета, как показано ниже.

Извлечение родительских записей SOQL

Извлечение записей о детях

Давайте теперь рассмотрим пример, в котором все счета, связанные с конкретной записью клиента, должны быть в одном месте. Для этого вы должны знать имя дочернего отношения. Чтобы увидеть имя дочернего отношения, перейдите на страницу сведений о поле дочернего объекта и проверьте значение «Дочерние отношения». В нашем примере это счета, добавленные __r в конце.

пример

В этом примере нам потребуется настроить данные, создать клиента с именем в качестве записи «ABC Customer», а затем добавить 3 счета этому клиенту.

Теперь мы получим счета, которые есть у клиента «Клиент ABC». Следующий запрос для того же самого —

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

Вы можете увидеть значения записи в журналах отладки.

Извлечение родительской записи

Предположим, вам нужно получить клиентское имя счета-фактуры, дата создания которого сегодня, тогда вы можете использовать запрос, приведенный ниже, для того же самого —

пример

Получить значение родительской записи вместе с дочерним объектом.

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

Здесь мы использовали обозначение APEX_Customer__r.Name, где APEX_Customer__r — это имя родительского отношения, здесь вы должны добавить __r в конце поля Parent, а затем вы можете получить значение родительского поля.

Агрегатные функции

У SOQL есть агрегатная функция, как у нас в SQL. Агрегатные функции позволяют нам сворачивать и суммировать данные. Давайте теперь разберемся в функции подробно.

Предположим, вы хотели знать, каков средний доход, который мы получаем от Клиента «Клиент ABC», тогда вы можете использовать эту функцию, чтобы получить среднее значение.

пример

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

Проверьте вывод в журналах отладки. Обратите внимание, что любой запрос, включающий статистическую функцию, возвращает результаты в массиве объектов AggregateResult . AggregateResult является sObject только для чтения и используется только для результатов запроса. Это полезно, когда нам нужно создать отчет по большим данным.

Существуют и другие агрегатные функции, которые вы можете использовать для выполнения суммирования данных.

MIN () — это можно использовать, чтобы найти минимальное значение

MAX () — это можно использовать для поиска максимального значения.

Переменные вершины связывания

Вы можете использовать переменную Apex в запросе SOQL для получения желаемых результатов. На переменные Apex можно ссылаться с помощью двоеточия (:).