Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
Gælder for: Lærredsapps
Copilot Studio
Desktop flow
Modeldrevne apps
Power Platform CLI
Dataverse-funktioner
Redigerer eller opretter en eller flere poster i en datakilde eller fletter poster uden for en datakilde.
Brug funktionen Patch til at ændre poster i komplekse situationer, f.eks. når du foretager opdateringer, der ikke kræver brugerinteraktion, eller bruge formularer, der strækker sig over flere skærme.
Hvis du vil opdatere poster i en datakilde lettere for enkle ændringer, skal du i stedet bruge kontrolelementet Edit form. Når du tilføjer et Edit form-kontrolelement, kan du give brugerne en formular, som de skal udfylde, og du kan derefter gemme ændringerne i en datakilde. Du kan finde flere oplysninger i Forstå dataformularer.
Se denne video for at få mere at vide om, hvordan du bruger funktionen Patch :
Overview
Brug funktionen Patch til at ændre en eller flere poster i en datakilde. Den opdaterer værdierne for specifikke felter uden at påvirke andre egenskaber. Denne formel ændrer f.eks. telefonnummeret til en kunde, der hedder Contoso:
Patch( Customers, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )
Bruges Patch sammen med funktionen Defaults til at oprette poster. Brug denne funktionalitet til at opbygge et enkelt skærmbillede, hvor der både kan oprettes og redigeres poster. Denne formel vil f.eks. oprette en post for kunden Contoso:
Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )
Note
Når du patcher en samling ved at bruge en post fra en datakilde med standardværdier, opdaterer patch-operationen samlingen med både de specificerede patchværdier og standardværdierne fra datakilden. DataSource for patch-sætningen og DataSource for Defaults-funktionen skal matche for at oprette en ny post.
Selvom du ikke arbejder med en datakilde, kan du bruge Patch til at flette to eller flere poster. Denne formel fletter f.eks. to poster til én, der identificerer både telefonnummeret og adressen for Contoso:
Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )
Description
Rediger eller opret en post i en datakilde
Hvis du vil bruge denne funktion med en datakilde, skal du angive datakilden og derefter angive en basispost:
- For at ændre en post skal basisposten komme fra en datakilde. Du kan få basisposten gennem galleriets Items-egenskab , placere den i en kontekstvariabel eller hente den via en anden sti. Men du skal kunne spore basisposten tilbage til datakilden. Dette krav er vigtigt, fordi registreringen indeholder ekstra oplysninger, som hjælper dig med at finde den igen til redigering.
- Hvis du vil oprette en post, skal du bruge funktionen Defaults til at oprette en basispost med standardværdier.
Angiv derefter en eller flere ændringsposter, der hver indeholder de nye egenskabsværdier, som tilsidesætter egenskabsværdierne i basisposten. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.
Returværdien for Patch er den post, du har ændret eller oprettet. Hvis du har oprettet en post, kan returværdien indeholde egenskaber, som datakilden genererede automatisk. Returværdien indeholder dog ikke en værdi for felter i en relateret tabel.
Du kan f.eks bruge Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); og derefter MyAccount.'Primary Contact'.'Full Name'. Du kan ikke give et fuldt navn i dette tilfælde. Hvis du i stedet vil have adgang til felterne i en relateret tabel, skal du bruge et separat opslag, f.eks.:
LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'
Når du opdaterer en datakilde, kan der opstå et eller flere problemer. Brug IfError og IsError med returværdien fra Patch til at registrere og reagere på fejl, som beskrevet i Fejlhåndtering . Du kan også bruge funktionen Errors til at identificere og undersøge problemer, sådan som det er beskrevet under Arbejde med datakilder.
Relaterede funktioner omfatter funktionen Update, som du kan bruge til at erstatte en hel post, samt funktionen Collect, som du kan bruge til at oprette en post. Brug funktionen UpdateIf til at ændre bestemte egenskaber i flere poster baseret på en betingelse.
Rediger eller opret et sæt af poster i en datakilde
Du kan også bruge Patch den til at oprette eller ændre flere poster med et enkelt opkald.
I stedet for at sende en enkelt basepost, giv en tabel over baserecords i det andet argument. Giv også ændringsposter i en tabel, der svarer én-til-én med basisposterne. Antallet af poster i hver ændringstabel skal være det samme som antal poster i basistabellen.
Når du bruger Patch på denne måde, er returværdien også en tabel, hvor hver post svarer én-til-én med basis- og ændringsposterne.
Flet poster uden for en datakilde
Angiv to eller flere poster, du vil flette. Funktionen behandler poster i rækkefølgen fra begyndelsen af argumentlisten til slutningen, hvor senere egenskabsværdier overtrumfer tidligere.
Patch returnerer den flettede post og ændrer ikke argumenterne eller posterne i nogen datakilder.
Syntax
Rediger eller opret en post i en datakilde
Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])
- DataSource – påkrævet. Den datakilde, der indeholder den post, du vil redigere eller oprette.
- BaseRecord – Påkrævet. Den post, der skal ændres eller oprettes. Hvis posten stammer fra en datakilde, finder og ændrer funktionen posten. Hvis resultatet af Defaults bruges, opretter funktionen en post. DataSource for programrettelsessætningen og DataSource for funktionen Defaults skal stemme overens, før du kan oprette en ny post.
- ChangeRecords – Påkrævet. En eller flere poster, der indeholder egenskaber, som skal ændres i Basispost. Funktionen behandler ændringer af poster i rækkefølge fra begyndelsen af argumentlisten til slutningen, hvor senere egenskabsværdier overtrumfer tidligere.
Rediger eller opret et sæt af poster i en datakilde
Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, ... ] )
- DataSource – påkrævet. Den datakilde, som indeholder de poster, du vil redigere eller oprette.
- BaseRecordTable – Påkrævet. En tabel med poster, der skal ændres eller oprettes. Hvis posten stammer fra en datakilde, finder og ændrer funktionen posten. Hvis resultatet af Defaults bruges, opretter funktionen en post. DataSource for programrettelsessætningen og DataSource for funktionen Defaults skal stemme overens, før du kan oprette en ny post.
- ChangeRecordTables – Påkrævet. En eller flere tabeller med poster, som indeholder de egenskaber, der skal ændres for hver post i BaseRecordTable. Funktionen behandler ændringer af poster i rækkefølge fra begyndelsen af argumentlisten til slutningen, hvor senere egenskabsværdier overtrumfer tidligere.
Merge records
Patch( Record1, Record2 [, ...] )
- Poster - Påkrævet. Mindst to poster, du vil flette. Funktionen behandler poster i rækkefølge fra begyndelsen af argumentlisten til slutningen, hvor senere ejendomsværdier overskygger de tidligere.
Examples
Rediger eller opret en post (i en datakilde)
I disse eksempler ændrer eller opretter du en post i en datakilde kaldet IceCream. Datakilden indeholder dataene i denne tabel og genererer automatisk værdierne i ID-kolonnen:
For at skabe en in-memory version af denne datakilde, så du kan prøve disse eksempler, evaluer denne formel:
ClearCollect( IceCream,
{ ID: 1, Flavor: "Chocolate", Quantity: 100 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
| Formula | Description | Result |
|---|---|---|
|
Patch( Is, LookUp( is, smag = "chokolade" ), { mængde: 400 } ) |
Ændrer en post i datakilden IceCream:
|
{ ID: 1, Smag: "Chokolade", Mængde: 400 } Chokolade-posten i IceCream-datakilden er ændret. |
| Patch( Is, Standard( Is, { Smag: "Jordbær" } ) | Ændrer en post i datakilden IceCream:
|
{ ID: 3, Smag: "Jordbær", Mængde: 0 } Jordbær-posten i IceCream-datakilden oprettes. |
Efter at de tidligere formler er evalueret, slutter datakilden med disse værdier:
Flet poster (uden for en datakilde)
| Formula | Description | Result |
|---|---|---|
| Patch( { Navn: "James", Score: 90 }, { Name: "Jim", Passed: true } ) | Fletter to poster uden for en datakilde:
|
{ Navn: "Jim", Score: 90, Bestået: sand } |
Ændr eller opret et sæt poster (i en datakilde)
Når du bruger Patch tabeller i stedet for enkeltposter, kan du oprette eller ændre flere poster i et enkelt kald. Returværdien er en tabel med poster, der svarer én-til-én med inputtabellerne.
Dette eksempel opdaterer mængden for flere smagsvarianter i IceCream-datakilden på én gang:
Patch(
IceCream,
Table(
{ ID: 1, Flavor: "Chocolate", Quantity: 150 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
),
Table(
{ Quantity: 300 },
{ Quantity: 400 }
)
)
Resultatet er en tabel med de opdaterede poster: { ID: 1, Flavor: "Chocolate", Quantity: 300 } og { ID: 2, Flavor: "Vanilla", Quantity: 400 }.
Dette eksempel opretter flere nye poster ved hjælp af Defaults:
Patch(
IceCream,
Table( Defaults( IceCream ), Defaults( IceCream ) ),
Table(
{ Flavor: "Mint", Quantity: 60 },
{ Flavor: "Peach", Quantity: 80 }
)
)
Note
Når du bruger Patch med tabeller, skal antallet af poster i hver ændringstabel matche antallet af poster i basistabellen. Ellers opstår der en fejl.
For at opdage fejl, når du ændrer flere poster, brug IfError.
IfError er den foretrukne mekanisme og fungerer på tværs af Power Fx-værter:
IfError(
Patch(
IceCream,
baseRecords,
changeRecords
),
Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)
Patch med Dataverse-kolonnetyper
Følgende eksempler gælder specifikt for Microsoft Dataverse datakilder. Postformerne varierer efter datakilde (for eksempel har SharePoint og SQL Server forskellige formater).
Valgkolonne: For at sætte en Choice-kolonne skal du bruge enum-værdien direkte. Dette eksempel sætter en kolonne for Statusvalg i en regnskabs-tabel :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Status': 'Status (Accounts)'.Active }
)
Opslagskolonne: For at sætte en opslagskolonne, giv en post med primærnøglen for den relaterede tabel. Dette eksempel sætter opslaget for Primær Kontakt på en kontopost :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)
Note
Disse kolonne-type eksempler er Dataverse-specifikke. Andre datakilder, såsom SharePoint eller SQL Server, kan kræve forskellige postformer for lignende kolonnetyper. Se dokumentationen for din specifikke datakilde for det korrekte format.
Delegering i formler, der bruger Patch
Funktionen Patch i sig selv er ikke underlagt delegering , fordi den skriver til datakilden i stedet for at forespørge den. Dog kan delegeringsadvarsler forekomme i formler, der anvendes Patch , hvis postudvælgelsesdelen af formlen (såsom Filter, LookUp eller ForAll) involverer en forespørgsel, der overstiger datakildedelegeringsgrænserne.
Når du ser en delegationsadvarsel i en formel, der inkluderer Patch, tjek om advarslen gælder for datahentningsfunktionerne og ikke for Patch sig selv. For mere information om delegering, se Forstå delegering i en canvas-app.
Almindelige fejl med Patch funktionen
Når du bruger Patch funktionen, kan der opstå fejl på grund af datakildeforbindelse, tilladelser eller datakonflikter. Brug IfError og IsError til at opdage fejl og svare passende.
"Netværksfejl ved brug af Patch funktion": Denne fejl indikerer typisk, at appen ikke kan nå datakilden. Almindelige årsager inkluderer tabt internetforbindelse, at datakilden midlertidigt er utilgængelig, eller utilstrækkelige tilladelser til den nuværende bruger. Indpak Patch kaldet i IfError for at give brugerne en meningsfuld besked.
"Der findes konflikter med ændringer på serveren": Denne fejl opstår, når en anden bruger eller proces ændrer den samme post mellem det tidspunkt, hvor din app læser posten, og skriver ændringen. Opdater datakilden ved at kalde Refresh-funktionen og prøv operationen igen.
Tilladelsesfejl: Hvis brugeren ikke har tilladelse til at oprette eller ændre poster i datakilden, fejler kaldet Patch . Brug IfError til at fange tilladelsesrelaterede fejl og guide brugeren.
For generelle fejlhåndteringsmønstre, se Fejlhåndtering.
Brug af As eller ThisRecord
Brug nøgleordet As eller ThisRecord i din formel for at undgå tvetydig evalueringskontekst.
I det følgende eksempel betragtes det første Lookup i udsagnet If .
(OrderID = A[@OrderID]) forventes at sammenligne i OrderIdLookup omfanget med OrderId samlingen A i scopet ForAll . I dette tilfælde vil du sandsynligvis gerne A[@OrderId] løse som en lokal parameter. Men det er tvetydigt.
Power Apps fortolker i øjeblikket både venstresiden OrderId og højresiden A[@OrderId] som et felt i Lookup-scopet. Derfor Lookup finder altid den første række i [dbo].[Orders1] fordi betingelsen altid er sand (det vil sige, at enhver række OrderId er lig med sig selv).
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"
}
)
)
)
Brug af As eller ThisRecord
Brug når det er muligt, operatoren As, eller nøgleordet ThisRecord for at adskille venstresiden. Som det anbefales i det foregående scenarie.
Når din formel bruger flere scopes med ForAll, Filter, og Lookup på samme datakilde eller tabel, kan scope-parametre kollidere med det samme felt et andet sted. Brug derfor operatoren As eller ThisRecord til at løse feltnavnet og undgå tvetydighed.
For eksempel kan du bruge As-operatoren til at afklare, i det følgende eksempel.
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"
}
)
)
)
Du kan også bruge ThisRecord til samme formål.
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"
}
)
)
)
For at lære mere om brugen af As-operatoren og ThisRecord, se artiklen om Operators .