Strategien zum Laden von Daten

Abgeschlossen

Mit Power Apps haben Benutzer eine effiziente Möglichkeit zur Arbeit mit ihren Geschäftsdaten und ‑prozessen. Mit Konnektoren können Apps auf Daten zugreifen. Wenn eine App gestartet oder ein neuer Bildschirm angezeigt wird, werden normalerweise einige Informationen zur erstmaligen Anzeige abgerufen. Steuerelemente auf den Bildschirmen sind oft direkt an Konnektoren gebunden, und Daten beim Rendern des Bildschirms für den Benutzer abgerufen. Das Navigieren von Bildschirm zu Bildschirm kann auch zum erneuten Abrufen von Daten verwendet werden. In einigen Fällen kann dieser Prozess, wenn er nicht optimiert wurde, zu einer minderwertigen Benutzererfahrung oder zusätzlichen Verarbeitung führen. Durch das Bewerten von Anforderungen Ihrer Benutzer und die Art und Weise, wie Daten geladen werden, können Sie eine Strategie zur Verbesserung der Leistung entwickeln.

Berücksichtigen Sie die folgenden Schlüsselfragen, wenn Sie Ihre App bewerten:

  • Sind die ersten Daten, die dem Benutzer angezeigt werden, nützlich? App-Hersteller möchten oft Daten anzeigen, wenn Benutzer zu einem Bildschirm wechseln. Dieses Verhalten kann dazu führen, dass die App ansprechend aussieht und sich gut demonstrieren lässt. Es ist jedoch ineffizient, wenn die originale Liste nicht regelmäßig verwendet wird. Diese Situation kann dazu führen, dass die App unbeabsichtigt verlangsamt wird, wenn Benutzer eine große Menge ungefilterter Datensätze vorab laden.

  • Bietet die App die korrekten Datenfilter? Das Hinzufügen von Steuerelementen, damit Benutzer Kriterien zum Reduzieren der Anzahl der angezeigten Zeilen eingeben können, kann für die Benutzerproduktivität und ‑leistung hilfreich sein.

  • Entstehen Ihnen durch die Anzeige verwandter Daten zusätzliche Kosten? Wenn Sie eine Datenquelle verwenden, die Zugriff auf relationale Daten bietet, und Sie verwandte Werte in einem Katalog verwenden, kann die App möglicherweise Suchabfragen für jede angezeigte Zeile durchführen. Sie können dieses Problem identifizieren, indem Sie die App mit Monitor ausführen und dann die Ergebnisse überprüfen. Es kann effizienter sein, die zugehörigen Daten vorab in eine Sammlung zu laden und dann in der Sammlung zu suchen.

  • Wissen Sie, welche Daten statisch sind und welche häufig aktualisiert werden? Stellen Sie sicher, dass Sie wissen, ob Daten häufig aktualisiert werden, bevor Sie erwägen, sie vorab zu laden. Das Zwischenspeichern von sich selten ändernden oder statischen Daten kann dazu beitragen, die Leistung der Anwendung zu verbessern, indem die Daten bei Anzeige des Bildschirms bereitstehen. Das Zwischenspeichern von Daten, die sich häufig ändern, kann dafür sorgen, dass die Anwendungsleistung beeinträchtigt wird oder dem Benutzer veraltete Daten angezeigt werden.

  • Möchten Sie Benutzern eine Ladeanzeige anzeigen? Wenn Sie Daten vom Konnektor direkt an das Steuerelement binden, haben Sie nicht die Möglichkeit, eine Ladeanzeige ein‑ und auszublenden, wie wenn Sie die Daten in einer Sammlung zwischenspeichern würden.

  • Wie viele Daten werden aus der Datenquelle geladen? Wenn Sie eine Zwischenspeicherung in Betracht ziehen, stellen Sie sicher, dass die Datenquelle, die Sie zwischenspeichern möchten, nicht mehr Zeilen enthält, als für das Limit der Datenzeilen in den App-Einstellungen konfiguriert sind.

  • Müssen Sie Spalten berechnen oder die geladenen Daten bearbeiten? Wenn die Datenquelle erforderliche Berechnungen unterstützt und die Spalte für mehrere Apps hilfreich ist, versuchen Sie, diese Spalten in der Datenquelle zu implementieren. Microsoft Dataverse verfügt beispielsweise über Berechnungs‑ und Rollup-Spaltenfunktionen.

  • Wie oft muss Ihnen angezeigt werden, dass Daten von einer anderen App oder Automatisierung hinzugefügt/geändert wurden? Wenn Sie Daten vorab in eine Sammlung laden, werden nur die aktualisierten Informationen angezeigt, wenn Sie die Sammlung erneut laden.

Direkte Datenquellenbindung

Wenn Sie die Eigenschaft Items eines Katalogs in die Tabelle eines tabellarischen Konnektoren umwandeln, oder wenn Sie einen Ausdruck wie eine Filter()-Funktion verwenden, die auf der Tabelle basiert, führen Sie eine direkte Datenquellenbindung durch. Der folgende Ausdruck bindet direkt an die Tabelle „Desks“.

SortByColumns(Filter([@Desks], StartsWith(Title, TextSearchBox1.Text)), "Title", If(SortDescending1, Descending, Ascending))

Dieser Ansatz ist für das Laden von Daten der grundlegendste. Daten werden direkt vom Konnektor abgerufen, wenn sich die Kriterien für den Filter ändern. Dieser Ansatz ist eine deklarative Methode zum Laden von Daten, bei der die Power Apps-Laufzeit entscheiden kann, die Daten zu laden und zu aktualisieren. Dadurch können Sie dem Benutzer keine Ladeanzeige anzeigen.

Nachdem die Daten geladen wurden, können sie von Steuerelementen verwendet werden, ohne dass sie jedes Mal aus der Datenquelle abgerufen werden müssen. Sie können Refresh(tableName) verwenden, um die Daten aus der Datenquelle manuell zu aktualisieren. Die in Steuerelementen angezeigten Daten werden automatisch aktualisiert, wenn Daten woanders in der App geändert werden.

Ein weiterer signifikanter Vorteil der Direktbindung besteht darin, dass Sie nicht durch die App-Einstellung Grenzwert für Datenzeilen beschränkt werden, wenn Ihr Konnektor Delegierung unterstützt. Wenn Sie zum Beispiel 100.000 Kontaktzeilen in Microsoft Dataverse und einen Katalog direkt an die Tabelle gebunden haben, lädt der Katalog einen ersten Satz von Elementen und dann weitere, wenn der Benutzer scrollt. Der folgende Screenshot zeigt Monitor-Ereignisse, die einen Aufruf getRows zum Laden der Anfangsdaten enthalten, gefolgt von mehreren Aufrufen getMoreRows, während der Benutzer durch den Katalog scrollt. Diese Aufrufe werden von Power Apps automatisch durchgeführt, und die App muss das Auslagern der Daten nicht verarbeiten.

Screenshot mit Monitor-Ereignissen mit drei Spalten

Wie bereits erwähnt, möchten Sie dem Benutzer nicht 100.000 Zeilen anzeigen. Stattdessen können Sie bei Datenquellen, die Delegierung unterstützen, einen Filter hinzufügen und dann den Konnektor die Filterkriterien verarbeiten lassen und nur übereinstimmende Zeilen zurückgeben.

Daten im Voraus in eine Sammlung laden

Durch das Laden von Daten in eine Sammlung im Voraus können Sie das Laden der Daten entweder in den Eigenschaften App.OnStart oder OnVisible steuern. Daten in App.OnStart im Voraus zu laden, ist eine gute Entscheidung, wenn Sie dieselben Daten auf mehreren Bildschirmen benötigen. Alternativ ermöglicht Ihnen das Laden von Daten von OnVisible im Voraus, das Laden zu verschieben, bis dieser Bildschirm verwendet wird. Bei beiden Optionen haben Sie die Möglichkeit, während des Ladens der Daten einen Ladeindikator anzuzeigen.

Der folgende Ausdruck löscht die colDesks-Sammlung und lädt alle Desks-Tabellenzeilen bis zu den App-Einstellungen Grenzwert für Datenzeilen.

ClearCollect(colDesks,Desks)

Ändern Sie Ihre relevanten Formeln, um die Sammlung zu verwenden und so die vorinstallierten Daten zu verwenden.

Screenshot des Menüs „Strukturansicht > Bildschirme“ mit der hervorgehobenen aktualisierten Formel

Wenn Sie die vorab in eine Sammlung geladenen Daten verwenden, werden die Daten nicht aktualisiert, es sei denn, Sie verwenden die ClearCollect()-Funktion erneut zum Einfügen der aktuellen Daten. Dieses Szenario unterscheidet sich von der direkten Datenquellenbindung, bei der die Aktualisierung automatisch von Power Apps verwaltet wird.

Ein weiterer Vorteil dieser Methode ist, dass Sie Ihrem Benutzer ermöglichen können, mehrere Zeilen zu ändern und zu überprüfen, ohne jede einzelne mit der Datenquelle speichern zu müssen. Nachdem die Änderungen abgeschlossen sind, können Sie sie mit einem einzelnen Patch()-Funktionsaufruf zurück in die Datenquelle übertragen. Um alle Änderungen vor dem Commit rückgängig zu machen, können Sie die Sammlung aktualisieren. Das folgende Beispiel zeigt den Prozess der Verwendung der Patch()-Funktion, um Änderungen in der colDesks-Sammlung zurück in die Desks-Tabelle in Dataverse zu übertragen.

Patch(Desks,colDesks)

Aus persistentem Speicher laden

Eine Variante der einfachen Methode zum im Voraus Laden besteht darin, Daten zuerst aus dem lokalen Speicher Ihres Geräts und dann direkt aus der Datenquelle zu laden. Diese Strategie ist hilfreich, wenn die Datenquelle langsam oder mit Unterbrechungen verfügbar ist. Führen Sie die folgenden Schritte aus, um dieses Muster zu implementieren:

  1. Laden Sie die Daten, falls vorhanden, aus dem lokalen Speicher des Geräts, indem Sie die LoadData()-Funktion verwenden. An diesem Punkt kann jedes Steuerelement, das an die Sammlung gebunden ist, die Daten anzeigen.

  2. Laden Sie Daten direkt aus dem Datenquellen-Konnektor in dieselbe Sammlung. Zu diesem Zeitpunkt würde jedes an die Auflistung gebundene Steuerelement die aktualisierten Daten anzeigen, die vom Konnektor geladen werden.

  3. Verwenden Sie die SaveData()-Funktion, um die aktuellen Daten im lokalen Speicher des Geräts zu speichern.

Ihre Formeln würde dann ungefähr aussehen wie die folgenden:

LoadData(colDesks,"LocalDesks",true);

ClearCollect(colDesks,Desks);

SaveData(colDesks,"LocalDesks");

Wenn Ihre Benutzenden zeitweise nicht verbunden sind, haben Sie die Möglichkeit, eine bedingte Prüfung hinzuzufügen, um zu überprüfen, ob sie verbunden sind, bevor Sie neue Daten laden. Ihre überarbeitete Formeln würde dann ungefähr aussehen wie die folgende:

LoadData(colDesks,"LocalDesks", true);

If (Connection.Connected,

ClearCollect(colDesks,Desks);

SaveData(colDesks,"LocalDesks")

)

Im Voraus in eine Variable laden

Beim Arbeiten mit nicht tabellarischen Konnektoren, wie z. B. Office 365-Benutzer, können Sie die Leistung verbessern, indem Sie die Ergebnisse eines Funktionsaufrufs in einer Variablen speichern. Im folgenden Beispiel ruft die Formel die Funktion dreimal auf, um Informationen aus dem Profil zu erhalten:

Set(profileDisplayName,Office365Users.MyProfileV2().displayName);

Set(profileHireDate,Office365Users.MyProfileV2().hireDate);

Set(profileCity,Office365Users.MyProfileV2().city);

Der folgende Ausdruck ist effizienter, da er den Konnektor nur einmal aufruft, aber dennoch die drei Variablen ausfüllt:

Set(profile,Office365Users.MyProfileV2());

Set(profileDisplayName,profile.displayName);

Set(profileHireDate,profile.hireDate);

Set(profileCity,profile.city);

Sie können es auch weiter auf eine Variable mit dem Namen Profil vereinfachen und dann die Punktnotation verwenden, um bei Bedarf auf die Eigenschaften zuzugreifen. Sie können z. B. die Eigenschaft profileHireDate anstatt der Variable profileHireDate verwenden. Verwenden Sie dazu nur den folgenden Ausdruck in App.OnStart:

Set(profile,Office365Users.MyProfileV2());

Anstatt dann den Ausdruck If(IsBlank(profileHireDate),Red,Green) zu verwenden, der einzelne Variablen zum Festlegen einer Farbe eines Steuerelements nutzt, würden Sie den Ausdruck If(IsBlank(profile.hireDate),Red,Green) Ausdruck verwenden, der stattdessen die Punktnotation profil.hireDate verwendet.

Daten gleichzeitig laden

Wenn Sie Daten von Konnektoren vorab laden und mehrere Elemente zwischenspeichern, werden diese standardmäßig einzeln nacheinander ausgeführt. Das folgende Beispiel zeigt das Laden von zwei Tabellen und dem Benutzerprofil in Sammlungen sowie eine globale Variable.

ClearCollect(colDesks,Desks);

ClearCollect(colDeskFeatures,'Desk Features');

Set(userProfile, Office365Users.MyProfileV2())

Wenn jede Tabelle unabhängig Daten vorab lädt, können Sie sie mit der Concurrent()-Funktion parallel ausführen.

Concurrent(

ClearCollect( colDesks,Desks ),

ClearCollect( colDeskFeatures, 'Desk Features' ),

Set( userProfile, Office365Users.MyProfileV2() )

)

Daten einmal laden

Wenn Sie Daten vorab in App.OnStart laden, wird dies nur einmal ausgeführt, wenn Ihre App gestartet wird. Wenn Sie die Eigenschaft OnVisible verwenden, anstatt zu verschieben, und dann beim ersten Mal bei Verwendung des Bildschirms vorladen, wird OnVisible bei jedem Bildschirmaufruf verwendet. Diese Methode sorgt möglicherweise dafür, dass Ihre Sammlung zu häufig aktualisiert wird. Anstatt eine ClearCollect()-Funktion auszuführen, müssen Sie zuerst überprüfen, ob Sie die Daten bereits geladen haben, um diese Situation zu vermeiden.

Ersetzen Sie den Funktionsaufruf ClearCollect(colDesks,Desks) mit dem Ausdruck If(IsEmpty(colDesks),ClearCollect(colDesks,Desks)), zu dem die Überprüfung gehört, ob die Sammlung leer ist.

App-Einstellungen und Daten laden

Wie bereits erwähnt, können die App-Einstellungen Auswirkungen auf die Leistung und das Verhalten Ihrer App haben. Wenn Sie Sammlungen verwenden, um Daten vorab zu laden, gilt die Datenzeilenlimit und größere Datensätze können für das Laden im Voraus ungeeignet machen.

Verzögerungslast ist eine weitere Einstellung, die Sie beachten sollten. Diese Einstellung verzögert die Aufrufe der Bildschirmausdrücke, bis sie benötigt werden, und führt sie dann bei Bedarf aus. Diese Einstellung ist standardmäßig für alle neuen Apps aktiviert und kann manuell für ältere Apps aktiviert werden.

Das Optimieren des Ladens von Daten für Ihre App ist für jede App einzigartig. In diesem Thema wurde erklärt, wie Sie die Anforderungen Ihrer Benutzenden und der App bewerten, um Ihre Datenladestrategie für die beste Leistung und Benutzererfahrung anzupassen. Die Optimierung ist kein einmaliger Vorgang, sondern etwas, das Sie während der gesamten Lebensdauer der App durchführen werden. Darüber hinaus sollten Sie alle neuen Plattformfunktionen verwenden, die das Laden von Daten optimieren, sobald sie verfügbar sind.