Поделиться через


Patch функция

Применимо к: Приложения На основе холста Copilot Studio Desktop поддерживают функции Power Platform CLI Dataverse, управляемые моделью

Эта функция изменяет или создает одну или несколько записей в источнике данных или объединяет записи вне этого источника.

Используйте функцию Patch для изменения записей в сложных ситуациях, таких как при выполнении обновлений, которые не требуют взаимодействия с пользователем или используют формы, охватывающие несколько экранов.

Чтобы упростить обновление записей в источнике данных для простых изменений, используйте вместо этого элемент управления Edit form. При добавлении элемента управления Edit form пользователь должен заполнить форму, а затем сохранить изменения в источнике данных. Дополнительные сведения см. статью Общие сведения о формах данных.

Просмотрите это видео, чтобы узнать, как использовать функцию Patch :

Обзор

Используйте функцию Patch для изменения одной или нескольких записей источника данных. Значения определенных полей изменяются, не затрагивая другие свойства. Например, следующая формула изменяет номер телефона клиента с именем Contoso:

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

Используйте Patchфункцию Defaults для создания записей. Используйте это поведение, чтобы настроить единый экран для создания и изменения записей. Например, следующая формула создает запись для клиента с именем Contoso:

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

Замечание

При исправлении коллекции с использованием записи из источника данных со значениями по умолчанию операция исправления обновляет коллекцию как указанными значениями исправлений, так и значениями по умолчанию из источника данных. DataSource инструкции исправления и DataSource функции Defaults должны соответствовать, чтобы создать новую запись.

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

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

Описание

Изменение или создание записи в источнике данных

Чтобы использовать эту функцию с источником данных, укажите источник данных, а затем укажите базовую запись.

  • Чтобы изменить запись, базовая запись должна быть частью источника данных. Базовая запись, возможно, прошла через свойство 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 возвращает объединенную запись и не изменяет свои аргументы или записи в каких-либо источниках данных.

Синтаксис

Изменение или создание записи в источнике данных

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

  • DataSource — обязательный аргумент. Это источник данных, содержащий запись, которую необходимо изменить. Или же тот, который будет содержать запись, которую вы хотите создать.
  • BaseRecord – обязателен. Это запись, которую необходимо изменить или создать. Если запись является частью источника данных, она будет найдена и изменена. Если используется результат функции Defaults, тогда запись создается. DataSource инструкции исправления и DataSource функции Defaults должны соответствовать, чтобы создать новую запись.
  • ChangeRecords – Обязательно. Одна или несколько записей, содержащих свойства для изменения в BaseRecord. Изменения записей обрабатываются от начала и до конца списка аргументов. При этом последние значения свойства переопределяют ранее созданные.

Изменение или создание набора записей в источнике данных

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

  • DataSource — обязательный аргумент. Это источник данных, содержащий запись, которую необходимо изменить. Или же тот, который будет содержать запись, которую вы хотите создать.
  • BaseRecordTable – Обязательно. Таблица записей, которые нужно изменить или создать. Если запись является частью источника данных, она будет найдена и изменена. Если используется результат функции Defaults, тогда запись создается. DataSource инструкции исправления и DataSource функции Defaults должны соответствовать, чтобы создать новую запись.
  • ChangeRecordTables – Обязательно. Одна или несколько таблиц записей, содержащих свойства, которые необходимо изменить, для каждой записи в BaseRecordTable. Изменения записей обрабатываются от начала и до конца списка аргументов. При этом последние значения свойства переопределяют ранее созданные.

Слияние записей

Patch( Record1, Record2 [, ...] )

  • Записи - Обязательно. Не менее двух записей, которые вы хотите объединить. Записи обрабатываются от начала и до конца списка аргументов. При этом последние значения свойства переопределяют ранее созданные.

Примеры

Изменение или создание записи (в источнике данных)

Из примеров ниже вы узнаете, как изменить или создать запись в источнике данных с именем IceCream. Этот источник содержит данные из таблицы, а также автоматически созданные значения, представленные в столбцеID.

Пример icecream.

Формула Описание Result
Patch( IceCream,
LookUp( IceCream, Flavor = "Шоколад"), { Количество: 400 } )
Изменяет запись в источнике данных IceCream.
  • Столбец записи ID, которую необходимо изменить, содержит значение 1. (Это значение задано для записи Chocolate.)
  • Значение в столбце Quantity изменится на 400.
{ ИДЕНТИФИКАТОР: 1, Вкус: "Шоколад", Количество: 400 }

Запись Chocolate в источнике данных IceCream была изменена.
Patch( IceCream, Defaults( IceCream), { Вкус: "Клубника" } ) Функция создает запись в источнике данных IceCream.
  • Столбец ID содержит значение 3, которое источник данных создает автоматически.
  • Столбец Quantity содержит значение 0, которое является значением по умолчанию для этого столбца в источнике данных IceCream в соответствии с функцией Defaults.
  • Столбец Flavor содержит значение Strawberry.
{ идентификатор: 3, вкус: "Клубника", Количество: 0 }

В источнике данных IceCream была создана запись Strawberry.

После вычисления формул выше источник данных получил следующие значения:

Пример icecream после.

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

Формула Описание Result
Patch( { Имя: "Джеймс", Оценка: 90 }, { Имя: "Джим", Передано: true } ) Функция объединяет две записи вне источника данных.
  • Значения в столбце Name для каждой записи не совпадают. Результат содержит значение (Jim) в записи в конце списка аргументов вместо значения (James) в начале этого списка.
  • Первая запись содержит столбец (Score), который отсутствует во второй записи. Результат содержит этот столбец со значением (90).
  • Вторая запись содержит столбец (Passed), который отсутствует в первой записи. Результат содержит этот столбец со значением (true).
{ Имя: "Джим", оценка: 90, передано: 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, см. статью Операторы.