Suche

PowerFx – Patch

Themen

Sie sehen gerade einen Platzhalterinhalt von YouTube. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.

Mehr Informationen

Daten flexibel und gezielt verändern

In diesem Artikel lernst du, wie du die Power Fx Patch-Funktion verwendest, um Datensätze in Power Apps zu erstellen oder aktualisieren – ohne Formulare. Die Patch‑Funktion in Power Apps erlaubt dir präzise Feldänderungen, Bulk-Updates oder das Zusammenführen von Datensätzen, direkt aus Power Fx ohne die gesamte Datenstruktur neu laden zu müssen. Besonders in Canvas Apps sorgt Patch() für maximale Kontrolle bei der Datenmanipulation. Ob SharePoint, Dataverse oder SQL – die Funktion bietet eine einheitliche Methode zum Schreiben von Daten.

Die Grundsyntax lautet:

Patch(DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ...])

Parameter:

  • DataSource: Die Datenquelle, die geändert werden soll.

  • BaseRecord: Der Datensatz, der aktualisiert oder als Vorlage verwendet wird.

  • ChangeRecord: Ein oder mehrere Datensätze, die die zu ändernden oder hinzuzufügenden Felder enthalten.

Alternativ, für das Erstellen eines neuen Datensatzes:

Patch(DataSource, Defaults(DataSource), { Field1: Value1, Field2: Value2 })

Dieser Aufruf erzeugt einen neuen Datensatz in der angegebenen Datenquelle. Mit Defaults(DataSource) wird ein leerer Standarddatensatz erzeugt, der als Vorlage dient. Anschließend werden die angegebenen Werte in diesem neuen Datensatz gesetzt und gespeichert. Diese Methode eignet sich besonders für Formularanwendungen, bei denen Benutzer neue Einträge erstellen möchten.

Patch in Action

// Beispiel: Update eines bestehenden Kontakts in einer SharePoint-Liste "Kontakte"
Patch(
    Kontakte,
    LookUp(Kontakte, ID = 5), // BaseRecord: Datensatz mit ID 5
    {
        Vorname: "Max",
        Nachname: "Muster",
        Email: "max.muster@example.com"
    }
)

// Beispiel: Neuen Datensatz hinzufügen
Patch(
    Kontakte,
    Defaults(Kontakte), // BaseRecord: Standardwert für neuen Datensatz
    {
        Vorname: "Anna",
        Nachname: "Beispiel",
        Email: "anna.beispiel@example.com"
    }
)
  • Update: Der Datensatz mit ID = 5 in der SharePoint-Liste Kontakte wird mit neuen Werten für Vorname, Nachname und Email überschrieben.
  • Erstellen: Ein neuer Datensatz mit den angegebenen Feldern wird in der Liste Kontakte erstellt, basierend auf den Standardwerten der Datenquelle.

Die Patch()-Funktion zeigt ihre volle Stärke in der Kombination mit weiteren Power Fx-Funktionen:

  • With(): Zur Zwischenspeicherung komplexer Berechnungen oder Bedingungen, wodurch Redundanz vermieden und die Lesbarkeit verbessert wird.
  • If(): Ermöglicht bedingte Datenänderungen. Beispiel: Nur wenn ein Kontrollfeld einen bestimmten Wert hat, wird gepatcht.
  • IsBlank(): Für Validierungen, z.B. um sicherzustellen, dass Pflichtfelder nicht leer sind.
  • FormControls (z.B. TextInput.Text): Die Werte aus Benutzereingaben können direkt übergeben werden, was dynamische und interaktive Formularlogik ermöglicht.

Die Patch()-Funktion ist essenziell für jede Power Platform App, die Daten schreibt. Ihre Vielseitigkeit, Kombinierbarkeit mit Kontroll- und Logikfunktionen und ihre direkte Wirkung auf Datenquellen machen sie zu einem unverzichtbaren Werkzeug effizienter, robuster und nutzerzentrierter Canvas Apps.

In Power Apps stoßen viele früher oder später auf die Herausforderung, mehrere Datensätze in einer Dataverse-Tabelle gleichzeitig zu aktualisieren. Dabei stellt sich oft die Frage: Wie mache ich das am besten, ohne jeden einzelnen Datensatz einzeln patchen zu müssen? Die Antwort darauf liegt in der Kombination von UpdateIf, DropColumns und Patch.

Power Apps

Patch(
    DeineTabelle,
    DropColumns(
        UpdateIf(
            DeineTabelle,
            Status = 'Status (DeineTabelle)'.Inactive,
            {Status: 'Status (DeineTabelle)'.Active}
        ),
        'Created By',
        'Created By (Delegate)',
        'Modified By',
        'Modified By (Delegate)',
        'Owning User',
        Owner
    )
)

Was auf den ersten Blick komplex wirkt, ist im Kern eine elegante Lösung, um eine ganze Gruppe von Datensätzen effizient zu aktualisieren. Die Funktion tut Folgendes: Zunächst werden mit UpdateIf alle Kontakte aus deiner Tabelle gefiltert, deren Status als „Inactive“ markiert ist. Diese werden in einem Schritt auf den Status „Active“ gesetzt. Das Besondere dabei: UpdateIf gibt direkt eine Collection der betroffenen und aktualisierten Datensätze zurück. Bevor diese Collection jedoch mit Patch zurück in die Datenquelle geschrieben wird, sorgt DropColumns dafür, dass schreibgeschützte Systemfelder wie „Created By“ oder „Owner“ entfernt werden. Diese Felder können nicht gepatcht werden und würden sonst zu Fehlern führen.

Beschreibung des Bildes

Der Clou liegt schließlich in der Verwendung von Patch auf die gesamte Collection – das bedeutet, dass alle Änderungen in einem einzigen Vorgang gespeichert werden. Kein Schleifen, kein mehrfaches Patchen – einfach ein sauberer, performanter Batch-Update. Diese Technik ist nicht nur effizient, sondern auch gut skalierbar – besonders bei Anwendungen mit vielen Benutzeraktionen oder großen Datenmengen. Wer Power Fx sauber nutzen möchte, sollte sich unbedingt mit diesem Pattern vertraut machen.

Eine oft unterschätzte Möglichkeit von Patch() ist das direkte Aktualisieren mehrerer bestehender Datensätze anhand eines Filters – ganz ohne ForAll() oder zusätzliche Sammlungen. Dabei wird zunächst über Filter() festgelegt, welche Datensätze aktualisiert werden sollen. Anschließend übergibt Table() eine Liste von Änderungswerten, die der Reihe nach auf die gefundenen Datensätze angewendet werden.

Power Apps
Patch(
    'Explore a List',
    Filter(
        'Explore a List',
        Title = "Eintrag aktualisiert"
    ),
    Table(
        {Title: $"Eintrag 1-1"},
        {Title: $"Eintrag 2-1"},
        {Title: $"Eintrag 3-1"},
        {Title: $"Eintrag 4-1"},
        {Title: $"Eintrag 5-1"},
        {Title: $"Eintrag 6-1"}
    )
)

In diesem Beispiel werden zunächst alle Datensätze aus der Liste Explore a List gesucht, deren Feld Title aktuell den Wert Eintrag aktualisiert besitzt. Anschließend überschreibt Patch() diese Treffer sequenziell mit den neuen Werten aus der Table()-Funktion. Der erste gefundene Datensatz erhält also Eintrag 1-1, der zweite Eintrag 2-1 und so weiter.

Der große Vorteil dieses Ansatzes liegt in der Performance: Statt mehrere einzelne Schreiboperationen an die Datenquelle zu senden, erfolgt die Aktualisierung als Batch-Operation in nur einem einzigen Patch()-Aufruf. Gerade bei Datenquellen wie Microsoft SharePoint oder Microsoft Dataverse kann das API-Aufrufe reduzieren und die App deutlich performanter machen. Wichtig ist dabei, dass die Anzahl der durch Filter() gefundenen Datensätze zur Anzahl der bereitgestellten Datensätze in Table() passt, damit die Zuordnung korrekt erfolgt.

Power Apps
Patch(
    'Explore a List',
    Table(
        Defaults('Explore a List'),
        Defaults('Explore a List')
    ),
    Table(
        {Title: $"Bulk Neu"},
        {Title: $"Bulk Neu"}
    )
)

Das gleiche Prinzip lässt sich nicht nur für das Aktualisieren bestehender Datensätze nutzen, sondern auch für das gleichzeitige Erstellen mehrerer neuer Einträge. Statt über Filter() vorhandene Datensätze auszuwählen, werden in diesem Fall über Defaults() neue leere Datensatzvorlagen erzeugt. Jede Defaults()-Referenz steht dabei für einen neuen Datensatz, der in der Datenquelle erstellt werden soll. Über die zweite Table()-Funktion werden anschließend die jeweiligen Werte übergeben und den neuen Datensätzen zugeordnet. Im gezeigten Beispiel erstellt Patch() somit in nur einem einzigen Aufruf zwei neue Einträge in der Liste Explore a List und setzt jeweils das Feld Title auf Bulk Neu. Gerade bei größeren Datenmengen ist dieser Ansatz deutlich effizienter als mehrere einzelne Patch()-Aufrufe oder eine Kombination mit ForAll(), da die Erstellung als gebündelte Batch-Operation an die Datenquelle übertragen wird.

Fehlerbehandlung mit IfError() bei Patch()

Die Funktion IfError() gehört in Power Fx zu den wichtigsten Werkzeugen für ein robustes Error Handling. Sie prüft, ob der ausgeführte Ausdruck – in diesem Fall der Patch()-Aufruf – erfolgreich abgeschlossen wurde oder ob während der Verarbeitung ein Fehler aufgetreten ist. Solange keine Ausnahme entsteht, liefert IfError() einfach das Ergebnis der eigentlichen Operation zurück. Sobald jedoch ein Fehler erkannt wird, springt Power Fx automatisch in den definierten Fehlerblock und führt die dort hinterlegte Logik aus. Dadurch lassen sich Fehler gezielt behandeln, protokollieren oder über UI-Elemente direkt an Anwender kommunizieren, anstatt diese unbemerkt im Hintergrund auftreten zu lassen.

Gerade bei Batch-Operationen mit Patch() ist dieser Ansatz besonders hilfreich, da bereits ein einzelner fehlerhafter Datensatz dazu führen kann, dass Teile der Operation nicht erfolgreich verarbeitet werden. Im folgenden Beispiel werden zwei neue Datensätze in einem einzigen Bulk-Request erstellt. Während der erste Datensatz mit Bulk Neu einen gültigen Wert erhält, erzeugt der zweite Datensatz über Sequence(), RandBetween(), Mid() und Concat() bewusst einen zufälligen String mit 300 Zeichen. Genau hier entsteht der Fehler: Die Datenquelle Explore a List basiert auf einer SharePoint-Liste, und die Standardspalte Title ist dort als Single line of text definiert. Dieses Feld erlaubt maximal 255 Zeichen. Da der erzeugte String diese Begrenzung überschreitet, lehnt SharePoint das Schreiben des zweiten Datensatzes ab und gibt einen Validierungsfehler an Power Fx zurück.

Durch das Wrapping mit IfError() wird dieser Fehler jedoch nicht still im Hintergrund ausgegeben, sondern gezielt abgefangen. Über FirstError.Message kann direkt auf die originale Fehlermeldung der Datenquelle zugegriffen werden, die anschließend über Notify() innerhalb der App angezeigt wird. Gerade in produktiven Anwendungen verbessert dieser Ansatz nicht nur die Benutzerfreundlichkeit, sondern erleichtert auch die Fehlersuche und Wartung erheblich.

Power Apps
IfError(
    Patch(
        'Explore a List',
        Table(
            Defaults('Explore a List'),
            Defaults('Explore a List')
        ),
        Table(
            {Title: $"Bulk Neu"},
            {
                Title: Concat(
                    Sequence(300),
                    Mid(
                        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
                        RandBetween(
                            1,
                            Len("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
                        ),
                        1
                    )
                )
            }
        )
    ),
    Notify(
        "Some records failed to update: " & FirstError.Message,
        NotificationType.Error
    )
)

Temporäre Records mit Patch() zusammenführen

Die Funktion Patch() wird in Power Fx meist mit externen Datenquellen wie SharePoint oder Dataverse in Verbindung gebracht. Weniger bekannt ist jedoch, dass sich Patch() auch komplett ohne Datenquelle verwenden lässt, um lokale Records miteinander zu kombinieren. Genau das passiert im folgenden Beispiel: Statt einen Datensatz in einer Liste zu speichern, werden zwei einzelne Record-Objekte direkt innerhalb von Patch() miteinander zusammengeführt.

Der erste Record dient dabei als Basis und enthält die Felder name und title. Der zweite Record ergänzt zusätzliche Werte beziehungsweise überschreibt bestehende Felder, falls diese bereits vorhanden sind. Da im zweiten Record ein neues Feld id definiert wird, erweitert Patch() den ursprünglichen Record automatisch um diese Eigenschaft. Würde ein Feldname in beiden Records vorkommen, hätte immer der Wert des zuletzt übergebenen Records Priorität. Das Ergebnis ist somit ein neuer kombinierter Record mit den Feldern name, title und id.

Über Set() wird dieses Ergebnis anschließend in der globalen Variable varRecord gespeichert und kann danach überall in der App weiterverwendet werden. Dieser Ansatz eignet sich besonders, um dynamisch Records aufzubauen, Payloads für API-Aufrufe vorzubereiten oder bestehende Objekte schrittweise um zusätzliche Eigenschaften zu erweitern – ganz ohne eine Verbindung zu einer externen Datenquelle herstellen zu müssen.

Power Apps
Set(
    varRecord,
    Patch(
        {name: "tim", title: "test"},
        {name: "tim", id: 1}
    )
)

Das Ergebnis dieser Operation ist ein neuer zusammengesetzter Record, der die Eigenschaften beider Ausgangsobjekte enthält. Da das Feld name in beiden Records vorhanden ist, bleibt der zuletzt übergebene Wert erhalten. Das Feld title stammt weiterhin aus dem ersten Record, während id aus dem zweiten Record ergänzt wird. Der Inhalt von varRecord würde nach der Ausführung also folgendem JSON-ähnlichen Record entsprechen:

{
    "name": "tim",
    "title": "test",
    "id": 1
}

Fazit

Patch() gehört ohne Zweifel zu den flexibelsten und gleichzeitig mächtigsten Funktionen in Power Fx. Während viele Entwickler die Funktion zunächst nur für einfache Create- oder Update-Operationen einsetzen, zeigt ein genauerer Blick, dass Patch() deutlich mehr leisten kann. Von einzelnen Datensatzänderungen über Bulk-Updates und das gleichzeitige Erstellen mehrerer Records bis hin zu sauberem Error Handling mit IfError() oder dem lokalen Zusammenführen von Record-Objekten – Patch() deckt eine beeindruckende Bandbreite an Szenarien ab.

Gerade in Kombination mit Datenquellen wie SharePoint oder Dataverse lassen sich dadurch performante und wartbare Anwendungen entwickeln, die deutlich effizienter arbeiten als klassische Schleifen- oder Formularansätze. Wer versteht, wie Patch() intern mit Records, Tabellen und Rückgabewerten arbeitet, kann nicht nur Schreiboperationen optimieren, sondern Power Fx insgesamt deutlich eleganter einsetzen. Kurz gesagt: Patch() ist nicht einfach nur eine Speicherfunktion – es ist eines der zentralen Werkzeuge für professionelle Low-Code-Entwicklung mit Power Apps.

noch mehr interessante Beiträge

Nach oben scrollen