Работа с нетипизированными и динамическими объектами

При работе с действиями в Power Apps, для некоторых действий могут встречаться нетипизированные возвращаемые значения или значения входных данных. Раньше, в Power Apps игнорировались поля для нетипизированных или динамических входных данных, и они не были видны в выражениях PowerFX. Теперь вы можете работать непосредственно с этими полями. Раньше, когда возвращаемый тип был нетипизированным, Power Apps возвращал логическое значение. Теперь вместо этого он возвращает нетипизированный объект.

Примечание

Предположим, ваши выражения Power Fx зависят от логического значения, возвращаемого из этих функций. В этом случае вам придется переписать формулу и явно привести нетипизированный объект к логическому значению. Некоторые функции, такие как IfError, еще не полностью поддерживают нетипизированные объекты. Если ваше выражение содержит такую функцию, см. примечание в конце этой статьи для обходных путей.

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

Некоторые действия требуют использования нетипизированного объекта в качестве значения параметра. Если у вас есть запись Power Fx, вы можете преобразовать ее в нетипизированный объект, сделав ее пригодной для передачи в действие.

В приведенном ниже примере для действия слияния, доступного в таблице Dataverse Учетная запись требуется несколько нетипизированных аргументов. Для подготовки мы определим три переменные для хранения объектов TargetObject, SubordinateObject и UpdateContextObject. Мы начнем с назначения текстовой строке Microsoft.Dynamics.CRM.account переменной, которая будет повторно использоваться на протяжении всего примера.

Set (OdataType, “Microsoft.Dynamics.CRM.account”);

Затем для TargetObject назначается запись Power Fx со свойствами name, accountid и @odata.type. Аналогично назначаем записи Power Fx для объектов Subordinate и UpdateContext.

Set (TargetObject, {name: "Test 2", accountid: "145dc2ba-85a2-ed11-aado-0022482d76a5", '@odata.type': OdataType});
Set (SubordinateObject, {name: FirstRecord.’Account name’, accountid: FirstRecord.Account, ‘@odata.type’ : OdataType });
Set (UpdateContextObject, {telephone1: FirstRecord.’Main Phone’, address1_city: FirstRecord.’Address 1 : City’, ‘@odata.type’ : OdataType }); 

Далее мы создадим еще три переменные для хранения нетипизированных записей после преобразования: TargetUntypedObject, SubordinateUntypedObject и UpdateContextUntypedObject. Чтобы выполнить преобразование, мы будем использовать функцию ParseJSON(JSON()) для исходных переменных. Это действие преобразует записи Power Fx в нетипизированные объекты.

Set (TargetUntypedObject, ParseJSON(JSON(TargetObject)));
Set (SubordinateUntypedObject, ParseJSON(JSON(SubordinateObject)));
Set (UpdateContextUntypedObject, ParseJSON(JSON(UpdateContextObject)));

Наконец, мы вызываем действие слияния, передавая необходимые параметры, в том числе для нетипизированных, так и для типизированных объектов:

Environment.Merge({Target: TargetUntypedObject, Subordinate: SubordinateUntypedObject, UpdateContent: UpdateContextUntypedObject, PerformParentingChecks: false  });

Использование нетипизированного объекта, возвращаемого через действие

Если соединитель на основе Действия возвращает объект, к его свойствам можно получить доступ напрямую, независимо от того, назначен ли им тип. Однако, если вы собираетесь использовать свойство для определенной цели в Power Apps, например, для маркировки, вам нужно сначала выполнить его приведение.

В следующем примере функция httpRequest возвращает нетипизированный объект, который ранее был приведен как логическое значение.

Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));

Одним из свойств в ответе является displayName. К нему можно получить доступ и выполнить его приведение с помощью выражения Power Fx следующим образом:

Text(response.displayName)

Выполните приведение к объекту Текст , чтобы использовать его в элементе управления "Подпись Power Apps".

Работа с полями Dynamics

Ответы для действий теперь захватывают динамические входные данные, и вы можете использовать метод, описанный выше, для доступа к этим свойствам. Дополнительно возможна работа с полями динамических входных данных.

Рассмотрим действие 'GetMessageDetails' в Microsoft Teams , имеющее параметр динамических входных данных текста. Ранее этот параметр нельзя было просматривать или указывать. После недавнего обновления вы можете установить переменную с именем 'body' с соответствующей структурой записи Power Fx.

Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}}));

Затем мы можем вызвать действие GetMessageDetails и назначить ответ переменной teamResponse.

Set (teamsResponse, MicrosoftTeams.GetMessageDetails ( 1661365068558, “channel”, body ));

Преобразование формул, возвращающих нетипизированные объекты, которые ранее возвращали логическое значение.

Power Fx принимает ограниченное количество нетипизированных объектов, поэтому для вашей формулы может потребоваться явное преобразование. В частности, если ваша формула зависит от логического ответа, вам нужно будет выполнить преобразование. Если вам потребуется узнать, есть ли ошибка, вы можете использовать функцию IsError:

If(
  IsError(Office365Outlook.CalendarDeleteItemV2("Calendar", 1)),
  Notify("An Outlook appointment could not be found or could not be deleted")
)

Чтобы получить доступ к информации об ошибке, которая доступна только через IfError, вы должны преобразовать нетипизированный объект в допустимый тип с помощью функции преобразования, такой как "Логическое значение", "Текст" или "Значение". Эти функции будут выдавать ошибку, если они заданы. Это показано в следующем примере:

With({result: Office365Outlook.CalendarDeleteItemV2("Calendar", 1)},
If( IsError(result),
  IfError(
    Boolean(result),  // any conversion function would do, such as Text, Value, …
    Notify("An Outlook appointment could not be found or could not be deleted: " & FirstError.Message)
) ) )