Skip to main content

Crear consultas de relación con objetos estándar

Objetivos de aprendizaje

Después de completar esta unidad, podrá:

  • Describir dos tipos de consultas de relación.
  • Identificar la relación entre dos objetos.
  • Crear una consulta Secundario a Principal mediante la notación de puntos.
  • Crear una consulta Principal a Secundario mediante una subconsulta.
  • Utilizar una subconsulta para filtrar resultados de consulta.

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 video comienza en el minuto 36:18, en caso de que desee rebobinar y mirar el comienzo del paso nuevamente).

Acerca de las consultas de relaciones

Como administrador de Salesforce, ya está familiarizado con los campos de fórmula que extraen datos de registros relacionados. Ahora puede aplicar sus conocimientos sobre relaciones de objetos para escribir consultas SOQL.

Aunque la cláusula FROM está limitada a un objeto, podemos acceder a dos objetos relacionados a través de una consulta de relación. Una consulta de relación se basa en la relación entre dos objetos diferentes para devolver los campos de ambos objetos. Piense en ello como una consulta de objeto cruzado.

Tenga en cuenta este requisito:

“Obtenga una lista de todos los contactos con el nombre de cuenta de cada contacto”.

Podemos consultar el objeto Contacto, pero no tiene un campo Nombre de cuenta. El nombre de cuenta es en realidad el campo Nombre en la cuenta que está relacionada con el contacto. En una organización, se utiliza un campo de fórmula para acceder a un campo en cualquier objeto relacionado. En Apex, se utiliza una consulta de relación, pero el tipo de consulta de relación dependerá de cómo se relacionan los dos objetos.

Para obtener registros para un:

  • Objeto secundario, e incluir campos de un objeto principal relacionado, utilice una consulta Secundario a Principal.
  • Objeto principal, e incluir campos de un objeto secundario relacionado, utilice una consulta Principal a Secundario.

Antes de decidir qué tipo de consulta utilizar, necesitamos saber cómo nuestros dos objetos, Contacto y Cuenta, están relacionados. ¿Cuál es principal y cuál es secundario?

Identificar la relación de objetos

Como administrador, está familiarizado con las relaciones principal-detalle en una organización. Una relación principal-detalle es una relación principal-secundario. El objeto principal es el principal y el objeto de detalle es el secundario. Si los dos objetos que quiere incluir en una consulta tienen una relación principal-detalle, entonces sabe cuál es principal y cuál es secundario.

Nota

Una relación principal-detalle es una relación de uno a muchos. El objeto principal (principal) puede tener muchos objetos de detalle (secundarios), pero cada objeto de detalle (secundario) tiene un solo objeto principal (principal).

Si no está familiarizado con los dos objetos que quiere incluir en una consulta o no sabe cómo están relacionados, explore los objetos en el Gestor de objetos. Empiece con el objeto que es más probable que sea secundario, y observe sus campos y relaciones. Busque un nombre de campo que pueda conectarse con el objeto principal.

Por ejemplo, el contacto tiene un campo de Id. de cuenta con el tipo de datos Búsqueda (Cuenta). Recuerde que en el código necesitamos el nombre de campo (Id. de cuenta), no la etiqueta de campo (Nombre de cuenta).

La página Campos y relaciones del Gestor de objetos para el objeto Contacto con un campo resaltado. Etiqueta de campo= Nombre de cuenta. Nombre de campo = Id. de cuenta. Tipo de datos = Búsqueda (Cuenta).

En los detalles del campo de Id. de cuenta, el nombre de relación secundaria es Contactos, en plural. De forma predeterminada, el nombre de relación para objetos estándar es la forma plural del nombre de objeto secundario.

Detalles para el campo Nombre de cuenta en el objeto Contacto, con el nombre de relación de secundarios resaltado, que es Contactos.

El nombre de relación de secundarios confirma que Contacto es un secundario de Cuenta. También proporciona el nombre de relación necesario para una consulta Principal a Secundario (de la que hablaremos más adelante en esta unidad).

Crear una consulta Secundario a Principal

Ahora sabemos que Contacto y Cuenta tienen una relación secundario a principal. Contacto es secundario y Cuenta es principal. Para devolver todos los contactos (secundario) y el nombre de cuenta (principal) de cada contacto, se necesita una consulta Secundario a Principal.

En una consulta Secundario a Principal, se consulta el objeto secundario y se obtienen los campos de un objeto principal mediante la notación de puntos, de esta forma:

SELECT Name, Account.Name FROM Contact

Esta declaración SELECT consulta el objeto Contacto. En la cláusula SELECT, Name es el campo de nombre del contacto y Account.Name es el campo de nombre de la cuenta que está relacionada con el contacto.

Ejecutar la consulta Secundario a Principal

  1. En el Editor de consultas de Developer Console, escriba:
    SELECT Name, Account.Name FROM Contact
  2. Haga clic en Ejecutar.

Las primeras seis filas de resultados deberían ser:

Resultado de consulta: Total de filas: 20
Nombre
Account.Name

Rose Gonzales
Edge Communications
Sean Forbes
Edge Communications
Jack Rogers
Burlington Textiles Corp of America
Pat Stumuller
Pyramid Construction Inc.
Andy Young
Dickenson plc
Tim Barr
Grand Hotels & Resorts Ltd

La segunda columna muestra el nombre de cuenta del objeto Cuenta principal del contacto.

Crear una consulta Principal a Secundario

Ahora veamos cómo consultar un objeto principal y obtener campos de su objeto secundario. En una consulta Principal a Secundario, utilizamos una subconsulta para obtener campos del objeto secundario. Una subconsulta es una declaración SELECT entre paréntesis y anidada dentro de otra consulta.

Supongamos que nuestro requisito es:

“Para cada cuenta, devolver el nombre de cuenta y el nombre de cada contacto relacionado”.

Cuando leemos “relacionado” sabemos que necesitamos una consulta de relación. Debido a que Contacto es un secundario de Cuenta, necesitamos una consulta de relación Principal a Secundario, que contenga una subconsulta del objeto secundario.

Consulta principal (para cada cuenta, devolver el nombre de cuenta ) y subconsulta (el nombre de cada contacto relacionado).

La primera parte del requisito, “Para cada cuenta, devolver el nombre de cuenta” se convierte en la consulta principal, que conforma la parte exterior de la consulta completa. La segunda parte del requisito, “el nombre de cada contacto relacionado” se convierte en la subconsulta, la consulta interna anidada dentro de la consulta principal.

Primero, vamos a definir la consulta principal: SELECT Name FROM Account

A continuación, vamos a definir la subconsulta en paréntesis: (SELECT Name FROM Contact)

Luego, ubicamos la subconsulta como si fuera el segundo campo en la consulta principal. Agregamos una coma después de Name e insertamos la subconsulta, de esta forma:

SELECT Name, (SELECT Name FROM Contact) FROM Account. Subconsulta: SELECT Name FROM Contact

Dentro de la subconsulta, en lugar del nombre de campo del objeto relacionado, utilizamos el nombre de relación de secundarios. Así que, como último paso, cambiamos la subconsulta para utilizar el nombre de relación de secundarios Contactos, en lugar del nombre de objeto Contacto, de esta forma:

SELECT Name, (SELECT Name FROM Contacts) FROM Account. Subconsulta: SELECT Name FROM Contacts

Esta consulta devuelve el nombre de cuenta y todos los nombres de contacto para todas las cuentas. Vamos a desglosarlo.

Esta consulta se ejecuta en tres partes:

  1. La consulta selecciona una cuenta y obtiene el campo Nombre de la cuenta. Esa es la consulta principal (la consulta externa).
  2. Luego, la consulta examina los contactos relacionados de la cuenta y obtiene el campo Nombre para cada uno. Esa es la subconsulta (la consulta interna).
  3. Luego, avanza a la siguiente cuenta y repite el proceso hasta que selecciona todas las cuentas.

Ejecutar consulta principal a secundario

  1. En el Editor de consultas, escriba:
    SELECT Name, (SELECT Name FROM Contacts) FROM Account
  2. Haga clic en Execute (Ejecutar).

Las primeras seis filas de resultados deberían tener un aspecto similar a este:

Resultado de consulta: Total de filas: 12
Nombre
Contactos
Edge Communications
[{"Name":"Rose Gonzalez"},{"Name":"Sean Forbes"}]
Burlington Textiles Corp of America
[{"Name":"Jack Rogers"}]
Pyramid Construction Inc.
[{"Name":"Pat Stumuller"}]
Dickenson plc
[{"Name":"Andy Young"}]
Grand Hotels & Resorts Ltd
[{"Name":"John Bond"},{"Name":"Tim Barr"}]
United Oil & Gas Corp.
[{"Name":"Arthur Song"},{"Name":"Avi Green"},{"Name":"Lauren Boyle"},{"Name":"Stella Pavlova"}]

¡Interesante! La ventana Resultados de consulta muestra los nombres de cuenta y una recopilación de los registros de contacto secundarios asociados con cada cuenta. Este tipo de recopilación puede resultar familiar debido a que hablamos sobre asignaciones en el módulo Programación orientada a objetos para administradores.

Si no recuerda lo que es una asignación, no se preocupe, vamos a repasar. Una recopilación de asignaciones contiene pares clave-valor separados por comas. La clave es el nombre de campo, como Nombre. La clave viene seguida de su valor, como Jake Llorrac. Los pares clave-valor se devuelven a través de la declaración anidada SELECT que consulta los contactos relacionados con la cuenta.

Filtrar con una subconsulta

Supongamos que solo queremos cuentas que tienen un contacto relacionado con el apellido Forbes. Esto es complicado porque queremos filtrar el objeto principal, Cuenta, por un valor en el objeto secundario, Contacto. De la misma forma que anidamos una subconsulta dentro de la consulta principal, podemos utilizar una subconsulta (del objeto secundario) en la cláusula WHERE de la consulta principal. Los resultados de la subconsulta funcionan como un filtro para la consulta principal. Si está familiarizado con los filtros cruzados, agregar la cláusula WHERE en la subconsulta equivale a utilizar un filtro cruzado en un reporte.

Empezamos con nuestra consulta existente:
SELECT Name, (SELECT Name FROM Contacts) FROM Account

A continuación, necesitamos una subconsulta que obtenga el campo de Id. de cuenta de los contactos que tienen el apellido Forbes.

(SELECT AccountId FROM Contact WHERE LastName = 'Forbes')

Puede que se pregunte por qué necesitamos el campo de Id. de cuenta del contacto. Comprobamos el campo de Id. de cuenta del contacto para buscar los contactos que están relacionados con una cuenta. Un contacto está relacionado con una cuenta cuando el campo de Id. de cuenta en el objeto Contacto y el campo de Id. en el objeto Cuenta tienen el mismo valor (Contact.AccountId = Account.Id). Así que consultamos el objeto Contacto y devolvemos su valor de Id. de cuenta. Para seleccionar la cuenta que está relacionada con el contacto, buscamos la cuenta que tiene ese valor en su campo de Id.

Por último, agregamos una cláusula WHERE a la consulta principal. Queremos seleccionar un registro Cuenta solo si su Id. está ubicado en el campo de Id. de cuenta de un contacto devuelto por la subconsulta. Así que agregamos WHERE Id IN seguido de la subconsulta, de esta forma:

SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')

Esta consulta hace cuatro cosas.

  1. Esta consulta busca contactos con el apellido Forbes y devuelve el valor del campo de Id. de cuenta de cada contacto. (La subconsulta de cláusula WHERE hace eso).
  2. A continuación, busca el valor de ese Id. de cuenta en el campo de Id. de una cuenta y obtiene el nombre de esa cuenta. (La cláusula WHERE principal hace eso).
  3. Luego, la consulta examina los contactos relacionados de la cuenta y obtiene el nombre de cada contacto. (La subconsulta de la consulta principal hace eso).
  4. Por último, la consulta principal devuelve el nombre de cada cuenta que tiene un contacto relacionado con el apellido Forbes y, para cada una de esas cuentas, los nombres de todos los contactos relacionados.

Ejecutar la consulta filtrada

  1. En el Editor de consultas, escriba:
    SELECT Name, (SELECT Name FROM Contacts)
    FROM Account
    WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
  2. Haga clic en Ejecutar.

Los resultados deberían tener un aspecto similar a este:

Resultados de consulta: Columna 1: Nombres, Columna 2: lista separada por comas de nombre y apellido del contacto.

Resumen

Ahora sabe cómo seleccionar y crear el tipo de consulta de relación correcto para los objetos estándar. En la próxima unidad, aprenderemos sobre las consultas de relación para objetos personalizados.

Recursos

Comparta sus comentarios de Trailhead en la Ayuda de Salesforce.

Nos encantaría saber más sobre su experiencia con Trailhead. Ahora puede acceder al nuevo formulario de comentarios en cualquier momento en el sitio de Ayuda de Salesforce.

Más información Continuar a Compartir comentarios