Funktion „ForAll“
Gilt für: Canvas-Apps Desktop-Flows Modellgesteuerte Apps Power Pages Power Platform CLI
Berechnet Werte und führt Aktionen für alle Datensätze in einer Tabelle durch.
Beschreibung
Die ForAll-Funktion wertet eine Formel für alle Datensätze einer Tabelle aus. Die Formel kann einen Wert berechnen und/oder Aktionen ausführen, z. B. das Ändern von Daten oder das Arbeiten mit einer Verbindung. Verwenden Sie die With-Funktion, um die Formel für einen einzelnen Datensatz auszuwerten.
Verwenden Sie die Sequence-Funktion mit der ForAll-Funktion, um basierend auf einer Zählung zu iterieren.
Die Felder des aktuell verarbeiteten Datensatzes sind in der Formel verfügbar. Verwenden Sie den ThisRecord-Operator, oder referenzieren Sie Felder einfach namentlich wie jeden anderen Wert. Der As-Operator kann auch verwendet werden, um den zu verarbeitenden Datensatz zu benennen, wodurch Ihre Formel leichter verständlich wird und verschachtelte Datensätze zugänglich werden. Weitere Informationen finden Sie in den folgenden Beispielen und unter Arbeiten mit Datensatzumfang.
Zurückgegebener Wert
Das Ergebnis jeder Formelauswertung wird in einer Tabelle in der gleichen Reihenfolge wie in der Eingabetabelle zurückgegeben.
Wenn das Ergebnis der Formel ein einzelner Wert ist, ist die resultierende Tabelle eine einspaltige Tabelle. Wenn das Ergebnis der Formel ein Datensatz ist, enthält die resultierende Tabelle Datensätze mit den gleichen Spalten wie der Ergebnisdatensatz.
Wenn das Ergebnis der Formel ein leerer Wert ist, gibt es für diesen Eingabedatensatz in der Ergebnistabelle keinen Datensatz. In diesem Fall gibt es weniger Datensätze in der Ergebnistabelle als in der Quelltabelle.
Ausführen von Aktionen
Die Formel kann Funktionen enthalten, die Aktionen ausführen, wie z. B. die Datensätze einer Datenquelle mit den Funktionen Patch und Collect ändern. Die Formel kann auch Methoden auf Verbindungen aufrufen. Pro Datensatz können mithilfe des ;-Operators mehrere Aktionen ausgeführt werden. Die Tabelle, die das Subjekt der ForAll-Funktion ist, kann nicht geändert werden.
Beim Schreiben der Formel sollten Sie bedenken, dass Datensätze in beliebiger Reihenfolge und nach Möglichkeit parallel verarbeitet werden können. Der erste Datensatz der Tabelle kann nach dem letzten Datensatz verarbeitet werden.
Achten Sie darauf, Reihenfolgeabhängigkeiten zu vermeiden. Aus diesem Grund können Sie die Funktionen UpdateContext, Clear und ClearCollect nicht innerhalb einer ForAll-Funktion verwenden, da sie leicht Variablen enthalten könnten, die für diese Auswirkung anfällig sind. Sie können Collect verwenden, aber die Reihenfolge, in der die Datensätze hinzugefügt werden, ist nicht definiert.
Mehrere Funktionen zum Ändern von Datenquellen, darunter Collect, Remove und Update, geben die geänderte Datenquelle als Rückgabewert zurück. Diese Rückgabewerte können groß sein und umfangreiche Ressourcen in Anspruch nehmen, wenn sie für jeden Datensatz der ForAll-Tabelle zurückgegeben werden. Möglicherweise entsprechen diese Rückgabewerte auch nicht Ihren Erwartungen, da ForAll parallel ausgeführt werden kann, und die Nebeneffekte dieser Funktionen von deren Ergebnis trennen kann. Wenn der Rückgabewert von ForAll nicht verwendet wird, was bei Funktionen für die Änderung von Daten häufig der Fall ist, wird der Rückgabewert nicht erstellt, und es gibt keine Bedenken hinsichtlich Ressourcen oder Reihenfolge. Aber wenn Sie das Ergebnis einer ForAll-Funktion und einer der Funktionen verwenden, die eine Datenquelle zurückgeben, sollten Sie sich genau überlegen, wie Sie das Ergebnis strukturieren, und es zuerst mit kleinen Datensätzen ausprobieren.
Alternativen
Viele Funktionen in Power Apps können gleichzeitig mehrere Werte mit einer einspaltigen Tabelle verarbeiten. Zum Beispiel kann die Len-Funktion eine Tabelle mit Textwerten verarbeiten und eine Tabelle mit Längen auf die gleiche Weise zurückgeben wie ForAll. Dadurch ist ForAll in vielen Fällen nicht mehr erforderlich, und Effizienz und Lesbarkeit können erhöht werden.
Ein weiterer Aspekt ist, dass ForAll im Gegensatz zu anderen Funktionen wie z. B. Filter nicht delegiert werden kann.
Stellvertretung
Diese Funktion kann bei Verwendung einer Datenquelle nicht delegiert werden. Nur der erste Teil der Datenquelle wird abgerufen, bevor die Funktion angewendet wird. Das Ergebnis stellt möglicherweise nicht alles dar. Bei Erstellungszeit erinnert möglicherweise eine Warnung an diese Einschränkung und schlägt den Wechsel zu delegierbaren Alternativen vor, sofern diese bestehen. Weitere Informationen finden Sie unter Überblick über Delegation.
Syntax
ForAll(Table, Formula)
- Tabelle – Erforderlich. Zugrunde liegende Tabelle.
- Formel – Erforderlich. Die Formel zur Auswertung für alle Datensätze der Tabelle.
Beispiele
Kalkulationen
In den folgenden Beispielen wird die Squares-Datenquelle verwendet:
Legen Sie die OnSelect-Eigenschaft eines Button-Steuerelements auf diese Formel fest, öffnen Sie den Vorschaumodus, und wählen Sie anschließend die Schaltfläche aus, um diese Datenquelle als Sammlung zu erstellen:
ClearCollect( Squares, [ "1", "4", "9" ] )
Formel | Beschreibung | Ergebnis |
---|---|---|
FürAlle(Quadrate, Sqrt(Wert)) Sqrt(Quadrate) |
Berechnet für alle Datensätze der Eingabetabelle die Quadratwurzel der Value-Spalte. Die Sqrt-Funktion kann auch mit einer einspaltigen Tabelle verwendet werden, sodass dieses Beispiel ohne ForAll ausgeführt werden kann. | |
FürAlle(Quadrate, Potenz(Wert, 3)) | Berechnet für alle Datensätze der Eingabetabelle die dritte Potenz der Value-Spalte. Die Power-Funktion unterstützt einspaltige Tabellen nicht. Deshalb muss in diesem Fall ForAll verwendet werden. |
Verwenden einer Verbindung
In den folgenden Beispielen wird die Expressions-Datenquelle verwendet:
Legen Sie die OnSelect-Eigenschaft eines Button-Steuerelements auf diese Formel fest, öffnen Sie den Vorschaumodus, und wählen Sie anschließend die Schaltfläche aus, um diese Datenquelle als Sammlung zu erstellen:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
In diesem Beispiel wird auch eine Microsoft Translator -Verbindung verwendet. Wie Sie diese Verbindung zu Ihrer App hinzufügen, erfahren Sie im Artikel Verbindungen verwalten.
Formel | Beschreibung | Ergebnis |
---|---|---|
FürAlle(Ausdrücke, MicrosoftTranslator.Translate(Wert, "es")) | Übersetzt für alle Datensätze in der Expressions-Tabelle den Inhalt der Value-Spalte ins Spanische (abgekürzt "es"). | |
FürAlle(Ausdrücke, MicrosoftTranslator.Translate(Wert, "fr")) | Übersetzt für alle Datensätze in der Expressions-Tabelle den Inhalt der Value-Spalte ins Französische (abgekürzt "fr"). |
Kopieren einer Tabelle
In einigen Fällen müssen Sie Daten filtern, strukturieren, sortieren und bearbeiten. Power Apps bietet dazu viele Funktionen, wie z. B. Filter, AddColumns und Sort. Power Apps behandelt jede Tabelle als Wert, sodass sie Formeln passieren und auf einfache Weise genutzt werden kann.
Und manchmal möchten Sie eine Kopie dieses Ergebnisses zur späteren Verwendung erstellen oder Informationen von einer Datenquelle in eine andere verschieben. Power Apps bietet die Collect-Funktion zum Kopieren von Daten.
Aber bevor Sie diese Kopie erstellen, sollten Sie sich genau überlegen, ob dies erforderlich ist. Viele Situationen können durch Filtern und Strukturieren der zugrunde liegenden Datenquelle nach Bedarf mit einer Formel behoben werden. Zu den Nachteilen der Erstellung einer Kopie gehören:
- Bei zwei Kopien derselben Informationen kann eine von ihnen möglicherweise nicht mehr synchron abgerufen werden.
- Das Erstellen einer Kopie kann viel Arbeitsspeicher, Netzwerkbandbreite und/oder Zeit beanspruchen.
- Bei den meisten Datenquellen kann der Kopiervorgang nicht delegiert werden, und dadurch wird beschränkt, wie viele Daten verschoben werden können.
In den folgenden Beispielen wird die Products-Datenquelle verwendet:
Legen Sie die OnSelect-Eigenschaft eines Button-Steuerelements auf diese Formel fest, öffnen Sie den Vorschaumodus, und wählen Sie anschließend die Schaltfläche aus, um diese Datenquelle als Sammlung zu erstellen:
ClearCollect( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
Unser Ziel ist es, mit einer abgeleiteten Tabelle zu arbeiten, die nur die Artikel enthält, von denen mehr angefordert wurde als verfügbar ist, und für die wir eine Bestellung aufgeben müssen:
Wir können diese Aufgabe auf verschiedene Weisen ausführen, die alle mit verschiedenen Vor- und Nachteilen zum gleichen Ergebnis führen.
Tabellenstrukturierung nach Bedarf
Erstellen Sie keine Kopie! Wir können die folgende Formel an einer beliebigen Stelle verwenden:
// Table shaping on demand, no need for a copy of the result
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Es wird ein Datensatzbereich von den Funktionen Filter und AddColumns erstellt, um den Vergleich bzw. die Subtraktion mit den Feldern 'Quantity Requested' (Angeforderte Menge) und 'Quantity Available' (Verfügbare Menge) jedes Datensatzes durchzuführen.
In diesem Beispiel kann die Filter-Funktion delegiert werden. Dies ist wichtig, da sie alle Produkte finden kann, die die Kriterien erfüllen, auch wenn es nur wenige Datensätze aus einer Tabelle mit Millionen von Datensätzen sind. Zu diesem Zeitpunkt können ShowColumns und AddColumns nicht delegiert werden, sodass die tatsächliche Anzahl von Produkten, die bestellt werden müssen, beschränkt ist. Wenn Sie wissen, dass der Umfang dieses Ergebnisses immer relativ gering sein wird, ist dieser Ansatz in Ordnung.
Und da wir keine Kopie erstellt haben, muss keine zusätzliche Kopie der Informationen verwaltet werden und kann auch nicht veralten.
ForAll nach Bedarf
Ein anderer Ansatz ist die ForAll-Funktion, um die Funktionen zur Tabellenstrukturierung zu ersetzen:
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
Diese Formel ist für einige Personen möglicherweise einfacher zu lesen und zu schreiben.
Kein Teil der ForAll-Funktion kann delegiert werden. Es wird nur der erste Teil der Products-Tabelle ausgewertet, was möglicherweise ein Problem darstellt, wenn diese Tabelle groß ist. Da Filter im vorherigen Beispiel delegiert werden konnte, konnte die Funktion besser mit großen Datensätzen arbeiten.
Sammeln des Ergebnisses
In einigen Situationen ist möglicherweise eine Kopie der Daten erforderlich. Es kann vorkommen, dass Sie Informationen aus einer Datenquelle in eine andere verschieben müssen. In diesem Beispiel werden alle Bestellungen über eine NewOrder-Tabelle auf dem System eines Anbieters aufgegeben. Für Hochgeschwindigkeits-Benutzerinteraktionen empfiehlt es sich, eine lokale Kopie einer Tabelle zwischenzuspeichern, sodass es nicht zu Serverwartezeit kommt.
Wir verwenden die gleiche Tabellenstrukturierung wie in den beiden vorherigen Beispielen, aber wir erfassen das Ergebnis in einer Sammlung:
ClearCollect( NewOrder,
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
)
ClearCollect( NewOrder,
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
ClearCollect und Collect können nicht delegiert werden. Deshalb ist die Menge der Daten, die auf diese Weise verschoben werden können, beschränkt.
Sammeln innerhalb von ForAll
Schließlich können wir Collect direkt in ForAll ausführen:
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
In diesem Fall kann die ForAll-Funktion auch nicht delegiert werden. Wenn die Products-Tabelle sehr groß ist, untersucht ForAll nur den ersten Satz von Datensätzen und lässt möglicherweise Produkte aus, die bestellt werden müssen. Aber für Tabellen, die klein bleiben, ist dieser Ansatz in Ordnung.
Beachten Sie, dass wir das Ergebnis von ForAll nicht erfassen. Die Collect-Funktionsaufrufe, die daraus erfolgen, geben die NewOrder-Datenquelle für alle Datensätze zurück, was auf eine große Datenmenge hinauslaufen könnte, wenn wir es erfassen würden.
Zuordnungstabelle in einer Komponente
Siehe Tabellen zuordnen