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