Trabajar con relaciones de varios a varios

Completado

Las relaciones de varios a varios le brindan la flexibilidad de realizar un seguimiento cuando varias filas tienen los mismos datos relacionados. A diferencia de las relaciones de uno a varios, las relaciones de varios a varios no tienen el concepto de tabla principal. La relación es completamente simétrica y puede acceder al conjunto de filas relacionadas, comenzando desde cualquier lado de la relación de varios a varios. Para continuar con el modelo de datos de uso compartido del espacio de trabajo de Contoso, las siguientes secciones exploran cómo trabajar con relaciones de varios a varios en una aplicación de lienzo mediante el uso de los elementos Escritorio y Característica de escritorio. El siguiente diagrama ilustra la relación y los datos correspondientes.

Diagrama que ilustra la relación de varios a varios entre escritorios y características de escritorio

Cada escritorio puede tener varias filas de características de escritorio asociadas y puede asociar cada característica de escritorio con varios escritorios. Puede acceder al conjunto de características de escritorio desde una fila de escritorio utilizando la expresión ThisItem.'Desk Features'. Desde la fila de características del escritorio, puede usar la expresión ThisItem.Desks para acceder a todos los escritorios asociados con esa característica de escritorio específica.

Puede usar esta expresión para mostrar una lista de valores separados por comas para cada escritorio en una galería, como se muestra en el siguiente ejemplo.

Captura de pantalla de una galería que muestra una lista de escritorios

Para realizar la tarea de completar el texto de la etiqueta, configure la propiedad Text en la etiqueta a la siguiente fórmula:

Concat(ThisItem.'Desk Features',Name ,",")

Tenga en cuenta las implicaciones de rendimiento cuando utilice esta fórmula, especialmente si tiene muchos registros, debido a cómo se accede a los datos desde Dataverse. La siguiente imagen muestra que, desde el monitor, se completa una llamada a getRows para obtener la lista de escritorios. Para cada escritorio, se hace una llamada a getNavigatedRowInTableRow para recuperar las características del escritorio.

Captura de pantalla de la salida del monitor de mapa, donde se destacan múltiples llamadas de red a getNavigatedRowInTableRow, una para cada fila de escritorio

También puede que le resulte más útil mostrar las características del escritorio solo después de que el usuario haya seleccionado una sola fila del mismo en una galería o después de haber profundizado en los detalles de la fila del escritorio.

Otra forma de usar la relación es permitir que un usuario elija una característica de escritorio y luego use la propiedad controlName.Selected.Desks para rellenar elementos en una galería.

Captura de pantalla que muestra una lista desplegable de ubicaciones y una galería de escritorios

Este enfoque funciona bien cuando solo permite una única selección en el cuadro combinado. Si habilita múltiples selecciones, la lógica se vuelve más compleja. Actualmente, Power Fx no tiene una forma sencilla de expresar una intersección de dos colecciones, que es necesaria para que el escenario funcione. Hay otras soluciones. Por ejemplo, puede iterar a través de todas las características seleccionadas, recopilar escritorios relacionados en una sola colección, eliminar los duplicados y luego usar la colección como origen del elemento. Sin embargo, debido a las múltiples solicitudes de Dataverse (una para cada característica seleccionada), el rendimiento de este enfoque se degradará rápidamente a medida que crezcan las tablas.

Establecer la relación

La forma principal de establecer una relación de varios a varios es utilizar la función Relate(), de forma similar a como lo haría con una relación de uno a varios. La principal diferencia es que no importa qué registro sea el primer o segundo parámetro de Relate() porque no hay una tabla principal en la relación.

La administración de relaciones de varios a varios en un formulario es más compleja que las columnas de búsqueda de varios a uno. La relación de varios a varios está disponible en la lista de campos; sin embargo, cuando agrega el campo al formulario, el sistema no genera las fórmulas para que funcione el control y recibirá un error similar al siguiente ejemplo.

Captura de pantalla del formulario generado automáticamente que incluye una tarjeta de datos de características de escritorio para un campo de varios a varios

Para resolver el problema, actualice la función Choices() en la propiedad Items de la tabla que está en el otro lado de la relación de varios a varios. Para realizar esa tarea, desbloquee la tarjeta de la pestaña Avanzado.

Captura de pantalla del panel de propiedades para el cuadro combinado que se genera como parte del formulario para la relación de muchos a muchos, con la pestaña Avanzado resaltada

En el ejemplo de Contoso, desea utilizar características de escritorio. Después de desbloquear el control, verifique que la propiedad Items muestra 'Características de escritorio' como origen de datos.

Captura de pantalla de las propiedades de la tarjeta de datos

Nota

El escenario anterior usa el formulario para agregar una fila. Para admitir las capacidades de edición, asegúrese de cambiar la propiedad DisplayMode para la tarjeta en la configuración predeterminada Vista a Editar.

Una vez que haya ajustado las propiedades, la interfaz de usuario del formulario funcionará y podrá elegir elementos del cuadro combinado. Sin embargo, si intenta enviar el formulario, recibirá un error similar al siguiente ejemplo.

Captura de pantalla de un mensaje de error que se muestra cuando se envía un formulario con un cuadro combinado de selección múltiple

Para solucionar el problema, elimine la propiedad Update y procese manualmente la asociación de varios a varios después de enviar el formulario.

Captura de pantalla de la propiedad Update de la columna de la tabla asociada con las características de escritorio

Después de haber eliminado la propiedad Update, el envío del formulario funcionará. Sin embargo, no se crearán las relaciones entre el escritorio y las filas de la tabla de características del escritorio. Para establecer las relaciones, agregue la siguiente lógica a la propiedad OnSelect del icono de verificación que se utiliza para enviar el formulario de forma predeterminada:

  1. Guarde las características de escritorio seleccionadas en el cuadro combinado como una colección. Este paso es necesario porque el envío del formulario restablecerá los campos y se perderá el valor.

  2. Envíe el formulario.

  3. Utilice la colección guardada de las características del escritorio para establecer la relación.

Captura de pantalla de la propiedad OnSelect para el icono de la casilla que se utiliza para enviar el formulario

Otras opciones de diseño

La experiencia del usuario con relaciones de varios a varios es similar a las experiencias en las que se utiliza la columna Opciones. Los valores de las opciones están predeterminados por el fabricante y no pueden desactivarse ni protegerse. Por esa razón, los campos de Opciones son adecuados para escenarios con datos que no se suelen modificar, como una lista de países o regiones. Además, las filas de las tablas relacionadas se pueden desactivar, proteger y agregar en tiempo de ejecución. Esa capacidad hace que una relación de muchos a muchos sea una buena opción en escenarios donde se necesita cierta flexibilidad en tiempo de ejecución, como cuando se etiqueta una solución donde el contacto tiene una relación de muchos a muchos con una etiqueta y los usuarios tienen que agregarlas.

Las relaciones de varios a varios son útiles para situaciones en las que desea capturar la asociación entre filas de dos tablas. La relación entre las filas no puede almacenar otros datos. Por ejemplo, si tuviera una relación entre una tabla de contacto y otra de idioma, podría hacer un seguimiento en el que una persona habla dos idiomas.

Diagrama que ilustra la relación de varios a varios entre tablas de contacto e idioma

Sin embargo, no sabría cuánto tiempo ha hablado cada idioma la persona y su nivel de competencia oral.

Un patrón de diseño alternativo común es crear su propia tabla de intersección. La siguiente tabla de Idiomas hablados es otra tabla personalizada de Dataverse. Puede agregar columnas a esta tabla para cualquier otra propiedad que describa la relación específica. Entonces, esta nueva tabla tendrá relaciones N:1 con Contacto e Idioma.

Diagrama que muestra las relaciones entre las tablas de Contacto, Idioma hablado e Idioma

Trabajar con estas tablas desde su aplicación es similar a trabajar con cualquier otra tabla que tenga relaciones de uno a varios o de varios a uno. Debido a que se trata de una tabla adicional, es posible que descubra que se necesitará algo de lógica adicional para garantizar una experiencia de usuario fluida. Es importante comprender los requisitos de su aplicación y saber si una relación de varios a varios necesita hacer un seguimiento de otros datos, especialmente si tenemos en cuenta que debe tomar esta decisión en el momento en que las tablas están relacionadas.