Делите путем


Функција Patch

Важи за: Цанвас апликације Модел-дривен апликације Power Platform ЦЛИ Десктоп токове

Мења или креира један или више записа у извору података или спаја записе изван извора података.

Користите функцију Patch да бисте изменили записе у сложеним ситуацијама, као што су оне када радите исправке које не захтевају интеракцију корисника или користите обрасце који се простиру на више екрана.

Да бисте лакше ажурирали записе у извору података за једноставне измене, користите тастер Уреди образац уместо контроле. Када додате контролу Уређивање обрасца, корисницима дајете образац за попуњавање и затим се измене чувају у извору података. За више информација, погледајте Објашњење образаца података.

Погледајте овај видео запис да бисте сазнали како да користите функцију Patch:

Преглед

Користите функцију Patch да бисте изменили један или више записа у извору података. Вредности специфичних поља се мењају без утицаја на друга својства. На пример, ова формула мења телефонски број за клијента по имену Contoso:

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

Употреба функције Patch са функцијом Defaults за креирање записа. Користите ово понашање за изградњу једног екрана како за креирање, тако и за уређивање записа. На пример, ова формула креира запис за клијента по имену Contoso:

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

Чак и ако не радите са извором података, можете да користите Patch за обједињавање два или више записа. На пример, ова формула спаја два записа у један који идентификује и телефонски број и локацију за Contoso:

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

Опис

Уређујте или креирајте запис у извору података

Да бисте ову функцију користили са извором података, наведите извор података, а затим одредите основни запис:

  • Да бисте изменили запис, основни запис мора да потиче из извора података. Основни запис је можда дошао преко својства галерије Предмети, смештен је у променљиву контекста или преко неке друге путање. Али, можете пратити основни запис до извора података. Ово је важно јер ће запис садржавати додатне информације које ће вам помоћи да се поново пронађе запис ради модификације.
  • Да бисте креирали запис, користите функцију Defaults за креирање основног записа са подразумеваним вредностима.

Затим одредите један или више записа промена, од којих сваки садржи нове вредности својстава које надјачавају вредности својстава у основном запису. Записи о променама обрађују се од почетка листе аргумената до краја, при чему ће касније вредности својства надјачати раније.

Повратна вредност функције Patch је запис који сте модификовали или креирали. Ако сте креирали запис, повратна вредност може укључивати својства која је извор података аутоматски генерисао. Међутим, повратна вредност не пружа вредност за поља повезане табеле.

На пример, користите Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name"));, а затим MyAccount.'Primary Contact'.'Full Name'. У овом случају не можете дати пуно име. Уместо тога, да бисте приступили пољима повезане табеле, користите засебно проналажење као што је:

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

Када ажурирате извор података, може се појавити један или више проблема. Користите IfError и IsError са повратном вредношћу из функције Patch да бисте открили грешке и одговорили на њих, као што је описано у одељку Руковање грешкама. Можете и да користите функцију Errors за препознавање и испитивање проблема, као што је описано у одељку Рад са изворима података.

Сродне функције укључују функцију Update за замену целог записа и функцију Collect за креирање записа. Користите функцију UpdateIf за промену специфичних својстава више записа на основу стања.

Уређујте или креирајте скуп записа у извору података

Patch се такође може користити за креирање или модификовање више записа једним позивом.

Уместо да прође један основни запис, у другом аргументу може се дати табела основних записа. Записи о променама су дати и у табели, која одговара један за један са основним записима. Број записа у свакој табели промена мора бити исти као и број записа у основној табели.

Када Patch користите на овај начин, повратна вредност је такође табела са сваким записом која одговара један за једним са основом и записима промена.

Спајање записа изван извора података

Наведите два или више записа које желите спојити. Записи се обрађују се од почетка листе аргумената до краја, при чему ће касније вредности својства надјачати раније.

Patch враћа спојени запис и не мења своје аргументе или записе у било којем извору података.

Синтакса

Уређујте или креирајте запис у извору података

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

  • DataSource – Обавезно. Извор података који садржи запис који желите да измените или ће садржати запис који желите да креирате.
  • BaseRecord – Обавезно. Запис за измену или креирање. Ако је запис дошао из извора података, запис се проналази и модификује. Ако се користи резултат за Defaults, креира се запис.
  • ChangeRecord(s) – Обавезно. Један или више записа који садрже својства за модификовање у BaseRecord. Записи о променама обрађују се од почетка листе аргумената до краја, при чему ће касније вредности својства надјачати раније.

Уређујте или креирајте скуп записа у извору података

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

  • DataSource – Обавезно. Извор података који садржи записе које желите да измените или ће садржати записе које желите да креирате.
  • BaseRecordTable – Обавезно. Табела записа коју можете модификовати или креирати. Ако је запис дошао из извора података, запис се проналази и модификује. Ако се користи резултат за Defaults, креира се запис.
  • ChangeRecordTable(s) – Обавезно. Једна или више табела записа која садржи својства која се мењају за сваки запис за BaseRecordTable. Записи о променама обрађују се од почетка листе аргумената до краја, при чему ће касније вредности својства надјачати раније.

Обједињавање записа

Patch( Record1, Record2 [, …] )

  • Record(s) – Обавезно. Бар два записа која желите да обједините. Записи се обрађују се од почетка листе аргумената до краја, при чему ће касније вредности својства надјачати раније.

Примери

Уређујте или креирајте запис (у извору података)

У овим примерима ћете модификовати или креирати запис у извору података по имену IceCream, који садржи податке у овој табели и аутоматски генерише вредности у IDколоне:

Пример сладоледа.

Формула Опис Резултат
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Измењује запис у извору података IceCream:
  • Колона ID записа који треба изменити садржи вредност 1. (Запис Чоколада има тај ID.)
  • Вредност у колони Количина се мења у 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Унос Чоколада у извор података IceCream је измењен.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Креира запис у извору података IceCream:
  • Колона ID садржи вредност 3, који извор података аутоматски генерише.
  • Колона Количина садржи 0, што је подразумевана вредност за ту колону у IceCream извору података, како одређује функција Defaults.
  • Колона Flavor садржи вредност Strawberry.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Унос Strawberry у извор података IceCream је креиран.

Након процене претходних формула, извор података се завршава овим вредностима:

Пример сладоледа после.

Спајање записа (изван извора података)

Формула Опис Резултат
Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) Спаја два записа изван извора података:
  • Вредности у колони Име за сваки запис се не подудара. Резултат садржи вредност (Jim) у запису који је ближи крају листе аргумената уместо вредности(James) у запису који је ближи почетку.
  • Први запис садржи колону (Резултат) која не постоји у другом запису. Резултат садржи ту колону са њеном вредношћу (90).
  • Други запис садржи колону (Пренето) која не постоји у првом запису. Резултат садржи ту колону са њеном вредношћу (тачно).
{ Name: "Jim", Score: 90, Passed: true }

Употреба As или ThisRecord

Употребом кључне речи As или ThisRecord у формули избегава се двосмислено тумачење контекста.

У примеру испод, размотрите прво претраживање у изјави If. Очекује се да (OrderID = A[@OrderID]) упореди OrderId у опсегу проналажења помоћу OrderId колекције A у опсегу ForAll. У овом случају, вероватно желите да A[@OrderId] буде разрешен као локални параметар. Али то је двосмислено.

Power Apps тренутно тумачи оба OrderId на левој страни и A[@OrderId] на десној страни као поље у опсегу проналажења. Стога ће функција тражења увек пронаћи први ред у [dbo].[Orders1] јер је услов увек тачан (тј., сваки OrderId у реду је једнак самом себи.)

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 или ThisRecord

Кад год је то могуће користите оператор As или ThisRecord да лева страна не буде двосмислена. As препоручује се за горњи сценарио.

Када формула користи више опсега помоћу функција ForAll, Filter и Lookup на истом извору података или табели, може доћи до преклапања параметара опсега са истим пољем на неком другом месту. Због тога се препоручује коришћење оператора As или ThisRecord да би се решио назив поља и избегла двосмисленост.

На пример, можете да користите оператор As за отклањање двосмислености у доњем примеру.

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

Односно, можете користити оператор 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"
       }
   )
    )
)

Да бисте сазнали више о коришћењу оператора As и ThisRecord, погледајте чланак Оператори.