Avendo un lista
SharePoint online con delle
choice (dropdown) può sorgere la necessità di dover impostare dei valori in un campo quando cambia un altro campo.
Il caso tipico è quando si hanno due campi a scelta multipla (choice o dropdown) e, in base al valore di una, che chiamiamo
parent, vogliamo impostare dei valori sulla seconda, che chiamiamo
child. Valori che verranno impostati in base alla scelta fatta nel
parent.
In
SharePoint online non esiste un modo nativo per farlo, ma si può raggiungere lo scopo
customizzando il form con
Power Apps.
Customize formsL'approccio classico del programmatore è quello di ragionare in termini di
evento: se cambia il valore sul
parent, gestisco l'evento
onchange e sull'evento
imposto i valori nella
child.
Power Apps però ragiona in modo diverso, l'approccio è più simile ad
Excel o
MVVM. Ovvero non imposto il valore nell'evento,
non posso, devo associare alla proprietà che voglio venga modificata una
formula, poi nell'evento cambio solo le variabili gestite nella formula.
Non posso settare direttamente i valori di una proprietà, posso solo modificare delle variabili e usare queste nelle formule per ottenere il comportamento desiderato. E' poi il motore di
Power Apps che aggiorna tutte le formule dove la variabile è coinvolta.
Il form per l'esempio si presenta in
Power Apps in questo modo
Quello che devo fare per raggiungere lo scopo è agire sul controllo
parent, la choice, e, sull'evento
OnChange, cambiare (UpdateContext) il valore di una variabile di contesto di nome
_resetControldcChoiceParentValue.OnChange = UpdateContext({_resetControl: true});UpdateContext({_resetControl: false})
questa variabile agirà sulla
proprietà Reset del controllo
child.
Da notare che cambio il valore della variabile (true) e poi subito dopo lo ricambio (false).
Sulla
child, nella proprietà
Default imposto la formula che, in funzione del valore in
parent, setterà i default da impostare
dcChoiceChildMultiple.Default = If(dcChoiceParentValue.Selected.Value = "Choice 1",
Filter(
Choices([@TestFormPowerApps].Choice_x0020_1)
,Value = "Voce 3" || Value = "Voce 2"
)
,Blank())
L'esempio è semplice, solo se scelgo il primo valore del
parent preinposto 2 valori sulla
child multi scelta, altrimenti non ci sarà nessun valore selezionato.
I valori da impostare vanno presi dalla collection dei valori della choice (Choices([@TestFormPowerApps].Choice_x0020_1))
L'ultimo passo è
resettare il controllo
child in modo che rilegga la formula nella proprietà
Default.
Lo si ottiene associando nella formula della proprietà
Reset la variabile precedentemente modificata nell'evento del
parentdcChoiceChildMultipleValue.Reset = _resetControl
La proprietà Reset se settata a true, imposta il valori selezionati in funzione della formula presente nella proprietà Default.
Attenzione, esiste anche una istruzione Reset(controllo) ma non funziona in questo caso, va usata la proprietà Reset.
Una volta completato le modifiche ricordati di salvare il form (File / Save) e pubblicarlo (File / Publish to SharePoint).
PublishSe non vedi subito le modifiche ricordati che sei su
SharePoint online, ovvero che ci sono dei tempi tecnici imposti da un ambiente condiviso che serve migliaia di persone. Questo come premessa per dire che ci possono volere alcuni secondi prima che la nuova versione del form sia visibile lato
SharePoint online.
Il risultatop finale sarà simile a questo
Nota
Teoricamente la proprietà
Default della choice
child si potrebbe impostare, in modo più "leggibile", anche con valori fissi senza fare una ricerca con l'istruzione
Filter(collection, expression)dcChoiceChildMultiple.Default = If(dcChoiceParentValue.Selected.Value = "Choice 1",
Table(
{Value: "Voce 3", IsSelected: false},
{Value: "Voce 2", IsSelected: false}
)
,Blank())
semplicemente creando una tabella con l'istruzione
Table(record1, record2, ...), ed infatti funziona.
Lo segnalo solo perché durante i test in alcune situazioni, che non ho ben identificato, mi venivano duplicati i valori.
Ovvero vedevo le voci correttamente presenti nell'elenco ma non risultavano selezionate, quindi potevo selezionarle nuovamente, la versione con
Filter "sembrava" più sicura.
Nell'ultimo test che ho fatto, anche questa versione "sembrava" funzionare correttamente.