Share via


Patch-funksjonen

Gjelder: Lerretsapper Modelldrevne apper Power Platform CLI Skrivebordsflyter

Endrer eller oppretter én eller flere poster i en datakilde, eller fletter poster utenfor en datakilde.

Bruk Patch-funksjonen til å endre poster i komplekse situasjoner, for eksempel når du gjør oppdateringer som ikke krever noen brukermedvirkning eller bruker skjemaer som strekker seg over flere skjermbilder.

Hvis du vil oppdatere oppføringer i en datakilde enklere for enkle endringer, kan du bruke Edit form-kontrollen i stedet. Når du legger til en Edit form-kontroll, gir du brukerne et skjema som skal fylles ut og lagrer deretter endringene i en datakilde. Hvis du vil ha mer informasjon, kan du se Forstå dataskjemaer.

Se på denne videoen for å lære hvordan du bruker Patch-funksjonen:

Oversikt

Bruk Patch-funksjonen til å endre én eller flere poster i en datakilde. Verdiene for spesifikke felt blir endret uten å påvirke andre egenskaper. Denne formelen endrer for eksempel telefonnummeret for en kunde kalt Contoso:

Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )

Bruk Patch med Defaults-funksjonen for å opprette poster. Bruk denne virkemåten til å bygge ett enkelt skjermbilde for både oppretting og redigering av poster. Denne formelen oppretter for eksempel en post for en kunde kalt Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Selv om du ikke jobber med en datakilde, kan du bruke Patch til å slå sammen to eller flere poster. Denne formelen fletter for eksempel to poster til én, som identifiserer både telefonnummeret og plasseringen for Contoso:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

Beskrivelse

Å endre eller opprette en post i en datakilde

Hvis du vil bruke denne funksjonen med en datakilde, kan du angi datakilden og deretter angi en grunnleggende post:

  • Hvis du vil endre en post, må den grunnleggende posten ha kommet fra en datakilde. Den grunnleggende posten kan ha blitt levert gjennom Items-egenskapen i et galleri, blitt plassert i en kontekstvariabel eller gått gjennom en annen bane. Men du kan spore den grunnleggende posten tilbake til datakilden. Dette er viktig, da posten inneholder tilleggsinformasjon for å hjelpe deg med å finne posten på nytt for redigering.
  • Hvis du vil opprette en post, kan du bruke Defaults-funksjonen til å opprette en grunnleggende post med standardverdier.

Deretter kan du angi én eller flere endringsposter, der hver av dem inneholder nye egenskapsverdier som overstyrer egenskapsverdiene i den grunnleggende posten. Endringsposter behandles i rekkefølgen fra begynnelsen av argumentlisten til slutten, der nyere egenskapsverdier overstyrer tidligere verdier.

Returverdien for Patch er posten som du har endret eller opprettet. Hvis du har opprettet en post, kan returverdien inneholde egenskapene som datakilden genererte automatisk. Returverdien gir imidlertid ikke en verdi for felter i en relatert tabell.

Du kan for eksempel bruke Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); og deretter MyAccount.'Primary Contact'.'Full Name'. Du kan ikke gi fullt navn i dette tilfellet. Hvis du i stedet vil ha tilgang til feltene i en relatert tabell, bruker du et eget oppslag, for eksempel følgende:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

Når du oppdaterer en datakilde, kan det oppstå et eller flere problemer. Bruk IfError og IsError med returverdien fra Patch til å registrere og svare på feil som Feilhåndtering beskriver. Du kan også bruke Errors-funksjonen til å identifisere og undersøke problemer, som beskrives i Å arbeide med store datakilder.

Relaterte funksjoner, inkludert Update-funksjonen for å erstatte en hel post, og Collect-funksjonen for å opprette en post. Bruk UpdateIf-funksjonen til å endre bestemte egenskaper for flere poster basert på en betingelse.

Å endre eller opprette et sett med poster i en datakilde

Patch kan også brukes til å opprette eller endre flere poster med ett enkelt oppkall.

I stedet for å sende én grunnleggende post kan en tabell med grunnleggende poster angis i det andre argumentet. Endringsposter er også inkludert i en tabell, tilsvarende én-til-én med de grunnleggende postene. Antallet poster i hver endringstabell må være den samme som antallet poster i den grunnleggende tabellen.

Når du bruker Patch på denne måten, er returverdien også en tabell med hver post tilsvarende én-til-én for de grunnleggende postene og endringspostene.

Å flette poster utenfor en datakilde

Angi to eller flere poster som du vil flette. Poster behandles i rekkefølgen fra begynnelsen av argumentlisten til slutten, der nyere egenskapsverdier overstyrer tidligere verdier.

Patch returnerer den flettede posten og endrer ikke tilhørende argumenter eller poster i noen datakilder.

Syntaks

Å endre eller opprette en post i en datakilde

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, … ])

  • DataSource – obligatorisk. Datakilden som inneholder posten du vil endre, eller som skal inneholde posten du vil opprette.
  • BaseRecord – obligatorisk. Posten som skal endres eller opprettes. Hvis posten ble levert fra en datakilde, blir posten funnet og endret. Hvis resultatet av Defaults brukes, blir det opprettet en post.
  • ChangeRecord(s) – obligatorisk. Én eller flere poster som inneholder egenskaper som skal endres i BaseRecord. Endringsposter behandles i rekkefølgen fra begynnelsen av argumentlisten til slutten, der nyere egenskapsverdier overstyrer tidligere verdier.

Å endre eller opprette et sett med poster i en datakilde

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )

  • DataSource – obligatorisk. Datakilden som inneholder postene du vil endre, eller som skal inneholde postene du vil opprette.
  • BaseRecordTable – obligatorisk. En tabell med poster som skal endres eller opprettes. Hvis posten ble levert fra en datakilde, blir posten funnet og endret. Hvis resultatet av Defaults brukes, blir det opprettet en post.
  • ChangeRecordTable(s) – obligatorisk. Én eller flere tabeller med poster som inneholder egenskaper som skal endres for hver post i BaseRecordTable. Endringsposter behandles i rekkefølgen fra begynnelsen av argumentlisten til slutten, der nyere egenskapsverdier overstyrer tidligere verdier.

Slå sammen oppføringer

Patch( Record1, Record2 [, …] )

  • Record(s) - obligatorisk. Minst to poster som du vil flette. Poster behandles i rekkefølgen fra begynnelsen av argumentlisten til slutten, der nyere egenskapsverdier overstyrer tidligere verdier.

Eksempler

Å endre eller opprette en post (i en datakilde)

I disse eksemplene skal du endre eller opprette en post i en datakilde med navnet IceCream som inneholder dataene i denne tabellen og genererer verdiene automatisk i IDkolonnen:

Eksempeliskrem.

Formel Bekrivelse Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Endrer en post i IceCream-datakilden:
  • ID-kolonnen for posten som skal endres, inneholder verdien 1. (Chocolate-posten har denne ID-en.)
  • Verdien i Quantity-kolonnen endres til 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Chocolate-posten i datakilden IceCream har blitt endret.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Oppretter en post i IceCream-datakilden:
  • ID-kolonnen inneholder verdien 3, som datakilden genererer automatisk.
  • Quantity-kolonnen inneholder 0, som er standardverdien for kolonnen i datakilden IceCream, som Defaults-funksjonen angir.
  • Flavor-kolonnen inneholder verdien for Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Strawberry-posten i datakilden IceCream har blitt opprettet.

Når de forrige formlene har blitt vurdert, avsluttes datakilden med disse verdiene:

Eksempeliskrem etter.

Å flette poster (utenfor en datakilde)

Formel Beskrivelse Resultat
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Fletter to poster utenfor en datakilde:
  • Verdiene i Navn-kolonnen for hver post samsvarer ikke. Resultatet inneholder verdien (Jim) i posten som er nærmere slutten av argumentlisten, i stedet for verdien (James) i posten som er nærmere begynnelsen.
  • Den første posten inneholder en kolonne (Score) som ikke finnes i den andre posten. Resultatet inneholder kolonnen med den tilhørende verdien (90).
  • Den andre posten inneholder en kolonne (Passed) som ikke finnes i den første posten. Resultatet inneholder kolonnen med den tilhørende verdien (true).
{ Name: "Jim", Score: 90, Passed: true }

Bruke Som eller ThisRecord

Bruk av Som- eller ThisRecord-nøkkelordet i formelen unngår tvetydig evalueringskontekst.

I eksemplet nedenfor tar du hensyn til det første oppslaget i If-setningen. (OrderID = A[@OrderID]) forventes å sammenligne OrderId i oppslagsområdet med OrderId i samlingen A i ForAll-området. I dette tilfellet vil du sannsynligvis at A[@OrderId] blir løst som en lokal parameter. Men det er tvetydig.

Power Apps tolker både venstre OrderId og høyre A[@OrderId] som et felt i oppslagsområdet. Derfor vil oppslag alltid finne den første raden i [dbo].[Orders1] fordi betingelsen alltid er sann (det vil si at en rads OrderId er lik seg 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"
       }
   )
    )
)

Bruke Som eller ThisRecord

Når det er mulig, kan du bruke Som-operatoren eller ThisRecord til å skille venstre side. As anbefales for scenarioet ovenfor.

Når formelen bruker flere områder med ForAll, Filter og Lookup på samme datakilde eller tabell, kan det hende at områdeparameterne kan kollidere med et annet felt andre steder. Derfor anbefales det at du bruker Som-operatoren eller ThisRecord til å løse feltnavnet og unngå tvetydighet.

Du kan for eksempel bruke Som-operatoren til å skille 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å bruke 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"
       }
   )
    )
)

Hvis du vil vite mer om bruk av Som-operatoren og ThisRecord, kan du se Operatorer-artikkelen.