Funktionen Patch
Gælder for: Lærredapps Modelbaserede apps Power Platform CLI Skrivebordsflow
Redigerer eller opretter en eller flere poster i en datakilde eller fletter poster uden for en datakilde.
Du kan bruge funktionen Patch til at ændre poster i komplekse situationer, f.eks. når du udfører opdateringer, hvor der ikke kræves brugerinteraktion, eller hvis der bruges formularer, der fylder 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:
Oversigt
Brug funktionen Patch til at ændre en eller flere poster i en datakilde. Værdierne for specifikke felter ændres uden at påvirke andre egenskaber. Denne formel ændrer f.eks. telefonnummeret til en kunde, der hedder Contoso:
Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )
Brug Patch sammen med funktionen Defaults for 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" } )
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" } )
Beskrivelse
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:
- Hvis du vil redigere en post, skal basisposten komme fra en datakilde. Basisposten kan komme via et galleris Items-egenskab, den kan være placeret i en kontekstafhængig variabel, eller den kan komme et andet sted fra. Imidlertid kan du til enhver tid spore basisposten tilbage til datakilden. Dette er vigtigt, da posten vil indeholde ekstra oplysninger, der kan hjælpe med at finde posten igen, hvis den skal ændres.
- 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 har genereret 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 sammen med returværdien fra Patch til at registrere og reagere på fejl, sådan som det er beskrevet under 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
Patch kan også bruges til at oprette eller ændre flere poster med et enkelt kald.
I stedet for at overføre en enkelt basispost kan du angive en tabel med basisposter i det andet argument. Ændringsposterne leveres også i en tabel, som stemmer overens med basisposterne 1-til-1. 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 direkte til basis- og ændringsposterne.
Flet poster uden for en datakilde
Angiv to eller flere poster, du vil flette. Poster behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.
Patch returnerer den flettede post og ændrer ikke dens argumenter eller poster i nogen datakilder.
Syntaks
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, bliver posten fundet og ændret. Hvis resultatet af Defaults bruges, oprettes der en post.
- ChangeRecords – Påkrævet. En eller flere poster, der indeholder egenskaber, som skal ændres i Basispost. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.
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, bliver posten fundet og ændret. Hvis resultatet af Defaults bruges, oprettes der en post.
- ChangeRecordTables – Påkrævet. En eller flere tabeller med poster, som indeholder de egenskaber, der skal ændres for hver post i BaseRecordTable. Ændringsposter behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.
Flette poster
Patch( Record1,Record2 [, ...] )
- Poster - Påkrævet. Mindst to poster, du vil flette. Poster behandles i rækkefølge fra start til slut på argumentlisten, hvor egenskabsværdier sidst på listen tilsidesætter tidligere egenskabsværdier.
Eksempler
Rediger eller opret en post (i en datakilde)
I disse eksempler skal du ændre eller oprette en post i en datakilde med navnet IceCream, der indeholder dataene i denne tabel og automatisk genererer værdierne i ID-kolonnen:
Formula | Description | Result |
---|---|---|
Plaster( IceCream, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
Ændrer en post i datakilden IceCream:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } Posten Chocolate i datakilden IceCream er blevet ændret. |
Patch (IceCream, Defaults (IceCream), { Flavor: "Strawberry" } ) | Ændrer en post i datakilden IceCream:
|
{ ID: 3, Flavor: "Strawberry", Quantity: 0 } Posten Strawberry i datakilden IceCream er blevet oprettet. |
Når de tidligere formularer er blevet evalueret, har datakilden disse værdier:
Flet poster (uden for en datakilde)
Formel | Beskrivelse | Resultat |
---|---|---|
Patch( { Navn: "James", Score: 90 }, { Navn: "Jim", Bestået: sand } ) | Fletter to poster uden for en datakilde:
|
{ Name: "Jim", Score: 90, Passed: true } |
Brug af As eller ThisRecord
Hvis du bruger nøgleordet As eller ThisRecord i formlen, undgår du en tvetydig evalueringskontekster.
I eksemplet nedenfor skal du overveje det første opslag i If
-sætningen. (OrderID = A[@OrderID])
forventes at sammenligne OrderId
i opslagsområdet med OrderId
samlingen A
i omfanget ForAll
. I dette tilfælde ønsker du sandsynligvis, at A[@OrderId]
fortolkes som en lokal parameter. Men det er tvetydigt.
Power Apps fortolker i øjeblikket både OrderId
på venstre side og A[@OrderId]
på højre side som et felt i opslagsområdet. Opslaget finder derfor altid den første række i [dbo].[Orders1]
, fordi betingelsen altid er sand (dvs. at OrderId
for en hvilken som helst række 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
Når det er muligt, skal du bruge operatoren As eller funktionen ThisRecord for at kunne skelne venstre side. Som det anbefales til ovenstående scenarie.
Når formlen bruger flere områder med ForAll
, Filter
og Lookup
i samme datakilde eller tabel, er det muligt, at områdeparametrene kolliderer med det samme felt et andet sted. Det anbefales derfor at bruge operatoren As eller ThisRecord til at fortolke feltnavnet og undgå flertydighed.
Du kan f.eks. bruge operatoren As til skelne i eksemplet nedenfor.
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"
}
)
)
)
Du kan få mere at vide om brugen af operatoren As og ThisRecord i artiklen Operatorer.