Patch функция

Отнася се за: Приложения за платно Copilot Studio Работен плот потоци Модел-управлявани приложения Power Platform CLI Dataverse функции

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

Използвайте функцията Patch , за да модифицирате записи в сложни ситуации, като например когато извършвате актуализации, които не изискват взаимодействие с потребителя, или да използвате формуляри, които ширят няколко екрана.

За да актуализирате записи в източник на данни по-лесно за прости промени, използвайте Редактиране на формуляр вместо тази контрола. Когато добавите Редактиране на формуляр контрола, предоставяте на потребителите формуляр за попълване и след това запазвате промените в източник на данни. За повече информация вижте Разберете оформлението на формуляри за данни.

Гледайте това видео, за да научите как да използвате Patch функцията:

Overview

Използвайте функцията Patch , за да промените един или повече записи на източник на данни. Той актуализира стойностите на конкретни полета , без да влияе на други свойства. Например, тази формула променя телефонния номер за клиент на име Contoso:

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

Използвайте Patch с функцията Defaults за създаване на записи. Използвайте това поведение за изграждане на един екран, както за създаване, така и за редактиране на записи. Например, тази формула създава запис за клиент на име Contoso:

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

Note

Когато пачнеш колекция чрез запис от източник на данни с стандартни стойности, операцията за пач актуализира колекцията както със зададени стойности на пач, така и с стандартните стойности от източника на данни. DataSource на patch оператора и DataSource на функцията Defaults трябва да съвпадат, за да създадат нов запис.

Дори ако не работите с източник на данни, можете да използвате Patch за обединяване на два или повече записа. Например, тази формула обединява два записа в един, който идентифицира както телефонния номер, така и местоположението за Contoso:

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

Description

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

За да използвате тази функция с източник на данни, посочете източник на данни и след това посочете базов запис:

  • За да се модифицира запис, базовият запис трябва да идва от източник на данни. Може да получите базовия запис през свойството Items на галерия, да го поставите в контекстна променлива или да го получите по друг път. Но трябва да можете да проследите базовия запис до източника на данни. Това изискване е важно, защото записът съдържа допълнителна информация, която ви помага да го намерите отново за корекция.
  • За да създадете запис, използвайте 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 връща обединения запис и не променя своите аргументи или записи в никакви източници на данни.

Syntax

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

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])

  • Източник на данни – Задължително. Източникът на данни, който съдържа записа, който искате да промените или ще съдържа записа, който искате да създадете.
  • BaseRecord – Задължително. Записът за промяна или създаване. Ако записът идва от източник на данни, функцията го намира и променя. Ако се използва резултатът от Defaults , функцията създава запис. DataSource на инструкцията за корекция и DataSource на функцията Defaults трябва да съвпадат, за да се създаде нов запис.
  • ChangeRecords – Задължително. Един или повече записи, които съдържат свойства за промяна в BaseRecord. Функцията обработва записите за промяна в ред от началото на списъка с аргументи до края, като по-късните стойности на свойствата преодоляват по-старите.

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

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, ... ] )

  • Източник на данни – Задължително. Източникът на данни, който съдържа записи, които искате да промените или ще съдържа записи, които искате да създадете.
  • BaseRecordTable – Задължително. Таблица от записи за промяна или създаване. Ако записът идва от източник на данни, функцията го намира и променя. Ако се използва резултатът от Defaults , функцията създава запис. DataSource на инструкцията за корекция и DataSource на функцията Defaults трябва да съвпадат, за да се създаде нов запис.
  • ChangeRecordTables – Задължително. Една или повече таблици от записи, които съдържат свойства, които да се променят за всеки запис на BaseRecordTable. Функцията обработва записите за промяна в ред от началото на списъка с аргументи до края, като по-късните стойности на свойствата преодоляват по-старите.

Merge records

Patch( Запис1, Запис2 [, ...] )

  • Записи - Задължителни. Поне два записа, които искате да обедините. Функцията обработва записите в ред от началото на списъка с аргументи до края, като по-късните стойности на свойствата заместват по-старите.

Examples

Променете или създайте запис (в източник на данни)

В тези примери променяте или създавате запис в източник на данни, наречен IceCream. Източникът на данни съдържа данните в тази таблица и автоматично генерира стойностите в колоната ID:

Скрийншот на таблицата с примерни източници на IceCream, показваща вкусове и количества.

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

ClearCollect( IceCream,
    { ID: 1, Flavor: "Chocolate", Quantity: 100 },
    { ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
Formula Description Result
Patch- Не, не.
LookUp( IceCream, Аромат = "Шоколад" ), { Количество: 400 } )
Променя запис в IceCream източник на данни:
  • Колоната ИД на записа за промяна съдържа стойността на 1. (Записът Шоколад има този ИД.)
  • Стойността в колоната Количество се променя на 400.
{ ID: 1, Вкус: "Шоколад", Количество: 400 }

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

Записът Strawberry в източника на данни за IceCream се създава.

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

Скрийншот на източника на данни на IceCream след Patch като формулите са оценени.

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

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

Модифициране или създаване на набор от записи (в източник на данни)

Когато използвате 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 }.

Този пример създава множество нови записи, използвайки Defaults:

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

Note

Когато използвате Patch с таблици, броят на записите във всяка таблица за промяна трябва да съвпада с броя на записите в основната таблица. В противен случай възниква грешка.

За да откриете грешки при промяна на няколко записа, използвайте IfError. IfError е предпочитаният механизъм и работи между Power Fx хостове:

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

Patch с типове колони от Dataverse

Следващите примери се прилагат конкретно за Microsoft Dataverse източници на данни. Формите на записите варират според източника на данни (например SharePoint и SQL Server имат различни формати).

Колона за избор: За да зададете колона Choice, използвайте стойността на enum директно. Този пример задава колона за избор на статус в таблица Сметки :

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

Колона за търсене: За да зададете колона Lookup, осигурете запис с първичния ключ на свързаната таблица. Този пример задава търсенето за основен контакт върху запис за акаунти :

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

Note

Тези примери с тип колони са специфични за Dataverse. Други източници на данни, като SharePoint или SQL Server, може да изискват различни форми на записи за подобни типове колони. Вижте документацията за вашия конкретен източник на данни за правилния формат.

Делегиране във формули, които използват Patch

Самата Patch функция не подлежи на делегиране , защото записва към източника на данни, вместо да го заявява. Въпреки това, предупреждения за делегиране могат да се появят във формули, които използват Patch ако частта за избор на запис (като Filter, LookUp или ForAll) включва заявка, която надвишава лимитите за делегиране на източника на данни.

Когато видите предупреждение за делегиране във формула, която включва Patch, проверете дали предупреждението се отнася за функциите за извличане на данни, а не за Patch самия себе си. За повече информация относно делегирането вижте Разбери делегирането в приложение Canvas.

Чести грешки във функцията Patch

Когато използвате функцията Patch , могат да възникнат грешки поради свързаност с източника на данни, разрешения или конфликти на данни. Използвайте IfError и IsError , за да откривате грешки и да реагирате адекватно.

  • "Мрежова грешка при използване Patch на функция": Тази грешка обикновено означава, че приложението не може да достигне до източника на данни. Чести причини включват загуба на интернет връзка, временно недостъпен източник на данни или недостатъчни разрешения за настоящия потребител. Обвийте Patch обаждането в IfError , за да предоставите смислено съобщение на потребителите.

  • "Съществуват конфликти при промени на сървъра": Тази грешка възниква, когато друг потребител или процес промени същия запис между момента, в който приложението го прочете и записва промяната. Обновете източника на данни, като извикате функцията Refresh и опитайте операцията отново.

  • Грешки при разрешения: Ако потребителят няма разрешение да създава или променя записи в източника на данни, Patch обаждането се проваля. Използвайте IfError , за да откриете грешки, свързани с разрешенията, и да насочвате потребителя.

За общи модели на обработка на грешки вижте Обработка на грешки.

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

Използвайте ключовите думи As или ThisRecord във формулата си, за да избегнете неясни контексти на оценката.

В следващия пример разгледайте първото Lookup в If твърдението. (OrderID = A[@OrderID]) се очаква да се сравнява в OrderIdLookup обхвата с колекцията OrderIdA в ForAll обхвата. В този случай вероятно искате A[@OrderId] да разрешите като локален параметър. Но е двусмислено.

Power Apps в момента интерпретира както лявата страна OrderId, така и дясната страна A[@OrderId] като поле в обхвата на Lookup. Следователно, 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"
       }
   )
    )
)

Използване на Като или 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, вижте статията Оператори .