Patch Функцију

Односи се на: Цанвас апликације Цопилот Студио Десктоп токови Апликације засноване на моделу Повер Платформ ЦЛИ Датаверсе функције

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

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

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

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

Overview

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

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

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

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

Note

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

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

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

Description

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

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

  • Да бисте изменили запис, основни запис мора да дође из извора података. Можете добити основни запис преко својства Ставке галерије, ставити га у контекстну променљиву , или га добити преко неког другог пута. Али , морате бити у могућности да пратите основни запис до извора података. Овај захтев је важан јер запис садржи додатне информације које вам помажу да поново пронађете запис за измену.
  • Да бисте креирали запис, користите функцију 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'

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

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

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

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

Уместо доношења једног основног записа, обезбедите табелу основних записа у другом аргументу. Обезбедите и записе о променама у табели, одговарајући један-за-један са основним записима. Број записа у свакој табели промена мора бити исти као и број записа у основној табели.

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

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

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

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

Syntax

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

Patch( ДатаСоурце , БасеРецорд , ChangeRecord1 [, ChangeRecord2 , ... ])

  • ДатаСоурце – Обавезно. Извор података који садржи запис који желите да измените или ће садржати запис који желите да креирате.
  • БасеРецорд – Обавезно. Запис за измену или креирање. Ако је запис дошао из извора података, функција проналази и модификује запис. Ако се користи резултат Дефаултс , функција креира запис. ДатаСоурце изјаве закрпе и ДатаСоурце функције Дефаултс морају се поклапати да би се креирао нови запис.
  • ЦхангеРецордс – Обавезно. Један или више записа који садрже својства за модификовање у BaseRecord. Функција обрађује промену записа по редоследу од почетка листе аргумената до краја, са каснијим вредностима особина које преписују раније.

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

Patch( ДатаСоурце , БасеРецордсТабле , ChangeRecordTable1 [, ChangeRecordTable2 , ... ] )

  • ДатаСоурце – Обавезно. Извор података који садржи записе које желите да измените или ће садржати записе које желите да креирате.
  • БасеРецордТабле - Обавезно. Табела записа коју можете модификовати или креирати. Ако је запис дошао из извора података, функција проналази и модификује запис. Ако се користи резултат Дефаултс , функција креира запис. ДатаСоурце изјаве закрпе и ДатаСоурце функције Дефаултс морају се поклапати да би се креирао нови запис.
  • ЦхангеРецордТаблес – Обавезно. Једна или више табела записа која садржи својства која се мењају за сваки запис за BaseRecordTable. Функција обрађује промену записа по редоследу од почетка листе аргумената до краја, са каснијим вредностима особина које преписују раније.

Merge records

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

  • Евиденција - Обавезно. Бар два записа која желите да обједините. Функција обрађује записе по редоследу од почетка листе аргумената до краја, са каснијим вредностима особина које премошћују раније.

Examples

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

У овим примерима модификујете или креирате запис у извору података под називом ИцеЦреам . Извор података садржи податке у овој табели и аутоматски генерише вредности у колони ИД :

Снимак екрана табеле примера извора података ИцеЦреам која приказује укусе и количине.

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

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch( Сладолед,
ЛоокУп ( сладолед, укус = "чоколада" ), { количина: 400 } )
Измењује запис у извору података IceCream:
  • Колона ID записа који треба изменити садржи вредност 1. (Запис Чоколада има тај ID.)
  • Вредност у колони Количина се мења у 400.
{ ИД: 1, Укус: "Чоколада", Количина: 400 }

Унос чоколаде у извору података ИцеЦреам је модификован.
Patch( ИцеЦреам, Дефаултс( ИцеЦреам ), { Флавор: "Страwберрy" } ) Креира запис у извору података IceCream:
  • Колона ID садржи вредност 3, који извор података аутоматски генерише.
  • Колона Количина садржи 0, што је подразумевана вредност за ту колону у IceCream извору података, како одређује функција Defaults.
  • Колона Flavor садржи вредност Strawberry.
{ ИД: 3, Укус: "Јагода", Количина: 0 }

Креиран је унос јагоде у извору података ИцеЦреам .

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

Снимак екрана извора података ИцеЦреам након Patch што су формуле процењене.

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

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

Измените или креирајте скуп записа (у извору података)

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

Овај пример ажурира количину за више укуса у извору података ИцеЦреам одједном:

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

Резултат је табела са ажурираним записима: { ID: 1, Flavor: "Chocolate", Quantity: 300 } и { ID: 2, Flavor: "Vanilla", Quantity: 400 }.

Овај пример креира више нових записа користећи Дефаултс :

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

Note

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

Да бисте открили грешке када модификујете више записа, користите ИфЕррор . IfError је преферирани механизам и ради преко Повер Фк домаћина:

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

Patch са типовима колона Датаверсе

Следећи примери се посебно односе на &лт;c0&гт;< ДИЦТ__Мицрософт ⚐ Датаверсе > Мицрософт Датаверсе &лт;/c0&гт; изворе података. Облици записа варирају у зависности од извора података (на пример, СхареПоинт и < ДИЦТ__СQЛ ⚐ Сервер > СQЛ Сервер имају различите формате).

Колона избора: Да бисте подесили колону избора, користите вредност енум директно. Овај пример поставља колону избора статуса у табели Рачуни :

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

Колона за претрагу: Да бисте поставили колону за претрагу, обезбедите запис са примарним кључем повезане табеле. Овај пример поставља претрагу примарног контакта на запис налога :

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

Note

Ови примери типа колоне су специфични за Датаверсе. Други извори података, као што су СхареПоинт или < ДИЦТ__СQЛ ⚐ Сервер > СQЛ Сервер , могу захтевати различите облике записа за сличне типове колона. Погледајте документацију за ваш специфични извор података за исправан формат.

Делегирање у формулама које користе Patch

Сама Patch функција није предмет делегирања јер пише у извор података, а не да га упита. Међутим , упозорења о делегирању могу се појавити у формулама које користе Patch ако део формуле за избор записа (као што је Филтер , ЛоокУп или ФорАлл ) укључује упит који прелази ограничења делегирања извора података.

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

Уобичајене грешке са функцијом Patch

Када користите функцију Patch , могу се појавити грешке због повезивања извора података, дозвола или сукоба података. Користите ИфЕррор и ИсЕррор да бисте открили грешке и одговорили на одговарајући начин.

  • "Мрежна грешка приликом коришћења Patch функције" : Ова грешка обично указује на то да апликација не може да дође до извора података. Уобичајени узроци укључују изгубљену интернет везу, извор података који је привремено недоступан, или недовољне дозволе за тренутног корисника. Завршите Patch позив у ИфЕррор да бисте корисницима пружили смислену поруку.

  • "Конфликти постоје са променама на серверу" : Ова грешка се јавља када други корисник или процес модификује исти запис између времена када ваша апликација чита запис и пише промену. Освежите извор података тако што ћете позвати функцију Освежи и поновите операцију.

  • Грешке у дозволи: Ако корисник нема дозволу за креирање или измену записа у извору података, Patch позив не успева. Користите ИфЕррор да бисте ухватили грешке везане за дозволу и водили корисника.

За опште обрасце руковања грешкама, погледајте Руковање грешкама .

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

Користите кључну реч Ас или ТхисРецорд у формули да бисте избегли двосмислен контекст евалуације.

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

< ДИЦТ__Поwер ⚐ Аппс > Поwер Аппс тренутно тумачи и леву страну &лт;c0 /&гт; и десну страну &лт;c1 /&гт; као поље у &лт;c2 /&гт; опсегу. Према томе, Lookup увек се налази први ред јер [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

Кад год је то могуће, користите оператор Ас или кључну реч ТхисРецорд да бисте раздвојили леву страну. Као што је препоручено за претходни сценарио.

Када ваша формула користи више опсега са ForAll, Filter, и на истом извору података или табели, параметри Lookup обима могу се сударити са истим пољем на другом месту. Стога , користите Ас оператор или ТхисРецорд да бисте решили име поља и избегли двосмисленост.

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

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

Да бисте сазнали више о употреби Ас оператора и ТхисРецорд , погледајте чланак Оператори .