Patch (funksjon)

Gjelder for: Lerretsapper Copilot Studio Desktop flyter Modelldrevne apper Power Platform CLI Dataverse-funksjoner

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

Patch Bruk funksjonen til å endre poster i komplekse situasjoner, for eksempel når du utfører oppdateringer som ikke krever brukersamhandling eller bruker skjemaer som strekker seg over flere skjermer.

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 denne videoen for å lære hvordan du bruker Patch funksjonen:

Overview

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

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

Bruk Patchstandardfunksjonen til å 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" } )

Note

Når du patcher en samling ved å bruke en post fra en datakilde med standardverdier, oppdaterer patch-operasjonen samlingen med både de angitte patch-verdiene og standardverdiene fra datakilden. DataSource for patch-setningen og DataSource for Defaults-funksjonen må samsvare for å opprette en ny post.

Selv om du ikke arbeider 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" } )

Description

Å 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:

  • For å endre en post må basisposten komme fra en datakilde. Du kan hente basisposten gjennom galleriets Items-egenskap , plassere den i en kontekstvariabel, eller hente den via en annen sti. Men du må kunne spore grunnposten tilbake til datakilden. Dette kravet er viktig fordi dokumentet inneholder ekstra informasjon som hjelper deg å finne det igjen for endring.
  • 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 du endret eller opprettet. Hvis du opprettet en post, kan returverdien inneholde egenskaper 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å ett eller flere problemer. Bruk IfError og IsError med returverdien fra Patch for å oppdage og svare på feil, som feilbehandling 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

Du kan også bruke den Patch til å opprette eller endre flere poster med én samtale.

I stedet for å sende en enkelt basepost, legg til en tabell over baserecords i det andre argumentet. Oppgi også endringsposter i en tabell, som samsvarer én-til-én med basispostene. 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 hvor hver post samsvarer én-til-én med basis- og endringspostene.

Å flette poster utenfor en datakilde

Angi to eller flere poster som du vil flette. Funksjonen behandler poster i rekkefølgen fra begynnelsen av argumentlisten til slutten, med senere egenskapsverdier som overstyrer tidligere.

Patch returnerer den flettede posten og endrer ikke argumentene eller postene i noen datakilder.

Syntax

Å 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 kom fra en datakilde, finner og endrer funksjonen posten. Hvis resultatet av Defaults brukes, oppretter funksjonen en post. Datakilden for oppdateringssetningen og datakilden for standardfunksjonen må samsvare for å kunne opprette en ny post.
  • ChangeRecords – Obligatorisk. Én eller flere poster som inneholder egenskaper som skal endres i BaseRecord. Funksjonen behandler endringsposter i rekkefølge fra starten av argumentlisten til slutten, med senere egenskapsverdier som overstyrer tidligere.

Å 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 kom fra en datakilde, finner og endrer funksjonen posten. Hvis resultatet av Defaults brukes, oppretter funksjonen en post. Datakilden for oppdateringssetningen og datakilden for standardfunksjonen må samsvare for å kunne opprette en ny post.
  • ChangeRecordTables – Obligatorisk. Én eller flere tabeller med poster som inneholder egenskaper som skal endres for hver post i BaseRecordTable. Funksjonen behandler endringsposter i rekkefølge fra starten av argumentlisten til slutten, med senere egenskapsverdier som overstyrer tidligere.

Merge records

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

  • Poster - Obligatorisk. Minst to poster som du vil flette. Funksjonen behandler poster i rekkefølge fra begynnelsen av argumentlisten til slutten, med senere egenskapsverdier som overstyrer tidligere.

Examples

Å endre eller opprette en post (i en datakilde)

I disse eksemplene endrer eller oppretter du en post i en datakilde kalt IceCream. Datakilden inneholder dataene i denne tabellen og genererer automatisk verdiene i ID-kolonnen:

Skjermbilde av eksempeltabellen for IceCream-datakilden som viser smaker og mengder.

For å lage en minneversjon av denne datakilden slik at du kan prøve disse eksemplene, evaluer denne formelen:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Iskrem,
LookUp( iskrem, smak = "sjokolade" ), { mengde: 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, Smak: "Sjokolade", Mengde: 400 }

Sjokolade-oppføringen i Iskrem-datakilden er endret.
Patch( Iskrem, Standard( Iskrem ), { Smak: "Jordbær" } ) 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, Smak: "Jordbær", Mengde: 0 }

Jordbær-oppføringen i IceCream-datakilden opprettes.

Etter at de forrige formlene er evaluert, avsluttes datakilden med disse verdiene:

Skjermbilde av IceCream-datakilden etter Patch at formlene er evaluert.

Å flette poster (utenfor en datakilde)

Formula Description Result
Patch( { Navn: "James", Poengsum: 90 }, { Navn: "Jim", Bestått: sant } ) 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).
{ Navn: "Jim", Poengsum: 90, Bestått: sant }

Endre eller opprett et sett med poster (i en datakilde)

Når du bruker Patch tabeller i stedet for enkeltposter, kan du opprette eller endre flere poster i ett enkelt kall. Returverdien er en tabell over poster som tilsvarer én-til-én med inndatatabellene.

Dette eksempelet oppdaterer mengden for flere smaker i Iskrem-datakilden samtidig:

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

Resultatet er en tabell med de oppdaterte postene: { ID: 1, Flavor: "Chocolate", Quantity: 300 } og { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Dette eksempelet oppretter flere nye poster ved bruk av Defaults:

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

Note

Når du bruker Patch tabeller, må antall poster i hver endringstabell samsvare med antall poster i grunntabellen. Ellers oppstår det en feil.

For å oppdage feil når du endrer flere poster, bruk IfError. IfError er den foretrukne mekanismen og fungerer på tvers av Power Fx-verter:

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

Patch med Dataverse-kolonnetyper

Følgende eksempler gjelder spesielt for Microsoft Dataverse datakilder. Postformer varierer etter datakilde (for eksempel har SharePoint og SQL Server forskjellige formater).

Valgkolonne: For å sette en Choice-kolonne, bruk enum-verdien direkte. Dette eksempelet setter en kolonne for Statusvalg i en regnskapstabell :

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

Oppslagskolonne: For å sette en oppslagskolonne, oppgi en post med primærnøkkelen til den relaterte tabellen. Dette eksempelet setter oppslaget for primærkontakt på en kontopost :

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

Note

Disse kolonnetypeeksemplene er Dataverse-spesifikke. Andre datakilder, som SharePoint eller SQL Server, kan kreve forskjellige postformer for lignende kolonnetyper. Se dokumentasjonen for din spesifikke datakilde for riktig format.

Delegasjon i formler som bruker Patch

Funksjonen Patch i seg selv er ikke underlagt delegasjon fordi den skriver til datakilden i stedet for å spørre den. Delegasjonsadvarsler kan imidlertid dukke opp i formler som brukes Patch hvis postvalgsdelen av formelen (som Filter, LookUp eller ForAll) involverer en spørring som overstiger datakildedelegeringsgrensene.

Når du ser en delegasjonsadvarsel i en formel som inkluderer Patch, sjekk om advarselen gjelder for datahentingsfunksjonene og ikke for Patch seg selv. For mer informasjon om delegering, se Forstå delegering i en canvas-app.

Vanlige feil med Patch funksjonen

Når du bruker funksjonen Patch , kan feil oppstå på grunn av tilkobling til datakilden, tillatelser eller datakonflikter. Bruk IfError og IsError for å oppdage feil og svare riktig.

  • "Nettverksfeil ved bruk Patch av funksjon": Denne feilen indikerer vanligvis at appen ikke kan nå datakilden. Vanlige årsaker inkluderer tapt internettforbindelse, at datakilden midlertidig er utilgjengelig, eller utilstrekkelige tillatelser for den nåværende brukeren. Pakk inn kallet Patch i IfError for å gi brukerne en meningsfull melding.

  • "Det finnes konflikter med endringer på serveren": Denne feilen oppstår når en annen bruker eller prosess endrer samme post mellom tidspunktet appen din leser posten og skriver endringen. Oppdater datakilden ved å kalle Refresh-funksjonen og prøv operasjonen på nytt.

  • Tillatelsesfeil: Hvis brukeren ikke har tillatelse til å opprette eller endre poster i datakilden, mislykkes kallet Patch . Bruk IfError for å fange opp tillatelsesrelaterte feil og veilede brukeren.

For generelle feilhåndteringsmønstre, se Feilhåndtering.

Bruke Som eller ThisRecord

Bruk As- eller ThisRecord-nøkkelordet i formelen din for å unngå tvetydig evalueringskontekst.

I det følgende eksempelet, vurder det første Lookup i påstanden If . (OrderID = A[@OrderID]) forventes å sammenligne innsamlingen OrderId i omfanget Lookup med OrderId innsamlingen A i omfanget ForAll . I dette tilfellet vil A[@OrderId] du sannsynligvis løse som en lokal parameter. Men det er tvetydig.

Power Apps tolker for øyeblikket både venstresiden OrderId og høyresiden A[@OrderId] som et felt i Lookup-omfanget. Derfor Lookup finner alltid den første raden i [dbo].[Orders1] fordi betingelsen alltid er sann (det vil si at enhver rad 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

Bruk når mulig, operatoren As eller ThisRecord-nøkkelordet for å skille venstresiden. Som anbefalt for det foregående scenariet.

Når formelen din bruker flere omfang med ForAll, Filter, og Lookup på samme datakilde eller tabell, kan omfangsparametere kollidere med samme felt et annet sted. Bruk derfor operatoren As eller ThisRecord for å løse feltnavnet og unngå tvetydighet.

For eksempel kan du bruke operatoren As for å avklare i 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å 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"
       }
   )
    )
)

For å lære mer om bruken av As-operatoren og ThisRecord, se artikkelen Operators .