Patch funkcija

Velja za: Aplikacije Canvas Copilot Studio Desktop tokovi Modelno vodene aplikacije Power Platform CLI Dataverse funkcije

Spremeni ali ustvari enega ali več zapisov v viru podatkov ali združi zapise zunaj vira podatkov.

S funkcijo Patch lahko spremenite zapise v zapletenih situacijah, na primer pri posodobitvah, ki ne zahtevajo interakcije uporabnika ali uporabljajo obrazce, ki se raztezajo čez več zaslonov.

Za lažje posodabljanje zapisov v viru podatkov za enostavne spremembe uporabite kontrolnik Edit form. Ko dodate kontrolnik Edit form, uporabnikom zagotovite obrazec, ki ga izpolnijo, in nato shranite spremembe v vir podatkov. Če želite več informacij, glejte Razumevanje podatkovnih obrazcev.

Oglejte si ta videoposnetek in se naučite uporabljati Patch funkcijo:

Overview

S funkcijo Patch spremenite enega ali več zapisov vira podatkov. Posodablja vrednosti določenih polj , ne da bi vplival na druge lastnosti. Ta formula na primer spremeni telefonsko številko za stranko z imenom Contoso:

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

Uporabite Patch s funkcijo »Privzeto«, če želite ustvariti zapise. To delovanje uporabite za razvoj enega zaslona za ustvarjanje in za urejanje zapisov. Ta formula na primer ustvari zapis za stranko z imenom Contoso:

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

Note

Ko zbirko popravite z uporabo zapisa iz podatkovnega vira z privzetimi vrednostmi, operacija popravka posodobi zbirko tako z določenimi vrednostmi popravka kot z privzetimi vrednostmi iz podatkovnega vira. DataSource stavka popravka in DataSource funkcije Defaults se morata ujemati, da se ustvari nov zapis.

Tudi če ne delate z virom podatkov, lahko spojite Patch dva ali več zapisov. Ta formula na primer združi dva zapisa v enega, ki določa tako telefonsko številko kot lokacijo za stranko Contoso:

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

Description

Spreminjanje ali ustvarjanje zapisa v viru podatkov

Če želite uporabljati to funkcijo z virom podatkov, navedite vir podatkov in nato še osnovni zapis:

  • Za spremembo zapisa mora osnovni zapis prihajati iz podatkovnega vira. Osnovni zapis lahko dobite preko lastnosti Items v galeriji, ga postavite v kontekstno spremenljivko ali pa ga pridobite po drugi poti. Vendar morate znati izslediti osnovni zapis nazaj do izvora podatkov. Ta zahteva je pomembna, ker zapis vsebuje dodatne informacije, ki vam pomagajo ponovno najti zapis za spremembe.
  • Če želite ustvariti zapis, uporabite funkcijo Defaults in ustvarite osnovni zapis s privzetimi vrednostmi.

Nato določite enega ali več zapisov sprememb, pri čemer vsak vsebuje nove vrednosti lastnosti, ki preglasijo vrednosti lastnosti v osnovnem zapisu. Spremenjeni zapisi se obdelajo v vrstnem redu od začetka seznama argumentov do konca, pri čemer novejše vrednosti preglasijo starejše.

Vrnjena vrednost je zapis Patch , ki ste ga spremenili ali ustvarili. Če ste ustvarili zapis, lahko vrnjena vrednost vključuje lastnosti, ki jih je vir podatkov ustvaril samodejno. Vendar vrnjena vrednost ne zagotavlja vrednosti za polja povezane tabele.

Uporabite na primer Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); in nato MyAccount.'Primary Contact'.'Full Name'. V tem primeru ne morete vrniti polnega imena. Namesto tega za dostop do polj povezane tabele uporabite ločeno iskanje, na primer:

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

Ko posodobite vir podatkov, lahko pride do ene ali več težav. Uporabite »IfError« in »IsErrorPatch« z vrnjeno vrednostjo, da zaznate napake in se odzovete nanje, kot je opisano v opisu »Obravnavanje napak«. Uporabite lahko tudi funkcijo Errors za prepoznavanje in preučevanje težav, kot je opisano v članku Delo z viri podatkov.

Povezane funkcije vključujejo funkcijo Update za zamenjavo celotnega zapisa in funkcijo Collect za ustvarjanje zapisa. Uporabite funkcijo UpdateIf in spremenite določene lastnosti več zapisov glede na pogoj.

Spreminjanje ali ustvarjanje nabora zapisov v viru podatkov

Uporabite lahko tudi Patch za ustvarjanje ali spreminjanje več zapisov z enim samim klicem.

Namesto da posredujete en sam osnovni zapis, v drugem argumentu zagotovite tabelo osnovnih zapisov. Zagotovite tudi zapise sprememb v tabeli, ki ustrezajo ena proti ena osnovnim zapisom. Število zapisov v vsaki tabeli sprememb mora biti enako številu zapisov v osnovni tabeli.

Ko uporabljate Patch na ta način, je vrnjena vrednost tudi tabela, kjer vsak zapis ustreza ena za enega z osnovnim in spremembnim zapisom.

Združevanje zapisov zunaj vira podatkov

Določite dva ali več zapisov, ki jih želite združiti. Funkcija obdeluje zapise v vrstnem redu od začetka seznama argumentov do konca, pri čemer kasnejše vrednosti lastnosti preglasijo prejšnje.

Patch vrne spojeni zapis in ne spremeni svojih argumentov ali zapisov v nobenih virih podatkov.

Syntax

Spreminjanje ali ustvarjanje zapisa v viru podatkov

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

  • DataSource – Zahtevano. Vir podatkov, ki vsebuje zapis, ki ga želite spremeniti, ali bo vseboval zapis, ki ga želite ustvariti.
  • BaseRecord – Zahtevano. Zapis za spreminjanje ali ustvarjanje. Če zapis prihaja iz podatkovnega vira, funkcija najde in spremeni zapis. Če se uporabi rezultat privzetih vrednosti , funkcija ustvari zapis. Če želite ustvariti nov zapis, se morata vir DataSource izjave popravka in Vir podatkov funkcije Defaults ujemati.
  • ChangeRecords – Zahtevano. Eden ali več zapisov, ki vsebujejo lastnosti, ki jih je mogoče spremeniti v argumentu BaseRecord. Funkcija spreminja zapise po vrstnem redu od začetka seznama argumentov do konca, pri čemer kasnejše vrednosti lastnosti preglasijo prejšnje.

Spreminjanje ali ustvarjanje nabora zapisov v viru podatkov

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

  • DataSource – Zahtevano. Vir podatkov, ki vsebuje zapise, ki jih želite spremeniti, ali bo vseboval zapise, ki jih želite ustvariti.
  • BaseRecordTable – Zahtevano. Tabela zapisov za spreminjanje ali ustvarjanje. Če zapis prihaja iz podatkovnega vira, funkcija najde in spremeni zapis. Če se uporabi rezultat privzetih vrednosti , funkcija ustvari zapis. Če želite ustvariti nov zapis, se morata vir DataSource izjave popravka in Vir podatkov funkcije Defaults ujemati.
  • ChangeRecordTables – Zahtevano. Ena ali več tabel zapisov, ki vsebujejo lastnosti, ki jih je mogoče spremeniti za vsak zapis argumenta BaseRecordTable. Funkcija spreminja zapise po vrstnem redu od začetka seznama argumentov do konca, pri čemer kasnejše vrednosti lastnosti preglasijo prejšnje.

Merge records

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

  • Zapisi - Obvezno. Najmanj dva zapisa, ki ju želite združiti. Funkcija obdeluje zapise po vrsti od začetka seznama argumentov do konca, pri čemer kasnejše vrednosti lastnosti preglasijo prejšnje.

Examples

Spreminjanje ali ustvarjanje zapisa (v viru podatkov)

V teh primerih spremenite ali ustvarite zapis v podatkovnem viru z imenom IceCream. Vir podatkov vsebuje podatke iz te tabele in samodejno generira vrednosti v stolpcuID:

Posnetek zaslona tabele izvora podatkov IceCream, ki prikazuje okuse in količine.

Da ustvarite različico tega podatkovnega vira v pomnilniku, da lahko preizkusite te primere, ocenite to formulo:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
PatchNe, ne
LookUp( IceCream, Flavor = "Chocolate"), { Quantity: 400 } )
Spremeni zapis v viru podatkov IceCream:
  • Stolpec ID zapisa, ki ga želite spremeniti, vsebuje vrednost 1. (Ta ID ima zapis Chocolate (Čokolada).)
  • Vrednost v stolpcu Quantity (Količina) se spremeni v 400.
{ ID: 1, Okus: "Čokolada", Količina: 400 }

Vnos Čokolada v podatkovnem viru IceCream je spremenjen.
Patch(IceCream, Defaults( IceCream ), { Okus: "Jagoda" } ) Ustvari zapis v viru podatkov IceCream:
  • Stolpec ID vsebuje vrednost 3, ki jo vir podatkov ustvari samodejno.
  • Stolpec Quantity (Količina) vsebuje vrednost 0, ki je privzeta vrednost za ta stolpec v viru podatkov IceCream, kot to določa funkcija Defaults.
  • Stolpec Flavor (Okus) vsebuje vrednost Strawberry (Jagoda).
{ ID: 3, Okus: "Jagoda", Količina: 0 }

Vnos Strawberry v podatkovnem viru IceCream je ustvarjen.

Po oceni prejšnjih formul se podatkovni vir konča z naslednjimi vrednostmi:

Posnetek zaslona vira podatkov IceCream po oceni formul.Patch

Združevanje zapisov (zunaj vira podatkov)

Formula Description Result
Patch( { Ime: "James", Rezultat: 90 }, { Ime: "Jim", Opravljeno: resnično } ) Združi dva zapisa zunaj vira podatkov:
  • Vrednosti v stolpcu Name (Ime) posameznega zapisa se ne ujemajo. Rezultat vsebuje vrednost (Jim) v zapisu, ki je bližje koncu seznama argumentov, namesto vrednosti (James) v zapisu, ki je bližje začetku.
  • Prvi zapis vsebuje stolpec (Score), ki ne obstaja v drugem zapisu. Rezultat vsebuje ta stolpec z njegovo vrednostjo (90).
  • Drugi zapis vsebuje stolpec (Passed), ki ne obstaja v prvem zapisu. Rezultat vsebuje ta stolpec z njegovo vrednostjo (true).
{ Ime: "Jim", Ocena: 90, Opravljeno: res }

Spremenite ali ustvarite nabor zapisov (v podatkovnem viru)

Ko uporabljate Patch tabele namesto posameznih zapisov, lahko ustvarite ali spremenite več zapisov v enem samem klicu. Vrnjena vrednost je tabela zapisov, ki ustreza ena-v-ena vhodnim tabelam.

Ta primer posodablja količino za več okusov v podatkovnem viru IceCream hkrati:

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

Rezultat je tabela s posodobljenimi zapisi: { ID: 1, Flavor: "Chocolate", Quantity: 300 } in { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Ta primer ustvari več novih zapisov z uporabo privzetih zapisov:

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

Note

Pri uporabi Patch s tabelami mora biti število zapisov v vsaki tabeli sprememb enako številu zapisov v osnovni tabeli. V nasprotnem primeru pride do napake.

Za odkrivanje napak, ko spreminjate več zapisov, uporabite IfError. IfError je prednostni mehanizem in deluje na gostiteljih Power Fx:

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

Patch s tipi stolpcov v Dataverse

Naslednji primeri veljajo posebej za Microsoft Dataverse podatkovne vire. Oblike zapisov se razlikujejo glede na vir podatkov (na primer SharePoint in SQL Server imata različne formate).

Izbirni stolpec: Za nastavitev stolpca Izbira uporabite neposredno vrednost enuma. Ta primer postavi stolpec izbire statusa v tabeli Računi :

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

Iskalni stolpec: Za nastavitev stolpca Lookup vnesite zapis s primarnim ključem ustrezne tabele. Ta primer postavi iskanje po primarnem stiku na zapis računov :

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

Note

Ti primeri tipa stolpca so specifični za Dataverse. Drugi podatkovni viri, kot sta SharePoint ali SQL Server, lahko zahtevajo različne oblike zapisov za podobne vrste stolpcev. Za pravilen format se oglejte v dokumentacijo za vaš specifični vir podatkov.

Delegiranje v formulah, ki uporabljajo Patch

Funkcija Patch sama ni predmet delegiranja , ker piše v vir podatkov namesto da bi ga poizvedovala. Vendar pa se lahko opozorila o delegaciji pojavijo v formulah, ki uporabljajo Patch , če del formule za izbiro zapisov (kot so Filter, LookUp ali ForAll) vključuje poizvedbo, ki presega omejitve delegacije virov podatkov.

Ko vidite opozorilo o delegaciji v formuli, ki vključuje Patch, preverite, ali opozorilo velja za funkcije za pridobivanje podatkov in ne samo Patch sebe. Za več informacij o delegiranju glejte Razumite delegiranje v aplikaciji Canvas.

Pogoste napake pri funkciji Patch

Ko uporabljate funkcijo Patch , se lahko pojavijo napake zaradi povezljivosti z virom podatkov, dovoljenj ali konfliktov podatkov. Uporabite IfError in IsError za odkrivanje napak in ustrezno odzivanje.

  • "Omrežna napaka pri uporabi Patch funkcije": Ta napaka običajno pomeni, da aplikacija ne more doseči podatkovnega vira. Pogosti vzroki vključujejo izgubo internetne povezave, začasno nedosegljiv vir podatkov ali nezadostna dovoljenja za trenutnega uporabnika. Klic zavijte Patch v IfError , da uporabnikom zagotovite smiselno sporočilo.

  • "Obstajajo konflikti s spremembami na strežniku": Ta napaka nastane, ko drug uporabnik ali proces spremeni isti zapis med tem, ko vaša aplikacija prebere zapis in zapiše spremembo. Osvežite vir podatkov z klicem funkcije Osvežitev in ponovite operacijo.

  • Napake pri dovoljenjih: Če uporabnik nima dovoljenja za ustvarjanje ali spreminjanje zapisov v podatkovnem viru, klic Patch ne uspe. Uporabite IfError za odkrivanje napak, povezanih z dovoljenji, in usmerjanje uporabnika.

Za splošne vzorce ravnanja z napakami glejte Obravnavo napak.

Uporaba možnosti Kot ali ThisRecord

Uporabite ključno besedo As ali ThisRecord v formuli, da se izognete dvoumnemu kontekstu ocenjevanja.

V naslednjem primeru si oglejmo prvo Lookup v If izjavi. (OrderID = A[@OrderID])pričakuje se, da bo primerjal v obsegu Lookup z zbiranjem AOrderId v obseguForAll.OrderId V tem primeru boste verjetno želeli A[@OrderId] rešiti kot lokalni parameter. A je dvoumno.

Power Apps trenutno interpretira tako levo stran OrderId kot desno stran A[@OrderId] kot polje v Lookup obsegu. Zato vedno najde Lookup prvo vrstico v, [dbo].[Orders1] ker je pogoj vedno resničen (to pomeni, da je vsaka vrstica OrderId enaka sama sebi).

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"
       }
   )
    )
)

Uporaba možnosti As ali ThisRecord

Kadar je mogoče, uporabite operater As ali ključno besedo ThisRecord za razjasnitev leve strani. Kot je priporočljivo za prejšnji scenarij.

Ko vaša formula uporablja več obsegov z ForAll, Filter, in Lookup na istem viru podatkov ali tabeli, se lahko parametri obsega trčijo z istim poljem drugje. Zato uporabite operator As ali ThisRecord za razrešitev imena polja in se izognite dvoumnosti.

Na primer, v naslednjem primeru lahko uporabite operator As za razjasnitev.

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"
       }
   )
    )
)

Za isti namen pa lahko uporabite tudi ThisRecord.

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"
       }
   )
    )
)

Za več informacij o uporabi operatorja As in ThisRecord si oglejte članek Operators .