Функция Patch в Power Apps

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

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

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

Обзор

Используйте функцию 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" } )

Описание

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

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

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

При обновлении источника данных может возникнуть одна или несколько проблем. Используйте функцию 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. Этот источник содержит данные из таблицы, а также автоматически созданные значения, представленные в столбце ID.

Пример icecream

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

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

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

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

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

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

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