Patch funkcija

Odnosi se na: Canvas apps Copilot Studio Desktop flows Model-driven apps Power Platform CLI Dataverse functions

Izmjenjuje ili stvara jedan ili više zapisa u izvoru podataka ili spaja zapise izvan nekog izvora podataka.

Funkciju koristite za Patch izmjenu zapisa u složenim situacijama, primjerice kada izvršavate ažuriranja za koja nije potrebna interakcija s korisnikom ni korištenje obrazaca koji se protežu na više zaslona.

Da biste lakše ažurirali zapise u nekom izvoru podataka u slučaju jednostavnih promjena, umjesto toga upotrijebite kontrolu Edit form. Kada dodate kontrolu Edit form, korisnicima pružate obrazac za ispunjavanje i zatim spremanje tih promjena u izvor podataka. Dodatne informacije potražite u odjeljku Razumijevanje obrazaca podataka.

Pogledajte ovaj videozapis da biste saznali kako koristiti Patch funkciju:

Overview

Pomoću funkcije Patch izmijenite jedan ili više zapisa izvora podataka. Ažurira vrijednosti određenih polja bez utjecaja na druga svojstva. Na primjer, ova formula mijenja telefonski broj klijenta po imenu Contoso:

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

Koristi Patch se s funkcijom Defaults za stvaranje zapisa. Koristite ovo ponašanje za izradu jednog zaslona i za stvaranje i za uređivanje zapisa. Na primjer, ova formula stvara zapis klijenta po imenu Contoso:

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

Note

Kada patchate kolekciju koristeći zapis iz izvora podataka s zadanim vrijednostima, operacija patcha ažurira kolekciju i s zadanim vrijednostima patcha i zadanim vrijednostima iz izvora podataka. DataSource naredbe patch i DataSource funkcije Defaults moraju se podudarati kako bi se stvorio novi zapis.

Čak i ako ne radite s izvorom podataka, možete koristiti za Patch spajanje dva ili više zapisa. Na primjer, ova formula spaja dva zapisa u jedan koji određuje i telefonski broj i lokaciju za Contoso:

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

Description

Izmjena ili stvaranje zapisa u izvoru podataka

Da biste ovu funkciju koristili s nekim izvorom podataka, navedite taj izvor podataka, a zatim odredite osnovni zapis:

  • Za izmjenu zapisa, osnovni zapis mora dolaziti iz izvora podataka. Osnovni zapis možete dobiti kroz svojstvo Items u galeriji, smjestiti ga u kontekstualnu varijablu ili ga dobiti nekim drugim putem. Ali, morate moći pratiti osnovni zapis do izvora podataka. Ovaj zahtjev je važan jer zapis sadrži dodatne informacije koje vam pomažu da ga ponovno pronađete radi izmjene.
  • Da biste stvorili neki zapis, upotrijebite funkciju Defaults kako biste stvotili osnovni zapis sa zadanim vrijednostima.

Zatim odredite jedan ili više zapisa promjena, od kojih svaki sadrži nove vrijednosti svojstava koje nadjačavaju vrijednosti svojstava u osnovnom zapisu. Zapisi promjena obrađuju se redoslijedom od početka do kraja popisa argumenata, pri čemu kasnije vrijednosti svojstava nadjačavaju ranije.

Povratna vrijednost je Patch zapisa koji ste izmijenili ili stvorili. Ako ste stvorili zapis, povratna vrijednost može sadržavati svojstva koja je izvor podataka generirao automatski. Međutim, povratna vrijednost ne daje vrijednost za polja povezane tablice.

Na primjer, koristite Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); i onda MyAccount.'Primary Contact'.'Full Name'. U ovom slučaju ne možete dati puno ime. Umjesto toga, za pristup poljima povezane tablice koristite zasebno pretraživanje, kao što je:

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

Kada ažurirate izvor podataka, može doći do jednog ili više problema. Koristite Funkcije IfError i IsErrorPatch s povratnom vrijednošću za otkrivanje pogrešaka i odgovaranje na pogreške, kao što opisuje rukovanje pogreškama . Možete koristiti i funkciju Errors kako biste utvrdili i ispitali probleme kako je opisano u odjeljku Rad s izvorima podataka.

U povezane funkcije spadaju funkcija Update za zamjenu cijelog zapisa i funkcija Collect za stvaranje zapisa. Upotrijebite funkciju UpdateIf kako biste promjenili specifična svojstva više zapisa na temelju nekog uvjeta.

Izmjena ili stvaranje skupa zapisa u izvoru podataka

Također možete koristiti Patch za stvaranje ili izmjenu više zapisa jednim pozivom.

Umjesto prosljeđivanja jednog osnovnog zapisa, u drugom argumentu navedite tablicu osnovnih zapisa. Također osigurajte zapise o promjenama u tablici, odgovarajući jedan prema jedan s osnovnim zapisima. Broj zapisa u svakoj tablici promjena mora biti isti kao broj zapisa u osnovnoj tablici.

Kada koristite Patch na ovaj način, povratna vrijednost je također tablica u kojoj svaki zapis odgovara jedan prema jedan s osnovnim i change-zapisima.

Spajanje zapisa izvan izvora podataka

Navedite dva ili više zapisa koje želite spojiti. Funkcija obrađuje zapise redoslijedom od početka popisa argumenata do kraja, pri čemu kasnije vrijednosti svojstava nadjačavaju ranije.

Patch vraća spojeni zapis i ne mijenja svoje argumente ili zapise ni u jednom izvoru podataka.

Syntax

Izmjena ili stvaranje zapisa u izvoru podataka

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

  • Izvor podataka– obavezno. Izvor podataka koji sadrži zapis koji želite izmijeniti ili će sadržavati zapis koji želite stvoriti.
  • BaseRecord – Obavezno. Zapis koji se mijenja ili stvara. Ako zapis dolazi iz izvora podataka, funkcija pronalazi i mijenja zapis. Ako se koristi rezultat Defaults , funkcija stvara zapis. DataSource naredbe zakrpe i DataSource funkcije Defaults moraju se podudarati da bi se stvorio novi zapis.
  • ChangeRecords – obavezno. Jedan ili više zapisa koji sadrže svojstva koja se mogu mijenjati u BaseRecord. Funkcija obrađuje promjene zapisa redoslijedom od početka do kraja popisa argumenata, pri čemu kasnije vrijednosti svojstava nadjačavaju prethodne.

Izmjena ili stvaranje skupa zapisa u izvoru podataka

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

  • Izvor podataka– obavezno. Izvor podataka koji sadrži zapise koje želite izmijeniti ili će sadržavati zapise koje želite stvoriti.
  • BaseRecordTable – obavezno. Tablica zapisa za izmjenu ili stvaranje. Ako zapis dolazi iz izvora podataka, funkcija pronalazi i mijenja zapis. Ako se koristi rezultat Defaults , funkcija stvara zapis. DataSource naredbe zakrpe i DataSource funkcije Defaults moraju se podudarati da bi se stvorio novi zapis.
  • ChangeRecordTables – obavezno. Jedna ili više tablica zapisa koje sadrže svojstva za izmjenu za svaki zapis u BaseRecordTable. Funkcija obrađuje promjene zapisa redoslijedom od početka do kraja popisa argumenata, pri čemu kasnije vrijednosti svojstava nadjačavaju prethodne.

Merge records

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

  • Zapisi - Obavezno. Najmanje dva zapisa koje želite spojiti. Funkcija obrađuje zapise redom od početka do kraja popisa argumenata, pri čemu kasnije vrijednosti svojstava nadjačavaju prethodne.

Examples

Izmjena ili stvaranje zapisa (u izvoru podataka)

U tim primjerima mijenjate ili stvarate zapis u izvoru podataka nazvanom IceCream. Izvor podataka sadrži podatke iz ove tablice i automatski generira vrijednosti u stupcuID:

Snimka zaslona tablice primjera izvora podataka IceCream koja prikazuje okuse i količine.

Da biste stvorili verziju ovog izvora podataka u memoriji i isprobali ove primjere, izračunajte ovu formulu:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch(IceCream,
LookUp( IceCream, Flavor = "Čokolada"), { Količina: 400 } )
Mijenja jedan zapis u izvoru podataka IceCream:
  • Stupac ID zapisa koji se mijenja sadrži vrijednost 1. (Zapis Chocolate ima taj ID.)
  • Vrijednost u stupcu Quantity mijenja se u 400.
{ ID: 1, Okus: "Čokolada", Količina: 400 }

Unos Čokolada u izvoru podataka IceCream je izmijenjen.
Patch( IceCream, Defaults( IceCream ), { Okus: "Jagoda" } ) Stvara jedan zapis u izvoru podataka IceCream:
  • Stupac ID sadrži vrijednost 3 koju izvor podataka automatski generira.
  • Stupac Quantity sadrži 0, što je zadana vrijednost za ovaj stupac u izvoru podataka IceCream, kako je određeno funkcijom Defaults.
  • Stupac Flavor sadrži vrijednost Strawberry.
{ ID: 3, Okus: "Jagode", Količina: 0 }

Unos Strawberry u IceCream izvoru podataka je kreiran.

Nakon evaluacije prethodnih formula, izvor podataka završava s ovim vrijednostima:

Snimka zaslona izvora podataka o IceCreamu nakon Patch evaluacije formula.

Spajanje zapisa (izvan izvora podataka)

Formula Description Result
Patch( { Name: "James", Rezultat: 90 }, { Name: "Jim", Prošlo: true } ) Spaja dva zapisa izvan izvora podataka:
  • Vrijednosti u stupcu Name svakog zapisa ne podudaraju se. Rezultat sadrži vrijednost (Jim) u zapisu koji se bliži kraju popisa argumenata umjesto vrijednosti (James) u zapisu koji je bliži početku.
  • Prvi zapis sadrži stupac (Score) koji ne postoji u drugom zapisu. Rezultat sadrži taj stupac s njegovom vrijednošću (90).
  • Drugi zapis sadrži stupac (Passed) koji ne postoji u prvom zapisu. Rezultat sadrži taj stupac s njegovom vrijednošću (true).
{ Name: "Jim", Rezultat: 90, Prošlo: true }

Izmijeniti ili stvoriti skup zapisa (u izvoru podataka)

Kada koristite Patch tablice umjesto pojedinačnih zapisa, možete kreirati ili mijenjati više zapisa u jednom pozivu. Povratna vrijednost je tablica zapisa koja odgovara jedan prema jedan s ulaznim tablicama.

Ovaj primjer ažurira količinu za više okusa u izvoru podataka o sladoledu istovremeno:

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

Rezultat je tablica s ažuriranim zapisima: { ID: 1, Flavor: "Chocolate", Quantity: 300 } i { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Ovaj primjer stvara više novih zapisa koristeći Zadane vrijednosti:

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

Note

Kada koristite Patch s tablicama, broj zapisa u svakoj tablici promjena mora odgovarati broju zapisa u osnovnoj tablici. U suprotnom, dolazi do pogreške.

Za otkrivanje pogrešaka kada mijenjate više zapisa, koristite IfError. IfError je preferirani mehanizam i radi na Power Fx hostovima:

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

Patch s Dataverse tipovima stupaca

Sljedeći primjeri odnose se posebno na Microsoft Dataverse izvore podataka. Oblici zapisa razlikuju se ovisno o izvoru podataka (na primjer, SharePoint i SQL Server imaju različite formate).

Stupac izbora: Za postavljanje stupca Choice koristite izravno vrijednost enuma. Ovaj primjer postavlja stupac izbora Status na tablici Računa:

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

Stupac za pretraživanje: Za postavljanje stupca Lookup, pružite zapis s primarnim ključem povezane tablice. Ovaj primjer postavlja pretragu Primarnog kontakta na zapis računa:

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

Note

Ovi primjeri tipa stupaca specifični su za Dataverse. Drugi izvori podataka, poput SharePoint-a ili SQL Server-a, mogu zahtijevati različite oblike zapisa za slične vrste stupaca. Za ispravan format pogledajte dokumentaciju za vaš specifični izvor podataka.

Delegiranje u formulama koje koriste Patch

Sama Patch funkcija nije podložna delegiranju jer piše u izvor podataka umjesto da ga upita. Međutim, upozorenja na delegiranje mogu se pojaviti u formulama koje koriste Patch ako dio formule za odabir zapisa (kao što su Filter, LookUp ili ForAll) uključuje upit koji prelazi granice delegiranja izvora podataka.

Kada vidite upozorenje o delegiranju u formuli koja uključuje Patch, provjerite odnosi li se upozorenje na funkcije dohvaćanja podataka, a Patch ne samo na sebe. Za više informacija o delegiranju, pogledajte Razumijevanje delegiranja u canvas aplikaciji.

Uobičajene pogreške s funkcijom Patch

Kada koristite tu funkciju Patch , mogu nastati pogreške zbog povezanosti izvora podataka, dozvola ili sukoba podataka. Koristite IfError i IsError za otkrivanje pogrešaka i odgovarajući odgovor.

  • "Mrežna pogreška pri korištenju Patch funkcije": Ova greška obično znači da aplikacija ne može pristupiti izvoru podataka. Uobičajeni uzroci uključuju gubitak internetske veze, privremenu nedostupnost izvora podataka ili nedovoljne dozvole za trenutnog korisnika. Obavite Patch poziv u IfError kako biste korisnicima pružili smislenu poruku.

  • "Postoje sukobi s promjenama na poslužitelju": Ova greška nastaje kada drugi korisnik ili proces izmijeni isti zapis između trenutka kada vaša aplikacija pročita zapis i upiše promjenu. Osvježite izvor podataka pozivanjem funkcije Refresh i pokušajte ponovno izvršiti operaciju.

  • Pogreške u dozvolama: Ako korisnik nema dopuštenje za stvaranje ili izmjenu zapisa u izvoru podataka, Patch poziv ne uspijeva. Koristite IfError za otkrivanje pogrešaka vezanih uz dozvole i usmjeravanje korisnika.

Za opće obrasce rukovanja pogreškama, vidi Rukovanje pogreškama.

Upotreba ključnih riječi As ili ThisRecord

Koristite ključne riječi As ili ThisRecord u formuli kako biste izbjegli dvosmislene kontekste evaluacije.

U sljedećem primjeru, razmotrimo prvo Lookup u tvrdnji If . (OrderID = A[@OrderID])očekuje se da uspoređuje u opsegu Lookup s kolekcijom AOrderId u opseguForAll.OrderId U tom slučaju, vjerojatno želite A[@OrderId] riješiti kao lokalni parametar. Ali to je dvosmisleno.

Power Apps trenutno tumači i lijevu stranu OrderId i desnu stranu A[@OrderId] kao polje u Lookup opsegu. Stoga uvijek Lookup pronalazi prvi redak u jer [dbo].[Orders1] je uvjet uvijek istinit (odnosno, svaki OrderId redak je jednak samom 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"
       }
   )
    )
)

Upotreba ključnih riječi As ili ThisRecord

Kad god je moguće, koristite As operator ili ključnu riječ ThisRecord za razjašnjenje lijeve strane. Kao što je preporučeno za prethodni scenarij.

Kada vaša formula koristi više opsega s ForAll, Filter, i na istom izvoru Lookup podataka ili tablici, parametri opsega mogu se sudariti s istim poljem negdje drugdje. Stoga koristite As operator ili ThisRecord za rješavanje imena polja i izbjegavanje dvosmislenosti.

Na primjer, možete koristiti As operator za razjašnjenje u sljedećem primjeru.

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

Možete i koristiti ThisRecord u istu svrhu.

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 više informacija o korištenju As operatora i ThisRecorda, pogledajte članak o operatorima .