Функція Patch

Застосовується до: програм Canvas Програм на основі моделі Потоки Power Platform CLI Desktop

Змінює або створює один або кілька записів у джерелі даних або об’єднує записи за межами джерела даних.

Використовуйте функцію 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. Запис міститиме дані в цій таблиці й автоматично створить значення в стовпціІдентифікатор:

Приклад морозива.

Формула Опис Результат
Patch( IceCream,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
Змінює запис у джерелі даних IceCream:
  • Стовпець Ідентифікатор запису, який потрібно змінити, містить значення 1. (Запис Chocolate не має ідентифікатора.)
  • Значення в стовпці Кількість зміниться на 400.
{ ID: 1, Flavor: "Chocolate", Quantity: 400 }

Запис Chocolate у джерелі даних IceCream змінено.
Patch( IceCream, Defaults( IceCream ), { Flavor: "Strawberry" } ) Створює запис у джерелі даних IceCream:
  • Стовпець Ідентифікатор містить значення 3, яке джерело даних створює автоматично.
  • Стовпець Кількість містить значення 0, яке є значенням за замовчуванням для цього стовпця в джерелі даних IceCream відповідно до функції Defaults.
  • У стовпці Аромат міститься значення Strawberry.
{ ID: 3, Смак: "Полуниця", Кількість: 0 }

У джерелі даних IceCream створено запис Strawberry.

Після обчислення попередніх формул джерело даних отримує такі значення:

Приклад морозива після.

Об’єднання записів (поза межами джерела даних)

Формула Опис Результат
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, див статтю Оператори.