Patch-Funktion

Gilt für: Canvas-Apps Modellgesteuerte Apps Power Platform CLI Desktop-Flows

Ändert oder erstellt einen oder mehrere Datensätze in einer Datenquelle oder verbindet Datensätze außerhalb einer Datenquelle.

Verwenden Sie die Funktion Patch, um Datensätze in komplexen Situationen zu ändern, etwa beim Ausführen von Updates, die keinen Benutzereingriff erfordern oder Formulare verwenden, die sich über mehrere Bildschirme erstrecken.

Verwenden Sie stattdessen das Edit form-Steuerelement, um Datensätze in einer Datenquelle schneller und einfacher zu aktualisieren. Wenn Sie ein Edit form-Steuerelement hinzufügen, geben Sie Benutzern ein Formular an die Hand, das sie ausfüllen und dessen Änderungen sie dann in einer Datenquelle speichern können. Weitere Informationen finden Sie unter Grundlegendes zu Datenformularen.

Sehen Sie sich dieses Video an, um zu erfahren, wie Sie die Patch-Funktion verwenden:

Überblick

Verwenden Sie die Patch-Funktion, um einen oder mehrere Datensätze für die Datenquelle zu ändern. Die Werte bestimmter Felder lassen sich ohne Auswirkungen auf andere Eigenschaften ändern. Beispielsweise ändert diese Formel die Telefonnummer für einen Kunden mit dem Namen Contoso:

Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )

Verwenden Sie die Funktion Patch mit der Defaults-Funktion, um Einträge zu erstellen. Verwenden Sie dieses Verhalten zum Erstellen eines kombinierten Bildschirms für die Erstellung und Bearbeitung von Datensätzen. Beispielsweise erstellt diese Formel einen Datensatz für einen Kunden mit dem Namen Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Auch wenn Sie nicht mit einer Datenquelle arbeiten, können Sie die Patch-Funktion zum Zusammenführen von zwei oder mehr Datensätzen nutzen. Diese Formel führt beispielsweise zwei Datensätze zu einem zusammen, der sowohl die Telefonnummer als auch den Standort von Contoso angibt:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

Beschreibung

Ändern oder Erstellen eines Datensatzes in einer Datenquelle

Um diese Funktion mit einer Datenquelle zu verwenden, geben Sie zunächst die Datenquelle an und anschließend einen Basisdatensatz:

  • Um einen Datensatz zu ändern, muss der Basisdatensatz aus einer Datenquelle stammen. Der Basisdatensatz kann aus der Items-Eigenschaft eines Katalogs stammen, in einer Kontextvariablen platziert worden sein oder anderer Herkunft sein. Sie können den Basisdatensatz jedoch an die Datenquelle zurückverfolgen. Dies ist wichtig, da der Datensatz zusätzliche Informationen enthält, anhand derer Sie ihn wiederfinden können, um ihn zu ändern.
  • Zum Erstellen eines Datensatzes verwenden Sie die Defaults-Funktion und erstellen einen Basisdatensatz mit Standardwerten.

Geben Sie anschließend einen oder mehrere Änderungsdatensätze mit jeweils neuen Eigenschaftswerten an, die die Eigenschaftswerte im Basisdatensatz überschreiben. Änderungsdatensätze werden nacheinander vom Anfang bis zum Ende der Argumenteliste verarbeitet, wobei spätere Eigenschaftswerte frühere Versionen überschreiben.

Der Rückgabewert der Patch-Funktion ist der Datensatz, den Sie erstellt oder geändert haben. Wenn Sie einen Datensatz erstellt haben, kann der Rückgabewert Eigenschaften enthalten, die die Datenquelle automatisch generiert hat. Der Rückgabewert stellt jedoch keinen Wert für Felder einer verknüpften Tabelle bereit.

Zum Beispiel verwenden Sie Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); und dann MyAccount.'Primary Contact'.'Full Name'. In diesem Fall können Sie keinen vollständigen Namen angeben. Um auf die Felder einer verknüpften Tabelle zuzugreifen, verwenden Sie stattdessen eine separate Suche wie:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

Wenn Sie eine Datenquelle aktualisieren, können Probleme auftreten. Verwenden Sie IfError und IsError mit dem Rückgabewert von Patch um Fehler zu erkennen und darauf zu reagieren, wie in Fehlerbehandlung beschrieben. Sie können auch die Errors-Funktion verwenden, um Probleme zu identifizieren und zu untersuchen, wie unter Arbeiten mit Datenquellen beschrieben.

Zu den verwandten Funktionen gehören die Update-Funktion, die Sie verwenden können, um einen vollständiger Datensatz zu ersetzen, und die Collect-Funktion zum Erstellen eines Datensatzes.. Mithilfe der UpdateIf-Funktion können Sie bestimmte Eigenschaften von mehreren Datensätzen auf der Grundlage einer Bedingung ändern.

Ändern oder Erstellen einer Gruppe von Datensätzen in einer Datenquelle

Patch kann außerdem zum Erstellen oder Ändern mehrerer Datensätze mit einem einzigen Aufruf verwendet werden.

Anstelle der Übergabe eines einzelnen Basisdatensatzes kann eine Tabelle mit Basisdatensätze im zweiten Argument angegeben werden. Änderungsdatensätze werden ebenfalls in einer Tabelle bereitgestellt, wobei jedem Änderungsdatensatz direkt ein Datenbank-Datensatz entspricht. Die Anzahl der Datensätze in jeder Änderungstabelle muss mit der Anzahl der Datensätze in der Basistabelle identisch sein.

Wenn Sie die Funktion Patch in dieser Weise verwenden, ist der Rückgabewert ebenfalls eine Tabelle, in der jedem Basisdatensatz jeweils direkt ein Änderungsdatensatz entspricht.

Zusammenführen von Datensätzen außerhalb einer Datenquelle

Geben Sie zwei oder mehr Datensätze an, die Sie zusammenführen möchten. Datensätze werden nacheinander vom Anfang bis zum Ende der Argumenteliste verarbeitet, wobei spätere Eigenschaftswerte frühere Versionen überschreiben.

Patch gibt den zusammengeführten Datensatz zurück. Dessen Argumente oder Datensätze werden in keiner Datenquellen geändert.

Syntax

Ändern oder Erstellen eines Datensatzes in einer Datenquelle

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

  • DataSource – Erforderlich. Die Datenquelle, die den zu ändernden Datensatz enthält oder für die Sie einen Datensatz erstellen möchten.
  • BaseRecord – Erforderlich. Der zu ändernde oder zu erstellende Datensatz. Wenn der Datensatz aus einer Datenquelle stammt, wird der Datensatz gefunden und geändert. Wenn das Ergebnis der Defaults-Funktion verwendet wird, wird ein Datensatz erstellt.
  • ChangeRecord(s) – Erforderlich. Mindestens ein Datensatz, der Eigenschaften enthält, die für jeden Datensatz im BaseRecord geändert werden sollen. Änderungsdatensätze werden nacheinander vom Anfang bis zum Ende der Argumenteliste verarbeitet, wobei spätere Eigenschaftswerte frühere Versionen überschreiben.

Ändern oder Erstellen einer Gruppe von Datensätzen in einer Datenquelle

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )

  • DataSource – Erforderlich. Die Datenquelle mit den zu ändernden Datensätzen oder für die Sie Datensätze erstellen möchten.
  • BaseRecordTable – Erforderlich. Eine Tabelle mit zu ändernden oder zu erstellenden Datensätzen. Wenn der Datensatz aus einer Datenquelle stammt, wird der Datensatz gefunden und geändert. Wenn das Ergebnis der Defaults-Funktion verwendet wird, wird ein Datensatz erstellt.
  • ChangeRecordTable(s) – Erforderlich. Mindestens eine Tabelle von Datensätzen mit Eigenschaften, die für jeden Datensatz von BaseRecordTable geändert werden sollen. Änderungsdatensätze werden nacheinander vom Anfang bis zum Ende der Argumenteliste verarbeitet, wobei spätere Eigenschaftswerte frühere Versionen überschreiben.

Zusammenführen von Datensätzen

Patch( Record1, Record2 [, …] )

  • Record(s) - Erforderlich. Mindestens zwei Datensätze, die Sie zusammenführen möchten. Datensätze werden nacheinander vom Anfang bis zum Ende der Argumenteliste verarbeitet, wobei spätere Eigenschaftswerte frühere Versionen überschreiben.

Beispiele

Ändern oder Erstellen eines Datensatzes (in einer Datenquelle)

In diesen Beispielen ändern oder erstellen Sie einen Datensatz in einer Datenquelle mit dem Namen IceCream, die Daten in dieser Tabelle enthält und automatisch die Werte in der IDSpalte generiert:

Beispiel Icecream.

Formel Beschreibung Result
Patch( IceCream,
LookUp( IceCream, Flavor = „Chocolate“), { Quantity: 400 } )
Ändert einen Datensatz in der IceCream-Datenquelle:
  • Die ID-Spalte des zu ändernden Datensatzes enthält den Wert 1. (Der Chocolate-Datensatz weist diese ID auf.)
  • Der Wert in der Quantity-Spalte ändert sich zu 400.
{ ID: 1, Flavor: „Chocolate“, Quantity: 400 }

Der Eintrag Chocolate in der IceCream-Datenquelle wurde geändert.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Erstellt einen Datensatz in der IceCream-Datenquelle:
  • Die ID-Spalte enthält den Wert 3, den die Datenquelle automatisch generiert.
  • Die Spalte Quantity enthält 0, was dem Standardwert für diese Spalte in der IceCream-Datenquelle entspricht,wie von der Defaults-Funktion angegeben.
  • Die Spalte Flavor enthält den Wert Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Der Eintrag Strawberry in der IceCream-Datenquelle wurde erstellt.

Nachdem die oben genannten Formeln ausgewertet wurden, endet die Datenquelle mit den folgenden Werten:

Beispiel IceCream danach

Zusammenführen von Datensätzen (außerhalb einer Datenquelle)

Formel Beschreibung Ergebnis
Patch( { Name: „James“, Score: 90 }, { Name: „Jim“, Passed: true } ) Verbindet zwei Datensätze außerhalb einer Datenquelle:
  • Die Werte in der Spalte Name jedes Datensatzes stimmen nicht überein. Das Ergebnis enthält den Wert (Jim) im Datensatz, der dem Ende der Argumentliste näher ist, anstelle des Werts (James) im Datensatz, der näher am Anfang ist.
  • Der erste Datensatz enthält eine Spalte (Score), die im zweiten Datensatz nicht vorhanden ist. Das Ergebnis enthält diese Spalte mit dem Wert (90).
  • Der zweite Datensatz enthält eine Spalte (Passed), die im ersten Datensatz nicht vorhanden ist. Das Ergebnis enthält diese Spalte mit dem Wert (TRUE).
{ Name: „Jim“, Score: 90, Passed: true }

Verwendung von As oder ThisRecord

Durch die Stichwörter As oder ThisRecord in der Formel wird ein mehrdeutiger Auswertungskontext vermieden.

Sehen Sie sich im folgenden Beispiel die erste Suche in der If-Aussage an. (OrderID = A[@OrderID]) soll im Suchbereich die OrderId mit der OrderId in der Sammlung A im ForAll-Bereich vergleichen. In diesem Fall soll A[@OrderId] wahrscheinlich als lokaler Parameter behandelt werden. Dies ist aber zweideutig.

Power Apps interpretiert derzeit sowohl die OrderId auf der linken Seite als auch die A[@OrderId] auf der rechten Seite als Feld im Suchbereich. Daher findet die Suche immer die erste Zeile in [dbo].[Orders1] ,weil die Bedingung immer wahr ist (d. h. die OrderId jeder Zeile ist mit sich selbst gleich.)

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Wendung von As oder ThisRecord

Verwenden Sie nach Möglichkeit immer den Operator As oder ThisRecord, um die linke Seite zu unterscheiden. As wird für das obige Szenario empfohlen.

Wenn Ihre Formel mehrere Bereiche mit ForAll, Filter und Lookup in derselben Datenquelle oder Tabelle verwendet, kollidieren die Bereichsparameter eventuell an anderer Stelle mit demselben Feld. Sie sollten deshalb die Operatoren As oder ThisRecord verwenden, um den Feldnamen abzuschließen und Mehrdeutigkeiten zu vermeiden.

Zum Beispiel können Sie mit dem Operator As im Beispiel unten Mehrdeutigkeiten vermeiden.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]' As B,
            B.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]' As C,
                C.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Alternativ können Sie ThisRecord für denselben Zweck verwenden.

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            ThisRecord.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                ThisRecord.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

Mehr über die Verwendung der Operatoren As und ThisRecord erfahren Sie im Artikel über Operatoren.