Uso delle relazioni molti-a-molti

Completato

Le relazioni molti-a-molti offrono la flessibilità di rilevare quando più righe hanno gli stessi dati correlati. A differenza delle relazioni uno-a-molti, le relazioni molti-a-molti non hanno il concetto di tabella primaria. La relazione è completamente simmetrica ed è possibile accedere all'insieme di righe correlate, a partire da entrambi i lati della relazione molti-a-molti. Per continuare con il modello di dati di condivisione dell'area di lavoro di Contoso, le sezioni seguenti illustrano come lavorare con le relazioni molti-a-molti in un'app canvas usando gli elementi Scrivania e Caratteristiche scrivania. Il diagramma seguente illustra la relazione e i dati corrispondenti.

Ogni scrivania può avere più righe di caratteristiche delle scrivanie associate ed è possibile associare ciascuna caratteristica della scrivania a più scrivanie. È possibile accedere al set di caratteristiche della scrivania da una riga della scrivania usando l'espressione ThisItem.'Desk Features'. Dalla riga delle caratteristiche della scrivania, è possibile usare l'espressione ThisItem.Desks per accedere a tutte le scrivanie associate a quella specifica caratteristica della scrivania.

È possibile usare questa espressione per mostrare un elenco di valori separati da virgole per ogni scrivania in una raccolta, come mostrato nell'esempio seguente.

Per portare a termine il compito di popolare il testo dell'etichetta, impostare la proprietà Text sull'etichetta in base alla seguente formula:

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

Prestare attenzione alle implicazioni per le prestazioni quando si usa questa formula, soprattutto se si dispone di molti record, a causa del modo in cui si accede ai dati da Dataverse. L'immagine seguente mostra che, dal monitoraggio, viene completata una chiamata a getRows per ottenere l'elenco delle scrivanie. Per ogni scrivania, viene eseguita una chiamata a getNavigatedRowInTableRow per recuperare le caratteristiche della scrivania.

In alternativa, potrebbe risultare più vantaggioso mostrare le caratteristiche della scrivania solo dopo che l'utente ha selezionato una singola riga della scrivania in una raccolta o ha selezionato i dettagli della riga della scrivania.

Un altro modo per usare la relazione è consentire a un utente di scegliere una caratteristica della scrivania e quindi usare la proprietà controlName.Selected.Desks per popolare gli elementi in una raccolta.

Questo approccio funziona bene quando si consente solo una singola selezione nella casella combinata. Se si abilitano selezioni multiple, la logica diventa più complessa. Attualmente, Power Fx non ha un modo semplice per esprimere un'intersezione di due raccolte, necessaria per il funzionamento dello scenario. Sono possibili soluzioni alternative, ad esempio è possibile iterare tutte le caratteristiche selezionate, raccogliere le scrivanie correlate in un'unica raccolta, rimuovere i duplicati e quindi usare la raccolta come origine dell'elemento. Tuttavia, a causa delle richieste Dataverse multiple (una per ogni caratteristica selezionata), le prestazioni di questo approccio peggioreranno rapidamente man mano che le tabelle crescono.

Definizione della relazione

Il modo principale per stabilire una relazione molti-a-molti consiste nell'usare la funzione Relate(), in modo simile a quanto avviene con una relazione uno-a-molti. La differenza principale è che non importa quale record è il primo o il secondo parametro di Relate(), perché nella relazione non è presente alcuna tabella primaria.

La gestione delle relazioni molti-a-molti in un modulo è più complessa delle colonne di ricerca molti-a-uno. La relazione molti-a-molti è disponibile nell'elenco dei campi; tuttavia, quando si aggiunge il campo al modulo, il sistema non genera le formule affinché il controllo funzioni e si riceverà un errore simile all'esempio seguente.

Per risolvere il problema, aggiornare la funzione Choices() nella proprietà Items per la tabella che si trova dall'altra parte della relazione molti-a-molti. Per svolgere questo compito, sbloccare la scheda dalla scheda Avanzate.

Nell'esempio di Contoso si vogliono usare le caratteristiche della scrivania. Dopo aver sbloccato il controllo, verificare che la proprietà Items mostri 'Desk Features' come origine dati.

Nota

Lo scenario precedente usa il modulo per aggiungere una riga. Per supportare le funzionalità di modifica, assicurarsi di modificare la proprietà DisplayMode per la scheda dall'impostazione predefinita Visualizza a Modifica.

Dopo aver modificato le proprietà, l'interfaccia utente del modulo funzionerà e sarà possibile scegliere gli elementi dalla casella combinata. Tuttavia, se si tenta di inviare il modulo, verrà visualizzato un errore simile a quello del seguente esempio.

Per aggirare il problema, deselezionare la proprietà Update ed elaborare manualmente l'associazione molti-a-molti dopo l'invio del modulo.

Dopo aver deselezionato la proprietà Update, l'invio del modulo funzionerà. Tuttavia, le relazioni tra le righe di tabella Scrivania e Caratteristica scrivania non verranno create. Per stabilire le relazioni, aggiungere la seguente logica alla proprietà OnSelect dell'icona di spunta usata per inviare il modulo per impostazione predefinita:

  1. Salvare le caratteristiche della scrivania selezionate nella casella combinata come una raccolta. Questo passaggio è obbligatorio perché l'invio del modulo ripristinerà i campi e il valore andrà perso.

  2. Inviare il modulo.

  3. Usare la raccolta salvata delle caratteristiche della scrivania per stabilire la relazione.

Altre opzioni di progettazione

L'esperienza utente con relazioni molti-a-molti è simile alle esperienze in cui viene usata la colonna Choices. I valori Choices sono predeterminati dal creatore e non possono essere disabilitati o protetti. Per questo motivo, i campi Choices sono adatti a scenari con dati modificati raramente, come un elenco di paesi/aree geografiche. Inoltre, le righe nelle tabelle correlate possono essere disattivate, protette e aggiunte in runtime. Questa capacità rende una relazione molti-a-molti una buona opzione negli scenari in cui è necessaria una certa flessibilità in runtime, ad esempio quando si assegnano tag a una soluzione in cui il contatto ha una relazione molti-a-molti con un tag e i tag devono essere aggiunti dagli utenti.

Le relazioni molti-a-molti sono utili per le situazioni in cui si desidera acquisire l'associazione tra le righe di due tabelle. La relazione tra le righe non può archiviare altri dati. Ad esempio, se si imposta una relazione tra una tabella Contatto e una tabella Lingua, è possibile tenere traccia del fatto che una persona parla due lingue.

Tuttavia, non è possibile sapere da quanto tempo la persona parla ogni lingua e quanto è abile nel parlarla.

Un modello di progettazione alternativo comune consiste nel creare la propria tabella di intersezione. La seguente tabella Lingua parlata è un'altra tabella Dataverse personalizzata. È possibile aggiungere colonne a questa tabella per qualsiasi altra proprietà che descriva la relazione specifica. Quindi, questa nuova tabella avrà relazioni N:1 con Contatto e Lingua.

L'uso di queste tabelle dall'applicazione è simile all'uso di qualsiasi altra tabella con relazioni uno-a-molti o molti-a-uno. Poiché è coinvolta una tabella aggiuntiva, potrebbe rivelarsi necessaria della logica aggiuntiva per garantire un'esperienza utente fluida. È importante comprendere i requisiti dell'applicazione e sapere se una relazione molti-a-molti deve tenere traccia di altri dati, soprattutto considerando che è necessario prendere questa decisione nel momento in cui le tabelle sono correlate.