Criar consultas SOQL em classes do Apex
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Criar uma consulta SOQL em um método.
- Manipular os dados retornados por uma consulta SOQL.
Acompanhar com o Trail Together
Deseja acompanhar um especialista enquanto trabalha nesta etapa? Veja este vídeo que faz parte da série Trail Together no Trailhead Live.
(Este clipe começa na marca dos 17:32 minutos, caso você queira retroceder e ver o início da etapa novamente.)
Introdução
Agora que você entende o básico de uma consulta SOQL, pode aplicar seu conhecimento de campos de fórmula às consultas SOQL.
Nossa consulta é bem simples: SELECT FirstName, LastName FROM Contact
Agora, precisamos de um objeto para armazenar os dados resultantes. Como as consultas SOQL sempre retornam dados na forma de uma lista, criamos uma lista do Apex. Como você aprendeu em Noções básicas do Apex para administradores, para declarar uma lista você precisa de algumas coisas: a palavra reservada List
, o tipo de dados (em < >
caracteres) e um nome para a nova lista. Para essa consulta, o tipo de dados é Contato, e damos à nova lista o nome listOfContacts. A declaração do arquivo fica assim:
List<Contact> listofContacts
Para atribuir os resultados da consulta à nova lista, colocamos um operador de atribuição, o símbolo de igual ( =
), entre a declaração da lista e a consulta, assim:
List<Contact> listofContacts = [SELECT FirstName, LastName FROM Contact];
Observe a sintaxe. A consulta fica contida em colchetes [ ]
e a instrução termina com um ponto e vírgula ( ;
).
Vamos experimentar no Developer Console. Para fins de teste, enviamos a lista de contatos para o log de depuração a fim de podermos ver como o código está funcionando.
Testar seu código no Developer Console
- No Developer Console, clique em Depurar | Abrir a janela Executar no modo anônimo.
- Na janela Executar no modo anônimo, atribua os resultados da consulta à nova lista:
List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
- Na linha seguinte, envie a listOfContacts para o log de depuração:
system.debug(listOfContacts);
- Clique na caixa de seleção Abrir log.
- Clique em Executar.
- Na parte inferior da janela Log de execução, clique na caixa de seleção Depurar apenas.
Os dois primeiros itens no log de depuração devem ser assim: -
Se uma consulta não encontrar resultados, ela ainda retornará uma lista, que estará vazia:
[2]|DEBUG|()
O que está realmente acontecendo aqui?
Quando nosso código é executado, ele primeiro processa a consulta:
SELECT FirstName, LastName FROM Contact LIMIT 2
A consulta encontra todos os Contatos e obtém o nome e sobrenome de cada registro. Em seguida, nosso código adiciona os dados selecionados desses registros de contato a uma lista chamada listOfContacts.
Finalmente, na linha 2, System.debug
exibe o conteúdo da listOfContacts
.
Executar consultas SOQL no Apex
Na unidade anterior, você usou o editor de consulta para retornar dados em uma tabela. Nesta unidade, você usou a janela Executar no modo anônimo para executar uma consulta e enviar os resultados para o log de depuração. Isso é ótimo por enquanto, mas seus usuários não vão executar consultas no Developer Console. Você precisa de uma maneira de retornar dados na interface de usuário da sua organização. As classes e os métodos do Apex são a maneira de fazer isso. Vamos explorar como executar uma consulta SOQL e manipular seus resultados no Apex.
Começamos criando um método do Apex em uma classe do Apex. O método do Apex executa nossa consulta para selecionar os dados que queremos.
- No Developer Console, clique em Arquivo | Novo | Classe do Apex.
- Dê o nome
ContactUtility
para a classe e clique em OK. -
A classe é aberta, exibe código que declara a classe e deixa espaço para o corpo da classe.
- Na linha 2, adicione um método chamado
viewContacts
.public static void viewContacts(){ }
- Na linha 3, dentro do método
viewContacts
, cole o código que executa a consulta e atribui os resultados a uma nova lista:List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
- Salve a classe.
Agora temos os dados que queremos na listOfContacts
. Usaremos um loop for para iterar pela lista e criar o formato que queremos para nossa saída.
Como usar loops for para iterar por uma lista
Em Programação orientada a objetos para administradores, você aprendeu a processar itens em uma lista, uma a uma, usando um loop for. Aqui, usando um loop for, combinamos o nome e o sobrenome de cada contato para formar o nome completo do contato. Primeiro, criamos o loop e, em seguida, processamos cada registro dentro do loop.
Para declarar um loop for, precisamos de um nome de variável, do seu tipo de dados e do nome da lista pela qual o loop itera.
Em um loop for, não nos referimos diretamente a objetos específicos. Nós criamos uma variável para representar itens de lista dentro do loop, um de cada vez. A variável serve como espaço reservado para cada item da lista. Pode ser qualquer nome que você escolher, mas vamos simplificar. Vamos usar con
. Em seguida, precisamos do tipo de dados da variável, que é Contato, e o nome da lista, que é listOfContacts. Tudo junto fica assim:
Declarar um loop for
- No método viewContacts, após a consulta SOQL, cole este código:
for (Contact con : listOfContacts){ //loop body }
- Salve a classe.
Consultamos o banco de dados (1), selecionamos dados, armazenamos os dados em uma lista (2) e criamos um loop for (3).
Em seguida, dentro do loop, processamos os itens da lista. Em última análise, queremos exibir cada contato na listOfContacts
neste formato:
First Name:<contact's first name>, Last Name:<contact's last name>
(Nome: nome do contato, Sobrenome: sobrenome do contato)
Para referenciar um campo para um item em uma lista, use a notação de ponto para especificar o objeto e seu campo (object.field). Por exemplo, consulte o campo FirstName de um objeto de contato na lista listOfContacts colocando um ponto final (o "ponto" na notação de ponto) entre con (a variável objeto) e FirstName (o campo), assim:
con.FirstName
A lista contém campos separados de nome e sobrenome. No Apex, combinamos valores de campo (e às vezes texto literal também) usando concatenação. (Você fez concatenação em Noções básicas do Apex para administradores.)
Só para lembrar: quando você concatena, os dados de campo são representados como object.field
. O texto literal fica contido entre aspas simples. Não se esqueça de incluir espaços no início e no fim do texto literal quando necessário. Use o símbolo de mais ( + ) para combinar campos ou para combinar um campo e algum texto literal.
Vamos preencher o corpo do nosso loop for. Primeiro, para cada item da listOfContacts, combinamos FirstName e LastName em uma nova variável chamada fullname:
String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
Observe o espaço entre FirstName e LastName. A saída deve ser assim:
First Name:Angela, Last Name:Carter
(Nome:Angela, Sobrenome:Carter)
não
FirstName:Angela,LastName:Carter
Após o valor da variável fullName (tipo de dados: cadeia de caracteres) ser atribuído, conectaremos essa variável à instrução de depuração na próxima linha:
system.debug(fullName);
Processar itens da lista no loop for
- No método viewContacts, substitua
//loop body
por este código:String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName);
- Salve a classe.
O código deve ficar assim:
public class ContactUtility { public static void viewContacts(){ List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact]; for (Contact con : listOfContacts){ String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName); } } }
Agora que temos uma classe, um método e uma consulta SOQL pronta para uso, vamos executar o código e ver se funciona. Para executar o código do Apex na janela Executar no modo anônimo, especificamos a classe e o método usando notação de ponto.
- Abrir a janela Executar anônimo.
- Na janela Inserir código do Apex, substitua o código existente por este:
ContactUtility.viewContacts();
- Verifique se Abrir log está marcado.
- Clique em Executar.
- Selecione Depurar somente.
As primeiras seis linhas dos resultados devem ser:
Log de execução |
|
Evento |
Detalhes |
USER_DEBUG |
[5]|DEBUG|First Name: Rose, Last Name: Gonzalez |
USER_DEBUG |
[5]|DEBUG|First Name: Sean, Last Name: Forbes |
USER_DEBUG |
[5]|DEBUG|First Name: Jack, Last Name: Rogers |
USER_DEBUG |
[5]|DEBUG|First Name: Pat, Last Name: Stumuller |
USER_DEBUG |
[5]|DEBUG|First Name: Andy, Last Name: Young |
USER_DEBUG |
[5]|DEBUG|First Name: Tim, Last Name: Barr |
Veja só isso! Com a SOQL, um loop for e concatenação, você recuperou dados de contato, atribuiu os dados a uma lista, iterou pela lista e gerou os resultados esperados. Muito bem!