Functie Patch

Van toepassing op: Canvas-apps Modelgestuurde apps Power Platform CLI

Met deze functie kunt u een of meer records in een gegevensbron wijzigen of maken of records buiten een gegevensbron samenvoegen.

Gebruik de functie Patch om records te wijzigen in complexe situaties, zoals bij het uitvoeren van updates waarvoor geen gebruikersinteractie is vereist of bij het gebruik van formulieren die meerdere schermen beslaan.

Als u eenvoudige wijzigingen wilt doorvoeren kunt u in plaats van deze functie beter het besturingselement Edit form gebruiken om records in een gegevensbron gemakkelijker bij te werken. Wanneer u een besturingselement Edit form toevoegt, biedt u gebruikers de mogelijkheid een formulier in te vullen en worden de wijzigingen vervolgens in een gegevensbron opgeslagen. Zie Gegevensformulieren begrijpen voor meer informatie.

Bekijk deze video om te leren hoe u de functie Patch kunt gebruiken:

Overzicht

Gebruik de functie Patch om een of meer records in een gegevensbron te wijzigen. De waarden van specifieke velden worden gewijzigd zonder dat dit van invloed is op andere eigenschappen. Met deze formule wijzigt u bijvoorbeeld het telefoonnummer van een klant met de naam Contoso:

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

Gebruik Patch in combinatie met de functie Defaults om records te maken. Gebruik dit gedrag om één scherm te maken voor zowel het maken als het bewerken van records. Met deze formule maakt u bijvoorbeeld een record voor een klant met de naam Contoso:

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

Zelfs als u niet met een gegevensbron werkt, kunt u Patch gebruiken om twee of meer records samen te voegen. Met deze formule worden bijvoorbeeld twee records samengevoegd tot één record met zowel het telefoonnummer als de locatie van Contoso:

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

Beschrijving

Een record in een gegevensbron wijzigen of maken

Als u deze functie wilt gebruiken met een gegevensbron, geeft u de gegevensbron op en geeft u vervolgens een basisrecord op:

  • Als u een record wilt wijzigen, moet de basisrecord afkomstig zijn van een gegevensbron. De basisrecord kan afkomstig zijn van de eigenschap Items in een galerie, kan in een contextvariabele zijn geplaatst of kan via een ander pad worden aangeleverd. Maar de basisrecord moet altijd zijn terug te leiden tot de gegevensbron. Dit is belangrijk aangezien de record aanvullende informatie bevat die het mogelijk maakt de record terug te vinden wanneer deze moet worden gewijzigd.
  • Als u een record wilt maken, gebruikt u de functie Defaults om een basisrecord met standaardwaarden te maken.

Vervolgens geeft u een of meer wijzigingsrecords op die elk nieuwe eigenschapswaarden bevatten die eigenschapswaarden in de basisrecord overschrijven. Wijzigingsrecords worden verwerkt in de volgorde waarin ze in de lijst met argumenten staan (van het begin naar het eind), waarbij latere eigenschapswaarden de eerdere overschrijven.

De geretourneerde waarde van Patch is de record die u hebt gewijzigd of gemaakt. Als u een record hebt gemaakt, kan de retourwaarde eigenschappen bevatten die de gegevensbron automatisch heeft gegenereerd. De geretourneerde waarde biedt echter geen waarde voor velden van een gerelateerde tabel.

Stel dat u Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); en vervolgens MyAccount.'Primary Contact'.'Full Name' gebruikt. Dat levert in dit geval geen volledige naam op. Gebruik in plaats daarvan een aparte zoekopdracht om toegang te krijgen tot de velden van een gerelateerde tabel, zoals:

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

Wanneer u een gegevensbron bijwerkt, kunnen zich een of meer problemen voordoen. Gebruik IfError en IsError met de geretourneerde waarde van Patch om fouten te detecteren en erop te reageren, zoals wordt beschreven in: Foutafhandling. U kunt ook de functie Errors gebruiken om problemen op te sporen en te onderzoeken, zoals wordt beschreven in Werken met gegevensbronnen.

Gerelateerde functies zijn de functie Update om een volledige record te vervangen en de functie Collect om een record te maken. Gebruik de functie UpdateIf om specifieke eigenschappen van meerdere records te wijzigen op basis van een voorwaarde.

Een set records in een gegevensbron wijzigen of maken

Patch kan ook worden gebruikt om meerdere records met één aanroep te maken of te wijzigen.

In plaats van één basisrecord door te geven, kunt u een tabel met basisrecords opgeven in het tweede argument. Wijzigingsrecords worden ook aangeleverd in een tabel, waarbij ze één op één moeten overeenkomen met de basisrecords. Het aantal records in elke wijzigingstabel moet gelijk zijn aan het aantal records in de basistabel.

Wanneer u Patch op deze manier gebruikt, is de retourwaarde ook een tabel waarin elke record één op één overeenkomt met de basis- en wijzigingsrecords.

Records samenvoegen buiten een gegevensbron

Geef twee of meer records op die u wilt samenvoegen. Records worden verwerkt in de volgorde waarin ze in de lijst met argumenten staan (van het begin naar het eind), waarbij latere eigenschapswaarden de eerdere overschrijven.

Patch retourneert de samengevoegde record en wijzigt argumenten of records in gegevensbronnen niet.

Syntaxis

Een record in een gegevensbron wijzigen of maken

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

  • DataSource: vereist. De gegevensbron die de record bevat die u wilt wijzigen of die de record zal bevatten die u wilt maken.
  • BaseRecord: vereist. De record die moet worden gemaakt of gewijzigd. Als de record afkomstig van een gegevensbron, wordt de record gezocht en gewijzigd. Als het resultaat van Defaults wordt gebruikt, wordt er een record gemaakt.
  • ChangeRecord(s): vereist. Een of meer records die eigenschappen bevatten die moeten worden gewijzigd in de BaseRecord. Wijzigingsrecords worden verwerkt in de volgorde waarin ze in de lijst met argumenten staan (van het begin naar het eind), waarbij latere eigenschapswaarden de eerdere overschrijven.

Een set records in een gegevensbron wijzigen of maken

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

  • DataSource: vereist. De gegevensbron die de records bevat die u wilt wijzigen of de records zal bevatten die u gaat maken.
  • BaseRecordTable: vereist. Een tabel met records die u wilt maken of wijzigen. Als de record afkomstig van een gegevensbron, wordt de record gezocht en gewijzigd. Als het resultaat van Defaults wordt gebruikt, wordt er een record gemaakt.
  • ChangeRecordTable(s): vereist. Een of meer tabellen met records die eigenschappen bevatten die u wilt wijzigen voor elke record in de Basisrecordtabel. Wijzigingsrecords worden verwerkt in de volgorde waarin ze in de lijst met argumenten staan (van het begin naar het eind), waarbij latere eigenschapswaarden de eerdere overschrijven.

Records samenvoegen

Patch( Record1, Record2 [, …] )

  • Record(s): vereist. Ten minste twee records die u wilt samenvoegen. Records worden verwerkt in de volgorde waarin ze in de lijst met argumenten staan (van het begin naar het eind), waarbij latere eigenschapswaarden de eerdere overschrijven.

Voorbeelden

Een record (in een gegevensbron) wijzigen of maken

In deze voorbeelden wijzigt of maakt u een record in een gegevensbron genaamd IceCream, die de gegevens in deze tabel bevat en automatisch de waarden in de ID-kolom genereert:

Voorbeeld IJs.

Formule Omschrijving Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Hiermee wijzigt u een record in de gegevensbron IceCream:
  • De kolom ID van de record die moet worden gewijzigd, bevat de waarde 1. (De record Chocolade heeft die id.)
  • De waarde in de kolom Hoeveelheid wordt gewijzigd in 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

De vermelding Chocolade in de gegevensbron IceCream is gewijzigd.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Hiermee maakt u een record in de gegevensbron IceCream:
  • De kolom ID bevat de waarde 3, die de gegevensbron automatisch genereert.
  • De kolom Hoeveelheid bevat 0, de standaardwaarde voor die kolom in de gegevensbron IceCream, zoals wordt bepaald door de functie Defaults.
  • De kolom Smaak bevat de waarde Aardbei.
{ ID:3, Smaak: “Aardbeien”, Aantal:0 }

De vermelding Aardbei in de gegevensbron IceCream is gemaakt.

Nadat de vorige formules zijn geëvalueerd, heeft de gegevensbron deze waarden:

Voorbeeld IJs na afloop.

Records samenvoegen (buiten een gegevensbron)

Formule Beschrijving Resultaat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Hiermee worden twee records buiten een gegevensbron samengevoegd:
  • De waarden in de kolom Name van elke record komen niet overeen. Het resultaat bevat de waarde (Jim) in de record die zich dichter bij het einde van de lijst met argumenten bevindt in plaats van de waarde (James) in de record die zich dichter bij het begin bevindt.
  • De eerste record bevat een kolom (Score) die niet bestaat in de tweede record. Het resultaat bevat die kolom met de waarde (90).
  • De tweede record bevat een kolom (Passed) die niet bestaat in de eerste record. Het resultaat bevat die kolom met de waarde (true).
{ Name: "Jim", Score: 90, Passed: true }

Het gebruik van As of ThisRecord

Het gebruik van de trefwoorden As of ThisRecord in de formule voorkomt dubbelzinnigheid in de evaluatiecontext.

Bekijk in het onderstaande voorbeeld de eerste 'lookup' in de instructie If. (OrderID = A[@OrderID]) zal naar verwachting de OrderId in het opzoekbereik vergelijken met de OrderId van verzameling A in het ForAll-bereik. In dit geval wilt u waarschijnlijk dat A[@OrderId] wordt omgezet in een lokale parameter. Maar de formule is dubbelzinnig.

Power Apps interpreteert momenteel zowel OrderId aan de linkerkant als A[@OrderId] aan de rechterkant als een veld in het opzoekbereik. Daarom zal de opzoekactie altijd de eerste rij vinden in [dbo].[Orders1] omdat de voorwaarde altijd waar is (dat wil zeggen, elke OrderId van elke rij is gelijk aan zichzelf).

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

As of ThisRecord gebruiken

Gebruik indien mogelijk de operator As of ThisRecord om de linkerkant ondubbelzinnig te maken. As wordt aanbevolen voor het bovenstaande scenario.

Wanneer in uw formule meerdere bereiken worden gebruikt met ForAll, Filter en Lookup voor dezelfde gegevensbron of tabel, bestaat de kans dat de bereikparameters in conflict komen met eenzelfde veld elders. Daarom wordt aanbevolen de operator As of ThisRecord te gebruiken om de veldnaam om te zetten en dubbelzinnigheid te voorkomen.

U kunt bijvoorbeeld de operator As gebruiken om uw formule ondubbelzinnig te maken in het onderstaande voorbeeld.

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

Als alternatief kunt u ThisRecord gebruiken voor hetzelfde doel.

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

Zie voor meer informatie over het gebruik van de operatoren As en ThisRecord het artikel Operatoren.