Apex - SOQL

Esta é a linguagem de consulta de objeto do Salesforce projetada para funcionar com o banco de dados SFDC. Ele pode pesquisar um registro em um determinado critério apenas em um único sObject.

Como o SOSL, ele não pode pesquisar em vários objetos, mas oferece suporte a consultas aninhadas.

Exemplo SOQL

Considere nosso exemplo contínuo de Chemical Company. Suponha que precisamos de uma lista de registros que são criados hoje e cujo nome de cliente não é 'teste'. Neste caso, teremos que usar a consulta SOQL conforme fornecido abaixo -

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

Você pode executar a consulta SOQL por meio do Editor de Consultas no console do desenvolvedor, conforme mostrado abaixo.

Execute a consulta fornecida abaixo no console do desenvolvedor. Pesquise os registros de fatura criados hoje.

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

Você deve selecionar os campos para os quais precisa dos valores, caso contrário, pode gerar erros de tempo de execução.

Atravessando campos de relacionamento

Esta é uma das partes mais importantes no SFDC, tantas vezes que precisamos atravessar o relacionamento de objeto pai-filho

Além disso, pode haver casos em que você precise inserir dois registros de objetos associados no Banco de Dados. Por exemplo, o objeto Fatura tem relacionamento com o objeto Cliente e, portanto, um Cliente pode ter várias faturas.

Suponha que você esteja criando a fatura e, em seguida, precise relacionar esta fatura ao Cliente. Você pode usar o seguinte código para esta funcionalidade -

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

Execute este trecho de código no console do desenvolvedor. Uma vez executado, copie o Id da fatura do console do desenvolvedor e abra o mesmo no SFDC conforme mostrado abaixo. Você pode ver que o registro principal já foi atribuído ao registro de fatura, conforme mostrado abaixo.

Buscando Registros Filhos

Vamos agora considerar um exemplo em que todas as faturas relacionadas a um determinado registro do cliente precisam estar em um só lugar. Para isso, você deve saber o nome do relacionamento do filho. Para ver o nome do relacionamento filho, acesse a página de detalhes do campo no objeto filho e verifique o valor "Relacionamento filho". Em nosso exemplo, são faturas anexadas por __r no final.

Exemplo

Neste exemplo, precisaremos configurar os dados, criar um cliente com o nome de registro 'Cliente ABC' e adicionar 3 faturas a esse cliente.

Agora, vamos buscar as faturas que o cliente 'ABC Customer' possui. A seguir está a consulta para o mesmo -

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

Você pode ver os valores de registro nos logs de depuração.

Buscando registro pai

Suponha que você precise buscar o Nome do Cliente da Fatura, cuja data de criação é hoje, então você pode usar a consulta fornecida abaixo para a mesma -

Exemplo

Busque o valor do registro pai junto com o objeto filho.

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

Aqui, usamos a notação APEX_Customer__r.Name, onde APEX_Customer__r é o nome do relacionamento pai, aqui você deve anexar __r no final do campo Pai e, em seguida, pode buscar o valor do campo pai.

Funções de agregação

SOQL tem função agregada como temos em SQL. As funções de agregação nos permitem acumular e resumir os dados. Vamos agora entender a função em detalhes.

Suponha que você queira saber qual é a receita média que estamos obtendo do cliente 'Cliente ABC', então você pode usar esta função para obter a média.

Exemplo

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

Verifique a saída nos logs de depuração. Observe que qualquer consulta que inclui uma função agregada retorna seus resultados em uma matriz deAggregateResultobjetos. AggregateResult é um sObject somente leitura e só é usado para resultados de consulta. É útil quando precisamos gerar o Relatório de dados grandes.

Existem também outras funções de agregação que você pode usar para realizar o resumo dos dados.

MIN() - Isso pode ser usado para encontrar o valor mínimo

MAX() - Isso pode ser usado para encontrar o valor máximo.

Variáveis ​​de ligação do Apex

Você pode usar a variável Apex na consulta SOQL para buscar os resultados desejados. As variáveis ​​Apex podem ser referenciadas pela notação Colon (:).

Exemplo

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