Passaggio all'ora legale 31 marzo 2024 02:00 03:00 sposta avanti l'orologio di 1 ora (si dorme 1 ora in meno)
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 formsCustomize forms

L'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 _resetControl
Power Apps: Parent singola (Combo Box)
dcChoiceParentValue.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
Power Apps: Child multipla (Card)
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 parent
Power Apps: Child multipla (Combo Box)
dcChoiceChildMultipleValue.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).
PublishPublish
Se 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)
Power Apps: Child multipla (Card)
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.
Potrebbe interessarti anche: