Patch funkcija

Attiecas uz: Audekla programmas Copilot Studio Desktop plūsmas Modeļa vadītas programmas Power Platform CLI Dataverse funkcijas

Modificē vai izveido vienu vai vairākus ierakstusdatu avotā vai sapludina ierakstus ārpus datu avota.

Izmantojiet šo Patch funkciju, lai modificētu ierakstus sarežģītās situācijās, piemēram, veicot atjauninājumus, kuriem nav nepieciešama lietotāja mijiedarbība, vai izmantojot veidlapas, kas aptver vairākus ekrānus.

Lai vieglāk atjauninātu ierakstus datu avotā un veiktu vienkāršas izmaiņas, tā vietā izmantojiet vadīklu Rediģēt veidlapu. Pievienojot vadīklu Rediģēt veidlapu, jūs nodrošināt lietotājiem aizpildāmo veidlapu un pēc tam saglabājat datu avota izmaiņas. Papildinformāciju skatiet tēmā Datu veidlapu izkārtojuma izprašana.

Noskatieties šo videoklipu, lai uzzinātu, kā izmantot Patch šo funkciju:

Overview

Izmantojiet šo funkciju, Patch lai modificētu vienu vai vairākus datu avota ierakstus. Tas atjaunina konkrētu lauku vērtības, neietekmējot citus rekvizītus. Piemēram, šī formula maina tālruņa numuru klientam ar nosaukumu Bērziņš:

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

Izmantojiet Patch funkciju Defaults , lai izveidotu ierakstus. Izmantojiet šo uzvedību, lai izveidotu vienu ekrānu gan ierakstu izveidei, gan rediģēšanai. Piemēram, šī formula izveido ierakstu klientam ar nosaukumu Bērziņš:

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

Note

Ielāpējot kolekciju, izmantojot ierakstu no datu avota ar noklusējuma vērtībām, ielāpu operācija atjaunina kolekciju gan ar norādītajām ielāpu vērtībām, gan noklusējuma vērtībām no datu avota. Lai izveidotu jaunu ierakstu, plākstera priekšraksta DataSource un funkcijas Defaults DataSource ir jāsakrīt.

Pat ja nestrādājat ar datu avotu, varat to izmantot Patch , lai sapludinātu divus vai vairākus ierakstus. Piemēram, šī formula sapludina divus ierakstus vienā, kas identificē gan tālruņa numuru gan atrašanās vietu klientam Bērziņš:

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

Description

Ieraksta modificēšana vai izveide datu avotā

Lai izmantotu šo funkciju ar datu avotu, norādiet datu avotu un pēc tam norādiet pamatierakstu:

  • Lai modificētu ierakstu, pamatierakstam ir jābūt no datu avota. Pamatierakstu var iegūt, izmantojot galerijas rekvizītu Items , ievietot to konteksta mainīgajā vai iegūt, izmantojot kādu citu ceļu. Taču ir jāspēj izsekot pamatierakstam līdz datu avotam. Šī prasība ir svarīga, jo ierakstā ir iekļauta papildu informācija, kas palīdz vēlreiz atrast ierakstu modificēšanai.
  • Lai izveidotu ierakstu, izmantojiet funkciju Defaults, lai izveidotu pamatierakstu ar noklusējuma vērtībām.

Pēc tam norādiet vienu vai vairākus izmaiņu ierakstus, no kuriem katrs satur jaunas rekvizītu vērtības, kuras ignorē rekvizīta vērtības pamatierakstā. Izmaiņu ieraksti tiek apstrādāti secībā no argumentu saraksta sākuma līdz beigām, vēlākajām rekvizīta vērtībām ignorējot agrākās.

Atgrieztā vērtība ir Patch ieraksts, kuru modificējāt vai izveidojāt. Ja izveidojāt ierakstu, atgrieztajā vērtībā var būt iekļauti rekvizīti, kurus datu avots ģenerēja automātiski. Taču atgrieztā vērtība nenodrošina vērtību saistītas tabulas laukiem.

Piemēram, jūs izmantojat Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); un pēc tam MyAccount.'Primary Contact'.'Full Name'. Šajā gadījumā nevarat piešķirt pilno vārdu. Lai piekļūtu saistītās tabulas laukiem, izmantojiet atsevišķu uzmeklēšanu, piemēram:

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

Atjauninot datu avotu, var rasties viena vai vairākas problēmas. Izmantojiet IfError un IsError ar atgriezto vērtību from Patch , lai atklātu kļūdas un reaģētu uz tām, kā aprakstīts kļūdu apstrādē . Tāpat jūs varat izmantot funkciju Kļūmes, lai identificētu un izpētītu problēmas, kā aprakstīts sadaļā Darbs ar datu avotiem.

Saistītās funkcijas ietver funkciju Update, lai aizstātu visu ierakstu, un funkciju Collect, lai izveidotu ierakstu. Izmantojiet funkciju UpdateIf, lai modificētu konkrētus vairāku ierakstu rekvizītus, pamatojoties uz nosacījumu.

Ierakstu kopas modificēšana vai izveide datu avotā

Varat arī izmantot Patch , lai izveidotu vai modificētu vairākus ierakstus ar vienu zvanu.

Tā vietā, lai nodotu vienu pamatierakstu, otrajā argumentā norādiet pamatierakstu tabulu. Norādiet izmaiņu ierakstus arī tabulā, kas atbilst pamata ierakstiem viens pret vienu. Ierakstu skaitam katrā izmaiņu tabulā ir jābūt tādam pašam kā ierakstu skaitam pamata tabulā.

Ja izmantojat Patch šādā veidā, atgrieztā vērtība ir arī tabula, kurā katrs ieraksts viens pret vienu atbilst bāzes un izmaiņu ierakstiem.

Ierakstu sapludināšana ārpus datu avota

Norādiet divus vai vairākus ierakstus, kurus vēlaties sapludināt. Funkcija apstrādā ierakstus secībā no argumentu saraksta sākuma līdz beigām, bet vēlākās rekvizītu vērtības ignorē agrākās.

Patch Atgriež sapludināto ierakstu un nemodificē tā argumentus vai ierakstus nevienā datu avotā.

Syntax

Ieraksta modificēšana vai izveide datu avotā

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

  • DataSource - Obligāts. Datu avots, kurā ir ieraksts, kuru vēlaties modificēt vai saturēs ierakstu, kuru vēlaties izveidot.
  • BaseRecord - Obligāts. Ieraksts, kuru modificēt vai izveidot. Ja ieraksts ir no datu avota, funkcija atrod un modificē ierakstu. Ja tiek izmantots noklusējuma rezultāts, funkcija izveido ierakstu. Lai izveidotu jaunu ierakstu, plākstera priekšraksta DataSource un funkcijas Defaults DataSource ir jāsakrīt.
  • ChangeRecords - Obligāts. Viens vai vairāki ieraksti, kuros ir rekvizīti, kas jāmodificē BaseRecord. Funkcija apstrādā izmaiņu ierakstus secībā no argumentu saraksta sākuma līdz beigām, bet vēlākās rekvizītu vērtības ignorē agrākās.

Ierakstu kopas modificēšana vai izveide datu avotā

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

  • DataSource - Obligāts. Datu avots, kurā ir ieraksti, kurus vēlaties modificēt vai saturēs ieraksti, kurus vēlaties izveidot.
  • BaseRecordTable - Obligāts. Ierakstu tabula, kas jāmodificē vai jāveido. Ja ieraksts ir no datu avota, funkcija atrod un modificē ierakstu. Ja tiek izmantots noklusējuma rezultāts, funkcija izveido ierakstu. Lai izveidotu jaunu ierakstu, plākstera priekšraksta DataSource un funkcijas Defaults DataSource ir jāsakrīt.
  • ChangeRecordTables - Obligāts. Viena vai vairākas ierakstu tabulas, kas satur rekvizītus, kurus modificēt katram BaseRecordTable ierakstam. Funkcija apstrādā izmaiņu ierakstus secībā no argumentu saraksta sākuma līdz beigām, bet vēlākās rekvizītu vērtības ignorē agrākās.

Merge records

Patch( Ieraksts1, Ieraksts2 [, ...] )

  • Ieraksti - Obligāti. Vismaz divi ieraksti, kurus vēlaties sapludināt. Funkcija apstrādā ierakstus secībā no argumentu saraksta sākuma līdz beigām, bet vēlākās rekvizītu vērtības ignorē agrākās.

Examples

Ieraksta modificēšana vai izveide (datu avotā)

Šajos piemēros jūs modificējat vai izveidojat ierakstu datu avotā ar nosaukumu IceCream. Datu avots satur datus šajā tabulā un automātiski ģenerē vērtības kolonnā ID:

Ekrānuzņēmums, kurā redzama IceCream datu avota piemēra tabula, kurā redzamas garšas un daudzumi.

Lai izveidotu šī datu avota atmiņas versiju, lai varētu izmēģināt šos piemērus, novērtējiet šo formulu:

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Saldējums,
LookUp( IceCream, Garša = "Šokolādes" ), { Daudzums: 400 })
Modificē ieraksta datu avotu IceCream:
  • Ieraksta ID, ko modificēt, satur vērtību 1. (Ieraksts Šokolāde, kuram ir šis ID.)
  • Vērtība kolonnā Daudzums tiek mainīta uz 400.
{ ID: 1, Garša: "Šokolāde", Daudzums: 400 }

Ieraksts Šokolāde datu avotā IceCream tiek modificēts.
Patch( Saldējums, Noklusējumi( Saldējums ), { Garša: "Zemeņu" } ) Izveido ierakstu datu avotā IceCream:
  • Kolonna ID satur vērtību 3, kuru datu avots ģenerē automātiski.
  • Kolonna Daudzums satur vērtību 0, kas ir noklusējuma vērtība šai kolonnai datu avotā IceCream, kā konkretizē funkcija Defaults.
  • Kolonna Garša satur vērtību Zemeņu.
{ ID: 3, Flavor: "Zemeņu", Daudzums: 0 }

Tiek izveidots ieraksts Zemeņu datu avotā IceCream .

Pēc iepriekšējo formulu novērtēšanas datu avots beidzas ar šādām vērtībām:

Saldējuma datu avota ekrānuzņēmums pēc Patch formulu novērtēšanas.

Ierakstu sapludināšana (ārpus datu avota)

Formula Description Result
Patch( { Vārds: "Džeimss", Rezultāts: 90 }, { Vārds: "Džims", Nodots: patiess } ) Sapludina divus ierakstus ārpus datu avota:
  • Vērtības katra ieraksta kolonnā Nosaukums nesakrīt. Rezultāts satur vērtību (Rihards) ierakstā, kas ir tuvāk argumentu saraksta beigām, nevis vērtību (James) ierakstā, kurš atrodas tuvāk sākumam.
  • Pirmajā ierakstā ir kolonna (Rezultāts), kura nepastāv otrajā ierakstā. Rezultāts satur šo kolonnu ar tās vērtību (90).
  • Otrais ieraksts satur kolonnu (Nodots), kura neeksistē pirmajā ierakstā. Rezultāts satur šo kolonnu ar tās vērtību (true).
{ Vārds:"Rihards", Rezultāts: 90, Nodots: true }

Ierakstu kopas modificēšana vai izveide (datu avotā)

Ja izmantojat Patch tabulas, nevis atsevišķus ierakstus, vienā zvanā var izveidot vai modificēt vairākus ierakstus. Atgrieztā vērtība ir ierakstu tabula, kas viens pret vienu atbilst ievades tabulām.

Šajā piemērā tiek atjaunināts vairāku garšu daudzums datu avotā IceCream vienlaikus:

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

Rezultāts ir tabula ar atjauninātajiem ierakstiem: { ID: 1, Flavor: "Chocolate", Quantity: 300 } un { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Šajā piemērā tiek izveidoti vairāki jauni ieraksti , izmantojot noklusējumus:

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

Note

Lietojot Patch ar tabulām, ierakstu skaitam katrā izmaiņu tabulā jāatbilst ierakstu skaitam pamattabulā. Pretējā gadījumā rodas kļūda.

Lai noteiktu kļūdas, modificējot vairākus ierakstus, izmantojiet IfError. IfError ir vēlamais mehānisms un darbojas Power Fx resursdatoros:

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

Patch ar Dataverse kolonnu tipiem

Tālāk sniegtie piemēri attiecas tieši uz Microsoft Dataverse datu avotiem. Ierakstu formas atšķiras atkarībā no datu avota (piemēram, SharePoint un SQL Server ir dažādi formāti).

Kolonna Izvēle: Lai iestatītu kolonnu Izvēle, tieši izmantojiet uzskaitījuma vērtību. Šajā piemērā tabulā Konti ir iestatīta kolonna Statusa izvēle:

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

Uzmeklēšanas kolonna: Lai iestatītu uzmeklēšanas kolonnu, norādiet ierakstu ar saistītās tabulas primāro atslēgu. Šajā piemērā tiek iestatīta primārās kontaktpersonas uzmeklēšana kontu ierakstā:

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

Note

Šie kolonnu tipa piemēri ir specifiski Dataverse. Citiem datu avotiem, piemēram, SharePoint vai SQL Server, var būt nepieciešamas atšķirīgas ierakstu formas līdzīgiem kolonnu tipiem. Skatiet konkrētā datu avota dokumentāciju, lai uzzinātu pareizo formātu.

Deleģēšana formulās, kurās tiek izmantots Patch

Pati Patch funkcija nav pakļauta deleģēšanai , jo tā raksta datu avotā, nevis vaicā. Tomēr deleģēšanas brīdinājumi var tikt parādīti formulās, kas tiek izmantotas Patch , ja formulas ierakstu atlases daļa (piemēram, Filtrs, Uzmeklēšana vai ForAll) ietver vaicājumu, kas pārsniedz datu avota deleģēšanas ierobežojumus.

Ja formulā, kurā ir iekļauts Patch, redzat deleģēšanas brīdinājumu, pārbaudiet, vai brīdinājums attiecas uz datu izgūšanas funkcijām, nevis uz Patch sevi. Papildinformāciju par deleģēšanu skatiet sadaļā Izpratne par deleģēšanu audekla programmā.

Bieži sastopamās Patch kļūdas ar funkciju

Lietojot Patch šo funkciju, kļūdas var rasties datu avota savienojamības, atļauju vai datu konfliktu dēļ. Izmantojiet IfError un IsError , lai atklātu kļūdas un atbilstoši reaģētu.

  • "Tīkla kļūda, izmantojot Patch funkciju": šī kļūda parasti norāda, ka programma nevar sasniegt datu avotu. Biežākie iemesli ir zaudēts interneta savienojums, datu avota īslaicīga nepieejamība vai nepietiekamas atļaujas pašreizējam lietotājam. Aplauziet zvanu Patchprogrammā IfError , lai lietotājiem sniegtu jēgpilnu ziņojumu.

  • "Pastāv konflikti ar izmaiņām serverī": šī kļūda rodas, ja cits lietotājs vai process modificē to pašu ierakstu laikā no brīža, kad programma nolasa ierakstu un ieraksta izmaiņas. Atsvaidziniet datu avotu, izsaucot funkciju Atsvaidzināt , un mēģiniet veikt darbību vēlreiz.

  • Atļauju kļūdas: ja lietotājam nav atļaujas izveidot vai modificēt ierakstus datu avotā, Patch izsaukums neizdodas. Izmantojiet IfError , lai uztvertu ar atļaujām saistītās kļūdas un vadītu lietotāju.

Vispārīgus kļūdu apstrādes modeļus skatiet sadaļā Kļūdu apstrāde.

As vai ThisRecord lietošana

Izmantojiet formulā atslēgvārdu As vai ThisRecord , lai izvairītos no neskaidra vērtēšanas konteksta.

Nākamajā piemērā apsveriet pirmo LookupIf paziņojumu. (OrderID = A[@OrderID]) ir sagaidāms, OrderId ka salīdzinās darbības Lookup jomā ar OrderId iekasēšanu AForAll darbības jomā. Šajā gadījumā, visticamāk, vēlaties A[@OrderId] atrisināt kā lokālu parametru. Bet tas ir neskaidrs.

Power Apps pašlaik interpretē gan kreiso pusi OrderId, gan labo pusi A[@OrderId] kā lauku Lookup tvērumā. Tāpēc Lookup vienmēr atrod pirmo rindu [dbo].[Orders1] , jo nosacījums vienmēr ir patiess (tas ir, jebkura rinda ir vienāda OrderId ar sevi).

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

As vai ThisRecord lietošana

Kad vien iespējams, izmantojiet operatoru As vai atslēgvārdu ThisRecord , lai izskaidrotu kreiso pusi. ieteikts iepriekšējam scenārijam.

Ja formulā tiek izmantoti vairāki tvērumi ar ForAll, Filterun Lookup vienā datu avotā vai tabulā, tvēruma parametri var sadurties ar vienu un to pašu lauku citur. Tāpēc izmantojiet operatoru As vai ThisRecord , lai atrisinātu lauka nosaukumu un izvairītos no neskaidrībām.

Piemēram, varat izmantot operatoru As , lai izskaidrotu neskaidrības nākamajā piemērā.

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

Tāpat šim nolūkam varat izmantot 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"
       }
   )
    )
)

Lai uzzinātu vairāk par operatora As un ThisRecord lietošanu, skatiet rakstu Operatori .