Споделяне чрез


Функция Patch

Отнася се за: Приложения за платно Приложения Power Platform , задвижвани от модели CLI Потоци на работния плот

Променя или създава един или повече записи в източник на данни или обединява записи извън източник на данни.

Използвайте функцията 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 за откриване и реагиране на грешки, както е описано Error Handling. Можете също да използвате 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колона:

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

Формула Описание Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Променя запис в IceCream източник на данни:
  • Колоната ИД на записа за промяна съдържа стойността на 1. (Записът Шоколад има този ИД.)
  • Стойността в колоната Количество се променя на 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Обетът Шоколад в Сладолед източник на данни е променен.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Създава запис в IceCream източник на данни:
  • Колоната ИД съдържа стойността 3, което източник на данни генерира автоматично.
  • Колоната количество съдържа 0, което е стойността по подразбиране за тази колона в Сладолед източник на данни, както функцията Defaults определя.
  • Колоната вкус съдържа стойността ягода.
{ ID: 3, Flavor: "Strawberry", Quantity: 0 }

Записът Ягода в Сладолед източник на данни е създадена.

След като предишните формули са оценени, източник на данни завършва с тези стойности:

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

Обединяване на записи (извън източник на данни)

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

Използване на Като или ThisRecord

Използвайки Като или 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"
       }
   )
    )
)

Използване на Като или ThisRecord

Винаги когато е възможно използвайте Като оператор или ThisRecord за да се разграничи лявата страна. Като се препоръчва за горния сценарий.

Когато вашата формула използва множество обхвати с ForAll, Filter, и Lookup на същия източник на данни или таблица е възможно параметрите на обхвата да се сблъскат със същото поле другаде. Поради това се препоръчва използването на Като оператор или ThisRecord за разрешаване на името на полето и избягване на неясноти.

Например можете да използвате Като оператор за премахване на отметката в примера по-долу.

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

За да научите повече за използването на Като оператор и ThisRecord вижте Оператори статия.