Strategie di caricamento dei dati
Power Apps consente agli utenti di lavorare in modo efficace con i dati e i processi di business. Le applicazioni possono accedere ai dati mediante i connettori. Generalmente, con l'avvio di un'app o la visualizzazione di una nuova schermata, si recuperano alcune informazioni per la visualizzazione iniziale. Spesso i controlli sulle schermate sono associati direttamente ai connettori e i dati vengono recuperati con il rendering della schermata per l'utente. Anche lo spostamento da una schermata all'altra può comportare di nuovo il recupero dei dati. In alcuni casi, se non ottimizzato, questo processo può essere causa di un'esperienza utente deludente o può comportare un'ulteriore elaborazione. Valutando le esigenze degli utenti e il modo in cui vengono caricati i dati, è possibile sviluppare una strategia per migliorare le prestazioni.
Quando si valuta la propria app, è opportuno prendere in considerazione le seguenti domande chiave:
I dati iniziali mostrati all'utente sono utili? Spesso i creatori di app desiderano che i dati siano visibili agli utenti non appena questi ultimi accedono a una schermata. Questo comportamento può rendere l'app interessante e mostrarne correttamente il funzionamento. Tuttavia, è inefficace quando l'elenco iniziale non viene usato regolarmente. Tale situazione può causare un rallentamento involontario dell'app durante il precaricamento di una grande quantità di record non filtrati da parte dell'utente.
L'app offre i filtri dei dati corretti? La possibilità di aggiungere controlli per consentire agli utenti di immettere criteri allo scopo di ridurre il numero di righe visualizzate può rivelarsi utile per la produttività e le prestazioni degli utenti.
Si sta riscontrando un sovraccarico legato alla visualizzazione dei dati correlati? Se si usa un'origine dati che offre l'accesso ai dati relazionali, e si usano i valori correlati in una raccolta, l'app potrebbe eseguire query di ricerca per ogni riga visualizzata. È possibile identificare questo problema eseguendo l'app con Monitoraggio ed esaminando i risultati. Tuttavia, può dimostrarsi più efficace precaricare i dati correlati in una raccolta nella quale effettuare successivamente la ricerca.
Quali dati sono statici e quali vengono aggiornati frequentemente? Prima di prendere in considerazione il precaricamento dei dati, è necessario sapere se vengono aggiornati di frequente. La memorizzazione nella cache di dati statici o raramente modificati può contribuire a migliorare le prestazioni dell'applicazione grazie alla possibilità di disporre dei dati non appena viene visualizzata la schermata. La memorizzazione nella cache dei dati che variano di frequente può avere un impatto negativo sulle prestazioni dell'applicazione o può comportare la visualizzazione di dati non aggiornati.
Si desidera mostrare all'utente un indicatore di caricamento? Se si associano dati dal connettore direttamente al controllo, non si avrà la possibilità di mostrare e nascondere un indicatore di caricamento come invece succederebbe se i dati fossero stati memorizzati nella cache in una raccolta.
Quanti dati verranno caricati dall'origine dati? Se si prende in considerazione l'ipotesi di memorizzare dati nella cache, assicurarsi che l'origine dati che si sta per memorizzare nella cache non includa più righe del numero configurato come limite di righe di dati nelle impostazioni dell'app.
È necessario calcolare colonne o manipolare i dati caricati? Se l'origine dati supporta i calcoli richiesti e la colonna è utile in varie app, provare a implementare queste colonne nell'origine dati. Ad esempio, Microsoft Dataverse include le funzionalità delle colonne calcolate e di rollup.
Con quale frequenza è necessario vedere i dati aggiunti/modificati da un'altra app o automazione? Se si precaricano dati in una raccolta, quando la raccolta viene ricaricata verranno visualizzate soltanto le informazioni aggiornate.
Associazione diretta dell'origine dati
Quando si imposta la proprietà Items di una raccolta sulla tabella di un connettore tabulare o se si usa un'espressione come una funzione Filter() basata sulla tabella, si esegue l'associazione diretta dell'origine dati. L'espressione seguente effettua l'associazione direttamente alla tabella Desks.
SortByColumns(Filter([@Desks], StartsWith(Title, TextSearchBox1.Text)), "Title", If(SortDescending1, Descending, Ascending))
Questo approccio è il più basilare per il caricamento dei dati. I dati vengono recuperati direttamente dal connettore man mano che i criteri del filtro cambiano. Questo approccio rappresenta un metodo dichiarativo di caricare i dati in cui il runtime di Power Apps può decidere di caricarli e aggiornarli. Di conseguenza, non si ha la possibilità di mostrare all'utente un indicatore di caricamento.
Dopo che saranno stati caricati, i dati possono essere usati dai controlli senza essere recuperati ogni volta dall'origine dati. È possibile aggiornare manualmente i dati dall'origine dati usando Refresh(tableName). I dati visualizzati nei controlli vengono aggiornati automaticamente quando vengono modificati altrove nell'app.
Un altro vantaggio significativo dell'associazione diretta è dato dal fatto che l'impostazione Limite per le righe di dati dell'app non pone limitazioni se il connettore supporta la delega. Ad esempio, se si dispone di 100.000 righe di contatto in Microsoft Dataverse e si associa una raccolta direttamente alla tabella, la raccolta carica un insieme iniziale di elementi per poi ottenerne degli altri man mano che l'utente scorre la schermata. Il seguente screenshot mostra gli eventi di Monitoraggio che includono una chiamata getRows per caricare i dati iniziali, seguita da diverse chiamate getMoreRows via via che l'utente scorre la raccolta. Queste chiamate vengono eseguite automaticamente da Power Apps e l'app non deve gestire il paging dei dati.
Come accennato in precedenza, non si desidera presentare all'utente 100.000 righe. Grazie alle origini dati che supportano la delega, è invece possibile aggiungere un filtro e lasciare che il connettore elabori i criteri di filtro e restituisca solo le righe corrispondenti.
Precaricamento dei dati in una raccolta
Il precaricamento dei dati in una raccolta consente di controllare il caricamento dei dati in entrambe le proprietà App.OnStart e OnVisible. Il precaricamento dei dati in App.OnStart rappresenta una buona scelta se si necessita degli stessi dati su più schermate. In alternativa, il precaricamento dei dati da OnVisible consente di posticipare il carico finché non viene usata tale schermata. Entrambe le opzioni permettono di mostrare un indicatore di caricamento mentre i dati vengono caricati.
L'espressione seguente cancella la raccolta colDesks e carica tutte le righe della tabella Desks fino all'impostazione Limite per le righe di dati dell'app.
ClearCollect(colDesks,Desks)
Per usare i dati precaricati, modificare le formule pertinenti per usare la raccolta.
Quando si usano i dati precaricati in una raccolta, tali dati non vengono aggiornati a meno che non si usi nuovamente la funzione ClearCollect() per importare i dati più recenti. Questo scenario è diverso dall'associazione diretta dell'origine dati, in cui l'aggiornamento è gestito automaticamente da Power Apps.
Un altro vantaggio di questo approccio è rappresentato dal fatto che l'utente può modificare e rivedere gradualmente più righe, senza doverle salvare tutte usando l'origine dati. Una volta completate le modifiche, è possibile eseguirne il commit nell'origine dati usando una singola chiamata della funzione Patch(). Se si desidera annullare tutte le modifiche prima del commit, è possibile aggiornare la raccolta. L'esempio seguente mostra il processo di utilizzo della funzione Patch() per eseguire il commit delle modifiche nella raccolta colDesks nella tabella Desks in Dataverse.
Patch(Desks,colDesks)
Caricamento da archivio persistente
Una variante dell'approccio di precaricamento semplice consiste prima nel caricare i dati dall'archiviazione locale del dispositivo e poi nel continuare a caricarli direttamente dall'origine dati. Questa strategia è utile quando l'origine dati è lenta o disponibile in modo intermittente. Per implementare questo criterio, effettuare i seguenti passaggi:
Caricare i dati, se esistenti, dall'archiviazione locale del dispositivo usando la funzione LoadData(). A questo punto, qualsiasi controllo associato alla raccolta mostrerà i dati.
Caricare i dati direttamente dal connettore dell'origine dati nella stessa raccolta. Quindi, qualsiasi controllo associato alla raccolta dovrebbe mostrare i dati aggiornati caricati dal connettore.
Usare la funzione SaveData() per mantenere i dati più recenti nell'archiviazione locale del dispositivo.
La formule risulteranno simili a quelle riportate di seguito:
LoadData(colDesks,"LocalDesks",true);
ClearCollect(colDesks,Desks);
SaveData(colDesks,"LocalDesks");
Se gli utenti non sono connessi in modo continuativo, è possibile aggiungere un controllo condizionale del relativo stato di connessione prima di tentare di caricare nuovi dati. La formula rivista dovrebbe risultare simile a quella riportata di seguito:
LoadData(colDesks,"LocalDesks", true);
If (Connection.Connected,
ClearCollect(colDesks,Desks);
SaveData(colDesks,"LocalDesks")
)
Precaricamento in una variabile
Quando si usano connettori non tabulari, come Utenti di Office 365, è possibile migliorare le prestazioni salvando i risultati di una chiamata di funzione in una variabile. Nell'esempio seguente la formula chiama la funzione tre volte per ottenere informazioni dal profilo:
Set(profileDisplayName,Office365Users.MyProfileV2().displayName);
Set(profileHireDate,Office365Users.MyProfileV2().hireDate);
Set(profileCity,Office365Users.MyProfileV2().city);
L'espressione seguente è più efficiente perché chiama il connettore solo una volta ma popola comunque le tre variabili:
Set(profile,Office365Users.MyProfileV2());
Set(profileDisplayName,profile.displayName);
Set(profileHireDate,profile.hireDate);
Set(profileCity,profile.city);
È possibile semplificarla ulteriormente con una variabile denominata Profile, quindi usare la notazione con punto per accedere alle proprietà quando richiesto. Ad esempio, è possibile usare la proprietà profile.hireDate anziché la variabile profileHireDate. Per farlo, è necessario usare esclusivamente la seguente espressione in App.OnStart:
Set(profile,Office365Users.MyProfileV2());
Quindi, invece di usare l'espressione If(IsBlank(profileHireDate),Red,Green), che impiega variabili individuali per impostare un colore dei controlli, si usa l'espressione If(IsBlank(profile.hireDate),Red,Green), che include invece la notazione con punto profile.hireDate.
Caricamento simultaneo dei dati
Se si precaricano dati dai connettori e si dispone di più elementi da memorizzare nella cache, per impostazione predefinita, verranno eseguiti uno alla volta in sequenza. L'esempio seguente mostra il processo di caricamento di due tabelle e del profilo utente in raccolte e una variabile globale.
ClearCollect(colDesks,Desks);
ClearCollect(colDeskFeatures,'Desk Features');
Set(userProfile, Office365Users.MyProfileV2())
Se ogni tabella precarica i dati in modo indipendente, è possibile eseguirli in parallelo con la funzione Concurrent().
Concurrent(
ClearCollect( colDesks,Desks ),
ClearCollect( colDeskFeatures, 'Desk Features' ),
Set( userProfile, Office365Users.MyProfileV2() )
)
Caricamento di dati in un'unica volta
Se si precaricano in App.OnStart, i dati verranno eseguiti una sola volta all'avvio dell'app. Se invece si usa la proprietà OnVisible per posticipare, quindi precaricare la prima volta che si usa la schermata, OnVisible verrà eseguito ogni volta che si accede alla schermata. Questo approccio potrebbe aggiornare la raccolta troppo frequentemente. Per evitare questa situazione, anziché eseguire una funzione ClearCollect(), è innanzitutto necessario controllare se i dati sono già stati caricati.
Sostituire la chiamata della funzione ClearCollect(colDesks,Desks) con l'espressione If(IsEmpty(colDesks),ClearCollect(colDesks,Desks)), che consente di verificare se la raccolta è vuota.
Impostazioni dell'app e caricamento dei dati
Come accennato in precedenza, le impostazioni dell'app possono influire sulle prestazioni e sui comportamenti dell'app. Se si usano raccolte per precaricare i dati, si applica l'impostazione Limite per le righe di dati che può rendere inadatti al precaricamento insiemi di dati più grandi.
Un'altra impostazione da tenere presente è Ritarda carico. Questa impostazione ritarda l'esecuzione delle chiamate alle espressioni di schermata finché non sono necessarie, quindi le esegue su richiesta. Inoltre per tutte le nuove app è attivata per impostazione predefinita mentre per le app meno recenti può essere attivata manualmente.
L'ottimizzazione del caricamento dei dati è univoca per ogni app. Questo argomento ha illustrato come valutare le esigenze degli utenti e dell'app per personalizzare la propria strategia di caricamento dei dati per prestazioni e un'esperienza utente migliori. L'ottimizzazione non è un esercizio da eseguire una tantum, ma è un'attività da effettuare per tutto il ciclo di vita dell'app. Inoltre, è possibile trarre vantaggio da tutte le nuove funzionalità della piattaforma che ottimizzano il caricamento dei dati non appena diventano disponibili.

