Delen via


Patch functie

Van toepassing op: Canvas-apps Copilot Studio Desktop stromen Modelgestuurde apps Power Platform CLI Dataverse-functies

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

Gebruik de Patch functie om records in complexe situaties te wijzigen, zoals wanneer u updates uitvoert waarvoor geen tussenkomst van de gebruiker is vereist of formulieren gebruikt die meerdere schermen omvatten.

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 voor meer informatie over het gebruik van de Patch functie:

Overzicht

Gebruik de Patch functie om een of meer records van 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, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )

Gebruik Patch deze functie 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" } )

Opmerking

Wanneer u een verzameling patcht met behulp van een record uit een gegevensbron met standaardwaarden, werkt de patchbewerking de verzameling bij met zowel de opgegeven patchwaarden als de standaardwaarden van de gegevensbron. De DataSource van de patchinstructie en de DataSource van de functie Defaults moeten overeenkomen om een nieuwe record te maken.

Zelfs als u niet met een gegevensbron werkt, kunt Patch u twee of meer records samenvoegen. 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 heeft mogelijk de eigenschap Items van een galerie doorlopen, in een contextvariabele geplaatst of een ander pad doorlopen. Maar de basisrecord moet altijd zijn terug te leiden tot de gegevensbron. Dit is belangrijk omdat de record aanvullende informatie bevat om de record opnieuw te vinden voor wijziging.
  • 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 retourwaarde is Patch de record die u hebt gewijzigd of gemaakt. Als u een record hebt gemaakt, bevat de retourwaarde mogelijk eigenschappen die automatisch door de gegevensbron worden 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 er een of meer problemen optreden. Gebruik IfError en IsError met de retourwaarde van Patch waaruit fouten kunnen worden gedetecteerd en gereageerd, zoals foutafhandeling beschrijft. 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 op deze manier gebruikmaakt Patch , is de retourwaarde ook een tabel met elke record die overeenkomt met één voor één met de basis en records wijzigen.

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 de argumenten of records niet in gegevensbronnen.

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.
  • Basisrecord – 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. De DataSource van de patchinstructie en de DataSource van de functie Defaults moeten overeenkomen om een nieuwe record te maken.
  • ChangeRecords – 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. De DataSource van de patchinstructie en de DataSource van de functie Defaults moeten overeenkomen om een nieuwe record te maken.
  • ChangeRecordTables – 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 [, ...] )

  • Records - Verplicht. 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 Beschrijving Result
Patch( IJs,
LookUp( IJs, Smaak = "Chocolade" ), { Hoeveelheid: 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, Smaak: "Chocolade", Hoeveelheid: 400 }

De vermelding Chocolade in de gegevensbron IceCream is gewijzigd.
Patch( IJs, Defaults( IJs ), { Smaak: "Aardbeien" } ) 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 Result
Patch( { Naam: "James", Score: 90 }, { Naam: "Jim", Geslaagd: 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).
{ Naam: "Jim", Score: 90, Geslaagd: 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]) wordt verwacht de OrderId in de opzoekscope te vergelijken met de OrderId van de verzameling A in de ForAll scope. 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. Zoals 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.