Functie Patch
Van toepassing op: Canvas-apps Modelgestuurde apps Power Platform CLI Bureaublad-stromen
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 enkele 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 de argumenten of records in geen enkele gegevensbron.
Syntaxis
Een record in een gegevensbron wijzigen of maken
Patch( Gegevensbron, BaseRecord, ChangeRecord1 [, WijzigRecord2, … ])
- DataSource – Verplicht. 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.
- 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( Gegevensbron, BaseRecordsTabel, ChangeRecordTabel1 [, WijzigRecordTabel2, … ] )
- DataSource – Verplicht. 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.
- 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:
Formule | Omschrijving | Result |
---|---|---|
Patch( ijs, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
Hiermee wijzigt u een record in de gegevensbron IceCream:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } De vermelding Chocolade in de gegevensbron IceCream is gewijzigd. |
Patch(Ijs, Standaard(Ijs), { Smaak: "Aardbei" } ) | Hiermee maakt u een record in de gegevensbron IceCream:
|
{ 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:
Records samenvoegen (buiten een gegevensbron)
Formule | Beschrijving | Resultaat |
---|---|---|
Patch( { Naam: "James", Score: 90 }, { Naam: "Jim", Geslaagd: true } ) | Hiermee worden twee records buiten een gegevensbron samengevoegd:
|
{ 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])
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.