Crear consultas SOQL en clases de Apex
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Crear una consulta SOQL en un método.
- Manipular los datos devueltos por una consulta SOQL.
Siga el proceso con Trail Together
¿Desea seguir el proceso con un experto a medida que realiza este paso? Eche un vistazo a este video, parte de la serie Trail Together en Trailhead Live.
(Este clip de video comienza en el minuto 17:32, en caso de que desee retroceder y mirar el comienzo del paso nuevamente).
Introducción
Ahora que comprende los fundamentos de una consulta SOQL, puede aplicar sus conocimientos sobre los campos de fórmula a este tipo de consultas.
Nuestra consulta es bastante simple: SELECT FirstName, LastName FROM Contact
Ahora necesitamos un objeto donde almacenar los datos resultantes. Dado que las consultas SOQL siempre devuelven datos en formato de lista, crearemos una lista de Apex. Como aprendió en Fundamentos de Apex para administradores, se requiere lo siguiente para declarar una lista: la palabra reservada List
, el tipo de datos (en caracteres < >
) y un nombre para la lista. En esta consulta, el tipo de datos es Contacto y el nombre asignado es listOfContacts. La declaración de la lista se ve así:
List<Contact> listofContacts
Para asignar los resultados de la consulta a la nueva lista, usamos un operador de asignaciones, el símbolo igual ( =
), entre la declaración de la lista y la consulta, del siguiente modo:
List<Contact> listofContacts = [SELECT FirstName, LastName FROM Contact];
Observe la sintaxis. La consulta se incluye entre corchetes [ ]
, y la declaración termina con un punto y coma (;
).
Probémoslo en Developer Console. Con fines de prueba, enviamos la lista de contactos al registro de depuración para poder ver cómo funciona el código.
Probar el código en Developer Console
- En Developer Console, haga clic en Depurar | Abrir ventana de ejecución anónima.
- En esta ventana, se asignan los resultados de la consulta a la nueva lista:
List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact LIMIT 2];
- En la siguiente línea, se envía la lista listOfContacts al registro de depuración:
system.debug(listOfContacts);
- Haga clic en la casilla de verificación Abrir registro.
- Haga clic en Execute (Ejecutar).
- En la parte inferior de la ventana Registro de ejecución, haga clic en la casilla de verificación Solo depuración.
Los primeros dos elementos del registro de depuración deberían verse así: -
Si la consulta no arroja resultados, de todos modos devuelve una lista, pero vacía:
[2]|DEBUG|()
¿Qué está ocurriendo aquí realmente?
Cuando se ejecuta el código, primero procesa la consulta:
SELECT FirstName, LastName FROM Contact LIMIT 2
La consulta encuentra todos los contactos y obtiene el nombre y apellido de cada registro. Luego, el código agrega los datos seleccionados de esos registros de contacto a una lista denominada listOfContacts.
Por último, en la línea 2, System.debug
muestra el contenido de listOfContacts
.
Ejecutar consultas SOQL en Apex
En la unidad anterior, utilizó el Editor de consultas para mostrar datos en una tabla. En esta unidad, utilizó la ventana Ejecución anónima para ejecutar una consulta y enviar los resultados al registro de depuración. Está muy bien por ahora, pero los usuarios no ejecutarán consultas en Developer Console. Lo que necesita es una forma de mostrar datos en la interfaz de usuario de su organización. Para hacerlo, puede utilizar las clases y los métodos de Apex. Veamos cómo ejecutar una consulta SOQL y manipular los resultados en Apex.
Para empezar, creamos un método de Apex en una clase de Apex. El método de Apex ejecuta la consulta y selecciona los datos que buscamos.
- En Developer Console, haga clic en Archivo | Nuevo | Clase de Apex.
- Asigne el nombre
ContactUtility
y haga clic en OK (Aceptar). -
La clase se abre, muestra el código que declara dicha clase y deja un espacio para el cuerpo de la clase.
- En la línea 2, agregue un método denominado
viewContacts
.public static void viewContacts(){ }
- En la línea 3, dentro del método
viewContacts
, pegue el código que ejecuta la consulta y asigne los resultados a una nueva lista:List<Contact> listOfContacts = [SELECT FirstName, LastName FROM Contact];
- Guarde la clase.
Ahora cuenta con los datos que precisa en la lista listOfContacts
. Vamos a usar un bucle para iterar a través de la lista a fin de construir el formato que buscamos para los resultados.
Utilizar bucles para iterar a través de una lista
En Programación orientada a objetos para administradores, aprendió a procesar los elementos de una lista, uno por uno, mediante un bucle for. Aquí, mediante el uso de un bucle for, combinamos el nombre y apellido de cada contacto para armar el nombre completo del contacto. Primero, deberá crear el bucle y, luego, procesar cada registro dentro de él.
Para declarar un bucle for, necesita un nombre de variable, su tipo de datos y el nombre de la lista a través de la cual iterará el bucle.
En un bucle for, no se hace referencia directa a objetos específicos. En cambio, se crea una variable para representar a los elementos de la lista dentro del bucle, de a uno por vez. La variable funciona como marcador de posición de cada elemento de la lista. Puede elegir cualquier nombre, pero que sea algo simple. Aquí usaremos con
. Luego, necesitará el tipo de datos de la variable, que es Contact (Contacto), y el nombre de la lista, listOfContacts. En conjunto, se ve así:
Declarar un bucle for
- En el método viewContacts, después de la consulta SOQL, pegue este código:
for (Contact con : listOfContacts){ //loop body }
- Guarde la clase.
Consultamos la base de datos (1), seleccionamos los datos, los almacenamos en una lista (2) y creamos un bucle for (3).
A continuación, dentro del bucle, se procesan los elementos de la lista. Por último, debe mostrar cada contacto de listOfContacts
en este formato:
First Name:<contact's first name>, Last Name:<contact's last name>
Para hacer referencia a un campo para un elemento de una lista, utilice la notación de puntos a fin de especificar el objeto y su campo (objeto.campo). Por ejemplo, si desea hacer referencia al campo FirstName de un objeto Contacto en la lista listOfContacts, coloque un punto (correspondiente a este tipo de notación) entre con (la variable del objeto) y FirstName (el campo), de este modo:
con.FirstName
La lista contiene campos separados para el nombre y el apellido. En Apex, se combinan los valores de los campos (y, a veces, también texto literal) mediante una concatenación de elementos. (Ya practicó la concatenación en Fundamentos de Apex para administradores).
Como recordatorio, al concatenar, los datos de un campo se representan como objeto.campo
. El texto literal está incluido entre comillas simples. No olvide incluir espacios al comienzo y al final del texto literal, si es necesario. Use el símbolo más (+) para combinar campos o para combinar un campo y texto literal.
Complete el cuerpo del bucle for. Primero, para cada elemento de la lista listOfContacts, se combinan FirstName y LastName en una nueva variable, fullname:
String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName;
Observe el espacio entre FirstName y LastName. El resultado debería ser:
First Name: Angela, Last Name: Carter
no
FirstName: Angela,LastName: Carter
Una vez asignado el valor de la variable fullName (tipo de datos: String), sume esa variable a la declaración de depuración en la siguiente línea:
system.debug(fullName);
Procesar elementos de una lista en el bucle for
- En el método viewContacts, debe reemplazar
//loop body
por este código:String fullName = 'First Name: ' + con.FirstName + ', Last Name: ' + con.LastName; system.debug(fullName);
- Guarde la clase.
El código debería verse así:
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); } } }
Ahora que tenemos una clase, un método y una consulta SOQL listos, vamos a ejecutar el código y ver si funciona. Para ejecutar código Apex en la ventana Ejecución anónima, especifique la clase y el método utilizando la notación de puntos.
- Abrir la ventana Execute Anonymous (Ejecución anónima).
- En la ventana Ingresar código Apex, sustituya el código existente por este:
ContactUtility.viewContacts();
- Compruebe que la casilla de verificación Abrir registro esté seleccionada.
- Haga clic en Execute (Ejecutar).
- Seleccione Solo depuración.
Las primeras seis filas de resultados deberían ser:
Registro de ejecución |
|
Evento |
Detalles |
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 |
¡Mire eso! Con SOQL, un bucle for y una concatenación, logró recuperar los datos de contactos, asignar los datos a una lista, iterar a través de la lista y generar los resultados esperados. ¡Allá vamos!