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:

Overview

Gebruik de Patch functie om een of meer records van een gegevensbron te wijzigen. Het werkt de waarden van specifieke velden bij zonder andere eigenschappen te beïnvloeden. 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" } )

Note

Wanneer je een collectie patcht met een record uit een databron met standaardwaarden, werkt de patchoperatie de collectie bij met zowel de gespecificeerde patchwaarden als de standaardwaarden van de databron. De DataSource van de patch-instructie en de DataSource van de Defaults-functie moeten overeenkomen om een nieuw record te creëren.

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

Description

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:

  • Om een record te wijzigen, moet het basisrecord uit een databron komen. Je kunt het basisrecord krijgen via de Items-eigenschap van een galerie, het in een contextvariabele plaatsen, of via een ander pad verkrijgen. Maar je moet het basisrecord kunnen traceren naar de databron. Deze vereiste is belangrijk omdat het document extra informatie bevat die je helpt het document opnieuw te vinden voor aanpassing.
  • 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

Je kunt ook meerdere Patch records aanmaken of wijzigen met één oproep.

In plaats van een enkel basisrecord door te geven, geef je een tabel van basisrecords in het tweede argument. Geef ook wijzigingsrecords in een tabel, één-op-één overeenkomend met de basisrecords. Het aantal records in elke wijzigingstabel moet gelijk zijn aan het aantal records in de basistabel.

Wanneer je het op deze manier gebruikt Patch , is de retourwaarde ook een tabel waarbij elk 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. De functie verwerkt records in de volgorde van het begin van de argumentlijst tot het einde, waarbij latere eigenschapswaarden de eerdere overschrijven.

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

Syntax

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 het record uit een databron komt, vindt en wijzigt de functie het record. Als het resultaat van Defaults wordt gebruikt, maakt de functie een record aan. 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. De functie verwerkt wijzigingsrecords in volgorde van het begin van de argumentlijst tot het einde, waarbij latere eigenschapswaarden eerdere waarden 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 het record uit een databron komt, vindt en wijzigt de functie het record. Als het resultaat van Defaults wordt gebruikt, maakt de functie een record aan. 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. De functie verwerkt wijzigingsrecords in volgorde van het begin van de argumentlijst tot het einde, waarbij latere eigenschapswaarden eerdere waarden overschrijven.

Merge records

Patch( Record1, Record2 [, ...] )

  • Records - Verplicht. Ten minste twee records die u wilt samenvoegen. De functie verwerkt records in volgorde van het begin van de argumentlijst tot het einde, waarbij latere eigenschapswaarden eerdere overschrijden.

Examples

Een record (in een gegevensbron) wijzigen of maken

In deze voorbeelden wijzig of maak je een record aan in een databron genaamd IceCream. De gegevensbron bevat de gegevens in deze tabel en genereert automatisch de waarden in de ID-kolom:

Screenshot van de voorbeeldtabel met de IceCream-databron die smaken en hoeveelheden toont.

Om een in-memory versie van deze databron te maken zodat je deze voorbeelden kunt proberen, evalueer je deze formule:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description 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 Chocolade-vermelding in de IceCream-databron is aangepast.
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 Aardbei-vermelding in de IceCream-databron wordt aangemaakt.

Nadat de vorige formules zijn geëvalueerd, eindigt de databron met deze waarden:

Screenshot van de IceCream-databron nadat de Patch formules zijn geëvalueerd.

Records samenvoegen (buiten een gegevensbron)

Formula Description 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 }

Een set records aanpassen of aanmaken (in een databron)

Wanneer je tabellen gebruikt Patch in plaats van losse records, kun je meerdere records in één aanroep aanmaken of wijzigen. De returnwaarde is een tabel met records die één-op-één overeenkomt met de invoertabellen.

Dit voorbeeld werkt de Hoeveelheid bij voor meerdere smaken in de IceCream-databron tegelijk:

Patch(
    IceCream,
    Table(
        { ID: 1, Flavor: "Chocolate", Quantity: 150 },
        { ID: 2, Flavor: "Vanilla", Quantity: 200 }
    ),
    Table(
        { Quantity: 300 },
        { Quantity: 400 }
    )
)

Het resultaat is een tabel met de bijgewerkte records: { ID: 1, Flavor: "Chocolate", Quantity: 300 } en { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Dit voorbeeld maakt meerdere nieuwe records aan met Defaults:

Patch(
    IceCream,
    Table( Defaults( IceCream ), Defaults( IceCream ) ),
    Table(
        { Flavor: "Mint", Quantity: 60 },
        { Flavor: "Peach", Quantity: 80 }
    )
)

Note

Wanneer je het met tabellen gebruikt Patch , moet het aantal records in elke wijzigingstabel overeenkomen met het aantal records in de basistabel. Anders treedt er een fout op.

Om fouten te detecteren wanneer je meerdere records aanpast, gebruik je IfError. IfError is het voorkeursmechanisme en werkt over Power Fx-hosts:

IfError(
    Patch(
        IceCream,
        baseRecords,
        changeRecords
    ),
    Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)

Patch met Dataverse-kolomtypen

De volgende voorbeelden zijn specifiek van toepassing op Microsoft Dataverse databronnen. Recordvormen verschillen per databron (bijvoorbeeld SharePoint en SQL Server hebben verschillende formaten).

Keuzekolom: Om een Choice-kolom in te stellen, gebruik je direct de enumwaarde. Dit voorbeeld stelt een kolom Statuskeuze in in een Accounts-tabel :

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Status': 'Status (Accounts)'.Active }
)

Opzoekkolom: Om een opzoekkolom in te stellen, geef je een record met de primaire sleutel van de gerelateerde tabel. Dit voorbeeld stelt de zoekopdracht voor Primaire Contacten in op een Accounts-record :

Patch(
    Accounts,
    LookUp( Accounts, 'Account Name' = "Contoso" ),
    { 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)

Note

Deze kolomvoorbeelden zijn Dataverse-specifiek. Andere databronnen, zoals SharePoint of SQL Server, kunnen verschillende recordvormen vereisen voor vergelijkbare kolomtypen. Raadpleeg de documentatie van jouw specifieke databron voor het juiste formaat.

Delegatie in formules die gebruiken Patch

De Patch functie zelf is niet onderworpen aan delegering omdat deze naar de databron schrijft in plaats van deze te bevragen. Echter, delegatiewaarschuwingen kunnen verschijnen in formules die worden gebruikt Patch als het recordselectiegedeelte van de formule (zoals Filter, LookUp of ForAll) een query bevat die de limieten voor gegevensbrondelegatie overschrijdt.

Wanneer je een delegatiewaarschuwing ziet in een formule die , Patchcontroleer of de waarschuwing geldt voor de gegevensophaalfuncties in plaats van voor Patch zichzelf. Voor meer informatie over delegering, zie Delegatie begrijpen in een canvas-app.

Veelvoorkomende fouten met de Patch functie

Wanneer je de Patch functie gebruikt, kunnen er fouten optreden door connectiviteit met de databron, permissies of dataconflicten. Gebruik IfError en IsError om fouten te detecteren en passend te reageren.

  • "Netwerkfout bij gebruik Patch van functie": Deze fout geeft meestal aan dat de app de databron niet kan bereiken. Veelvoorkomende oorzaken zijn een verloren internetverbinding, het tijdelijk onbereikbaar zijn van de databron, of onvoldoende rechten voor de huidige gebruiker. Wikkel de Patch aanroep in IfError om gebruikers een betekenisvolle boodschap te geven.

  • "Er bestaan conflicten met wijzigingen op de server": Deze fout doet zich voor wanneer een andere gebruiker of proces hetzelfde record wijzigt tussen het moment dat je app het record leest en de wijziging schrijft. Ververs de gegevensbron door de Refresh-functie aan te roepen en probeer de bewerking opnieuw.

  • Fouten in de rechtsopschrift: Als de gebruiker geen toestemming heeft om records in de databron aan te maken of te wijzigen, mislukt de Patch aanroep. Gebruik IfError om fouten met betrekking tot toestemmingen op te sporen en de gebruiker te begeleiden.

Voor algemene patronen voor foutafhandeling, zie Foutafhandeling.

Het gebruik van As of ThisRecord

Gebruik het As- of ThisRecord-trefwoord in je formule om ambigu evaluatiecontext te voorkomen.

In het volgende voorbeeld beschouw je het eerste Lookup in de If stelling. (OrderID = A[@OrderID]) wordt verwacht dat de OrderId in de Lookup scope wordt vergeleken met de OrderId of collection A in de ForAll scope. In dit geval wil A[@OrderId] je waarschijnlijk als lokale parameter oplossen. Maar het is dubbelzinnig.

Power Apps interpreteert momenteel zowel de linkerzijde OrderId als de rechterzijde A[@OrderId] als een veld in de Lookup scope. Daarom vindt altijd Lookup de eerste rij in [dbo].[Orders1] omdat de voorwaarde altijd waar is (dat wil zeggen, elke rij is OrderId 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 waar mogelijk de operator : As of het ThisRecord-sleutelwoord om de linkerkant te onderscheiden. Zoals aanbevolen voor het voorgaande scenario.

Wanneer je formule meerdere scopes gebruikt met ForAll, Filter, en Lookup op dezelfde databron of tabel, kunnen scopeparameters botsen met hetzelfde veld elders. Gebruik daarom de operator: As of ThisRecord om de veldnaam op te lossen en ambiguïteit te voorkomen.

Je kunt bijvoorbeeld de operatorje As gebruiken om te disambigueren in het volgende 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"
       }
   )
    )
)

Voor meer informatie over het gebruik van de As-operator en ThisRecord, zie het artikel Operators .