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.

Diagramma che illustra la relazione molti-a-molti tra le scrivanie e le caratteristiche delle scrivanie.

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.

Screenshot di una raccolta che mostra un elenco di scrivanie.

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.

Screenshot dell'output del monitoraggio della mappa, che evidenzia più chiamate di rete a getNavigatedRowInTableRow, una per ogni riga 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.

Screenshot che mostra un elenco a discesa di ubicazioni e una raccolta di scrivanie.

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.

Screenshot del modulo generato automaticamente che include una scheda dati Caratteristiche scrivania per un campo molti-a-molti.

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.

Screenshot del pannello Proprietà per la casella combinata generata come parte del modulo per la relazione molti-a-molti, con la scheda Avanzate evidenziata.

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.

Screenshot delle proprietà della scheda 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.

Screenshot di un messaggio di errore che viene visualizzato quando viene inviato un modulo con una casella combinata a selezione multipla.

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

Screenshot della proprietà Update della colonna della tabella associata a Caratteristiche scrivania.

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.

Screenshot della proprietà OnSelect per l'icona della casella di controllo usata per inviare il modulo.

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.

Diagramma che illustra la relazione molti-a-molti tra le tabelle dei contatti e delle 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.

Diagramma che mostra le relazioni tra le tabelle Contatto, Lingua parlata 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.