Skip to main content

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.
Nota

Nota

Deseja aprender em português (Brasil)? Comece o desafio em um Trailhead Playground de português (Brasil) e use as traduções fornecidas entre parênteses para navegar. Copie e cole somente os valores em inglês porque as validações dos desafios dependem de dados em inglês. Se você não passar no desafio em sua organização de português (Brasil), recomendamos que (1) mude o local para os Estados Unidos, (2) mude o idioma para inglês, seguindo as instruções aqui, e (3) clique novamente no botão “Validar o desafio”.

Consulte o emblema Trailhead no seu idioma para saber mais sobre como aproveitar a experiência de Trailhead em outros idiomas.

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

  1. No Developer Console, clique em Depurar | Abrir a janela Executar no modo anônimo.
  2. Na janela Executar no modo anônimo, atribua os resultados da consulta à nova lista:
    List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
  3. Na linha seguinte, envie a listOfContacts para o log de depuração:
    system.debug(listOfContacts);
  4. Clique na caixa de seleção Abrir log.
  5. Clique em Executar.
  6. 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:
  7. [2] | DEBUG | (Contact: {FirstName = Rose, LastName = Gonzalez, Id = 0036g000040KuVAAU}, Contact: {FirstName = Sean, LastName = Forbes, Id=0036g0000040KuCAAU}). Os registros de contato estão listados em ordem, separados por vírgulas.

    Se uma consulta não encontrar resultados, ela ainda retornará uma lista, que estará vazia:

    [2]|DEBUG|()

O que está realmente acontecendo aqui?

Seta SELECT FirstName, LastName FROM Contact LIMIT 2 apontando para o ícone do objeto de contato em uma nuvem. Uma segunda seta enviando dados que correspondem à consulta à classe do Apex aponta para uma lista de contatos. 1. FirstName = Rose, LastName = Gonzalez. 2. FirstName = Sean, LastName = Forbes.

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.

  1. No Developer Console, clique em Arquivo | Novo | Classe do Apex.
  2. Dê o nome ContactUtility para a classe e clique em OK.
  3. A classe é aberta, exibe código que declara a classe e deixa espaço para o corpo da classe.

  4. Na linha 2, adicione um método chamado viewContacts.
    public static void viewContacts(){
    }
  5. 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];
  6. 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:

for (Contact con : listOfContacts){ //loop body}

Declarar um loop for

  1. No método viewContacts, após a consulta SOQL, cole este código:
    for (Contact con : listOfContacts){
        //loop body
    }
  2. Salve a classe.

Consultamos o banco de dados (1), selecionamos dados, armazenamos os dados em uma lista (2) e criamos um loop for (3).

1. A consulta, Select FirstName, LastName FROM Contact LIMIT 2, alimenta a lista listOfContacts (2). 3. O loop for que processa os contatos na lista listOfContacts: for(Contact con : listOfContacts){ //logic goes here}

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

  1. No método viewContacts, substitua //loop body por este código:
    String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
    system.debug(fullName);
  2. 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.

  1. Abrir a janela Executar anônimo.
  2. Na janela Inserir código do Apex, substitua o código existente por este:
    ContactUtility.viewContacts();
  3. Verifique se Abrir log está marcado.
  4. Clique em Executar.
  5. 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!

Recursos

Compartilhe seu feedback do Trailhead usando a Ajuda do Salesforce.

Queremos saber sobre sua experiência com o Trailhead. Agora você pode acessar o novo formulário de feedback, a qualquer momento, no site Ajuda do Salesforce.

Saiba mais Continue compartilhando feedback