Dalla sorgente dati alla app

La strada più corta per una canvas app parte dai dati. Dalla home di Power Apps si sceglie Start with data, poi Dataverse, si seleziona una tabella e si preme Create app: si ottiene una single-page gallery app già collegata, aperta in Power Apps Studio. La variante Create new data apre il designer delle tabelle (dove puoi usare + New table, + Existing table o Copilot) e genera la app con Save and exit. La terza strada è Create > Create from blank: qui la sorgente la colleghi tu dal menu Data > Add data, e alla prima connessione Power Apps chiede di crearla.

Da lì il pattern non cambia: New screen > List per la galleria, New screen > Form per il dettaglio. La galleria si pilota con la proprietà Items, il form con DataSource e Item (tipicamente BrowseGallery.Selected), le icone con OnSelect e le funzioni NewForm, EditForm, SubmitForm, ResetForm, Remove, Refresh, più Navigate per spostarsi fra schermate. Nota il prerequisito che la doc mette in evidenza: serve il ruolo di sicurezza Environment Maker, e i ruoli di sicurezza personalizzati non sono supportati per gli scenari di maker delle canvas app.

Accessibilità, performance, responsiveness, usabilità

Sono le quattro qualità che il sotto-obiettivo nomina, e ognuna ha strumenti propri.

Per l’accessibilità esiste l’Accessibility checker: si apre dall’icona App checker in alto a destra in Studio e si sceglie Accessibility. Classifica i problemi in Errors, Warnings e Tips, e dopo le correzioni si preme Re-check. Le proprietà su cui lavora sono poche e ricorrenti: AccessibleLabel (l’etichetta per gli screen reader), FocusedBorderThickness (se vale 0 il focus non si vede), Role e Live sul controllo Label, ClosedCaptionsURL e Autostart su Audio e Video. Per la navigazione da tastiera i controlli moderni usano AcceptsFocus, quelli classici TabIndex: la doc raccomanda esplicitamente di restare su 0 o -1 e di ottenere l’ordine desiderato con la struttura dei container, non con indici manuali.

Sulla performance il concetto cardine è la delegation: se Power Fx riesce a tradurre l’espressione in una query che la sorgente sa eseguire, il lavoro resta sul server. Se anche una sola parte non è delegabile, nessuna parte lo è, e Power Apps scarica i primi 500 record (limite alzabile fino a 2.000 con l’impostazione Data row limit in Settings > General). Alzare il limite non è la soluzione: il consiglio della doc è tenerlo basso in test proprio per far emergere le formule non delegabili. Accanto alla delegation ci sono i payload ridotti (Explicit column selection, attiva per default, con ShowColumns quando la lineage delle colonne si perde passando per una collection), i calcoli efficienti (Concurrent per eseguire in parallelo, spostare ForAll dentro Collect e non viceversa) e le fasi di caricamento: la app attraversa nell’ordine Authenticate the user, Get metadata, Initialize the app (dove gira OnStart) e Render the screens. Per osservare che cosa succede davvero si usa Live monitor — il vecchio Monitor, oggi rinominato e documentato fuori dalla sezione delle canvas app — che mostra categoria, durata, dimensione della risposta e formula di ogni evento.

Per la responsiveness si parte da Settings > Display disattivando Scale to fit, Lock aspect ratio e Lock orientation; poi si costruisce con Horizontal container e Vertical container, impostando il container radice a Width = Parent.Width e Height = Parent.Height e distribuendo lo spazio con Fill portions, Flexible width, Align e Justify. L’usabilità è la conseguenza: schermata iniziale leggera, dati filtrati per default, ricerca prima della lista.

Riuso: App.Formulas contro i componenti

Qui si concentra la confusione tipica. Named formulas, user-defined functions e user-defined types non hanno pagine dedicate: sono tre costrutti della proprietà App.Formulas, sono GA, e la ricorsione non è supportata dalle user-defined functions. Le named formulas non possono usare funzioni di comportamento né creare riferimenti circolari; per la logica con effetti collaterali si scrive una user-defined function di comportamento racchiudendone il corpo fra parentesi graffe.

I componenti sono un’altra cosa: si creano da Tree View > Components > New component, espongono custom properties e possono leggere variabili e collection della app solo se attivi Access app scope. Con gli Enhanced component properties i tipi disponibili sono quattro: Data, Function, Action ed Event. La component library è invece il contenitore consigliato per il riuso fra app: si pubblica con una version note, si importa da Get more components, i componenti compaiono sotto Library components e il maker riceve la notifica Update available. Ricorda i limiti: un componente non si inserisce dentro una gallery o un form, non supporta UpdateContext, e i componenti di una library non accedono mai all’app scope.

I quattro modi di tenere un valore

Power Apps documenta tre tipi di variabile: global variables (funzione Set, ambito app), context variables (UpdateContext o Navigate, ambito schermata) e collections (Collect, ClearCollect, ambito app, con SaveData e LoadData sul dispositivo). Tutte partono da blank all’apertura e si perdono alla chiusura, e si ispezionano dal menu Variables. Il quarto modo è la named formula, ed è quasi sempre il migliore: il suo valore è sempre disponibile e sempre aggiornato, la definizione è immutabile, e il calcolo può essere differito a quando serve davvero.

UserEmail = User().Email;
UserInfo = LookUp( Users, 'Primary Email' = UserEmail );

L’esame verifica proprio questa scelta. Attenzione a due dettagli: StartScreen non vede variabili globali né collection, ma vede le named formulas; e With, UpdateContext e Set creano internamente collection in memoria che non partecipano alla delegation, senza mostrare alcun warning. Se ti trovi a scrivere un lungo OnStart pieno di Set, la risposta attesa è spostare quel valore in App.Formulas.