Funktion „ForAll“

Gilt für: Canvas-Apps Desktop-Flows Modellgesteuerte Apps 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(Tabelle, Formel)

  • Table – 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:

Beispiel für Quadrate

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
ForAll( Squares, Sqrt( Wert ) )

Sqrt( Squares )
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. Beispiel für Sqrt
ForAll( Squares, Power( 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. Beispiel für Leistung

Verwenden einer Verbindung

In den folgenden Beispielen wird die Expressions-Datenquelle verwendet:

Beispiel für Ausdrücke

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" ] )

Dieses Beispiel verwendet auch eine Microsoft Translator-Verbindung. Wie Sie diese Verbindung zu Ihrer App hinzufügen, erfahren Sie im Artikel Verbindungen verwalten.

Formel Beschreibung Ergebnis
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Übersetzt für alle Datensätze in der Expressions-Tabelle den Inhalt der Value-Spalte ins Spanische (abgekürzt "es"). Beispiel mit Wert es
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Übersetzt für alle Datensätze in der Expressions-Tabelle den Inhalt der Value-Spalte ins Französische (abgekürzt "fr"). Beispiel mit Wert 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:

Beispiel von Produktdatenquellen

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:

Beispiel einer Ableitungstabelle

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