Функция 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( Източник на данни; BaseRecord; ChangeRecord1 [, ChangeRecord2, ... ])
- Източник на данни – Задължително. Източникът на данни, който съдържа записа, който искате да промените или ще съдържа записа, който искате да създадете.
- BaseRecord – Задължително. Записът за промяна или създаване. Ако записът е от източник на данни, записът е намерен и модифициран. Ако резултатът от Defaults се използва, създава се запис.
- ChangeRecords – Задължително. Един или повече записи, които съдържат свойства за промяна в BaseRecord. Записите на промените се обработват в ред от началото на списъка с аргументи до края, като по-късните стойности на свойствата надменят по-ранните.
Променете или създайте набор от записи в източник на данни
Patch(DataSource,BaseRecordsTable,ChangeRecordTable1 [, ChangeRecordTable2 , ... ] )
- Източник на данни – Задължително. Източникът на данни, който съдържа записи, които искате да промените или ще съдържа записи, които искате да създадете.
- BaseRecordTable – Задължително. Таблица от записи за промяна или създаване. Ако записът е от източник на данни, записът е намерен и модифициран. Ако резултатът от Defaults се използва, създава се запис.
- ChangeRecordTables – Задължително. Една или повече таблици от записи, които съдържат свойства, които да се променят за всеки запис на BaseRecordTable. Записите на промените се обработват в ред от началото на списъка с аргументи до края, като по-късните стойности на свойствата надменят по-ранните.
Обединяване на записи
Patch( Record1,Record2 [, ...] )
- Записи - Задължителни. Поне два записа, които искате да обедините. Записите се обработват в реда от началото на списъка с аргументи до края, като по-късните стойности на свойствата заместват по-ранните.
Примери
Променете или създайте запис (в източник на данни)
В тези примери ще модифицирате или създадете запис в източник на данни, наречен IceCream, която съдържа данните в тази таблица и автоматично генерира стойностите в IDколона:
Формула | Описание | Result |
---|---|---|
Пластир ( Сладолед, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
Променя запис в IceCream източник на данни:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } Обетът Шоколад в Сладолед източник на данни е променен. |
Пластир (сладолед, по подразбиране (сладолед), { вкус: "ягода" } | Създава запис в IceCream източник на данни:
|
{ ID: 3, Flavor: "Strawberry", Quantity: 0 } Записът Ягода в Сладолед източник на данни е създадена. |
След като предишните формули са оценени, източник на данни завършва с тези стойности:
Обединяване на записи (извън източник на данни)
Формула | Описание | Резултат |
---|---|---|
Пач ( { Име: "Джеймс", Резултат: 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 вижте Оператори статия.