Функція Patch
Застосовується до: програм Canvas Програм на основі моделі CLI Power Platform Desktop flows
Змінює або створює один або кілька записів у джерелі даних або об’єднує записи за межами джерела даних.
Використовуйте функцію 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, ... ])
- Джерело даних– Обов’язковий. Джерело даних, що містить запис, який потрібно змінити, або буде містити запис, який необхідно створити.
- BaseRecord – Обов’язковий. Запис, який потрібно змінити або створити. Якщо запис є частиною джерела даних, його буде знайдено та змінено. Якщо використовується результат функції Defaults, створюється запис.
- ChangeRecords – Обов’язковий. Один або кілька записів, що містять властивості, які потрібно змінити в BaseRecord. Записи для змінення обробляються від початку й до кінця списку аргументів, а останні значення властивості змінюють попередні.
Зміна або створення набору записів у джерелі даних
Patch(DataSource,BaseRecordsTable,ChangeRecordTable1 [, ChangeRecordTable2 , ... ] )
- Джерело даних– Обов’язковий. Джерело даних, що містить записи, які потрібно змінити, або буде містити записи, які необхідно створити.
- BaseRecordTable – Обов’язковий. Таблиця записів, які потрібно змінити або створити. Якщо запис є частиною джерела даних, його буде знайдено та змінено. Якщо використовується результат функції Defaults, створюється запис.
- ChangeRecordTables – обов’язковий. Одна або кілька таблиць записів, що містять властивості, які необхідно змінити для кожного запису BaseRecordTable. Записи для змінення обробляються від початку й до кінця списку аргументів, а останні значення властивості змінюють попередні.
Злиття записів
Патч( Запис1,Запис2 [ , ...] )
- Записи - обов’язкові. Виберіть принаймні два записи для об’єднання. Записи обробляються від початку й до кінця списку аргументів, а останні значення властивості змінюють попередні.
Приклади
Зміна або створення запису (в джерелі даних)
У цих прикладах ви зміните або створите запис у джерелі даних з іменем IceCream. Запис міститиме дані в цій таблиці й автоматично створить значення в стовпціІдентифікатор:
Формула | Опис | Результат |
---|---|---|
Пластир ( Морозиво, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
Змінює запис у джерелі даних IceCream:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } Запис Chocolate у джерелі даних IceCream змінено. |
Патч ( Морозиво, За замовчуванням ( Морозиво ), { Смак: "Полуниця") } | Створює запис у джерелі даних IceCream:
|
{ ID: 3, Смак: "Полуниця", Кількість: 0 } У джерелі даних IceCream створено запис Strawberry. |
Після обчислення попередніх формул джерело даних отримує такі значення:
Об’єднання записів (поза межами джерела даних)
Формула | Опис | Результат |
---|---|---|
Патч( { Ім’я: "Джеймс", Оцінка: 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, щоб усунути неоднозначність у лівій частині. Як рекомендується для наведеного вище сценарію.
Якщо у формулі використовуються кілька областей з 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, див статтю Оператори.