funktionen Patch

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:

Skærmbillede af eksempeltabellen for IceCream-datakilden, der viser smagsvarianter og mængder.

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:
  • Kolonnen ID for den post, der skal ændres, indeholder værdien 1. (Posten Chocolate har det id.)
  • Værdien i kolonnen Quantity ændres til 400.
{ 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:
  • Kolonnen ID indeholder værdien 3, som datakilden genererer automatisk.
  • Kolonnen Quantity indeholder 0, som er standardværdien for kolonnen i datakilden IceCream som specificeret med funktionen Defaults.
  • Kolonnen Flavor indeholder værdien Strawberry.
{ 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:

Skærmbillede af IceCream-datakilden efter Patch formlerne er blevet evalueret.

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:
  • Værdierne i kolonnen Name matcher ikke for hver post. Resultatet indeholder værdien (Jim) i den post, der er tættere på slutningen af argumentlisten i stedet for værdien (James) i den post, der er tættere på starten.
  • Den første post indeholder kolonnen (Score), som ikke findes i den anden post. Resultatet indeholder den kolonne med dens værdi (90).
  • Den anden post indeholder en kolonne (Passed), som ikke findes i den første post. Resultatet indeholder den kolonne med den værdi (sand).
{ 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 .