当您在 Power Apps 中使用操作时,可能会遇到某些操作的动态返回值或输入值。 此前,Power Apps 会忽略动态输入字段,且这些字段在 Power Fx 表达式中不可见。 现在,您可以直接处理这些字段。 此前,当返回类型为动态时,Power Apps 会返回布尔值。 现在,它会返回动态值。
备注
如果您的 Power Fx 表达式依赖于这些函数的布尔返回值,请重写公式并显式将动态值转换为布尔值。 某些函数(如“IfError”)尚不完全支持动态值。 如果您的表达式使用这些函数之一,请参阅本文末尾的注释以了解解决方法。
将动态值作为参数传递
某些操作需要使用动态值作为参数。 如果您有一个 Power Fx 记录,请将其转换为动态值以传递给操作。
在下面的示例中,Dataverse 帐户表上的合并操作需要多个动态参数。 若要准备,请定义三个变量来保存 TargetObject、SubordinateObject 和 UpdateContextObject。 首先,将文本字符串 Microsoft.Dynamics.CRM.account 赋值给一个变量,并在整个示例中重复使用该变量。
Set (OdataType, “Microsoft.Dynamics.CRM.account”);
然后将 TargetObject 赋值为包含 name、accountid 和 @odata.type 属性的 Power Fx 记录。 同样,将 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 });
接下来,再创建三个变量来存储转换后的动态记录:TargetDynamicValue、SubordinateDynamicValue 和 UpdateContextDynamicValue。 要进行转换,请在原始变量上使用 ParseJSON(JSON())函数。 此操作将 Power Fx 记录转换为动态值。
Set (TargetDynamicValue, ParseJSON(JSON(TargetObject)));
Set (SubordinateDynamicValue, ParseJSON(JSON(SubordinateObject)));
Set (UpdateContextDynamicValue, ParseJSON(JSON(UpdateContextObject)));
最后,调用合并操作并传入动态类型和特定类型的必要参数:
Environment.Merge({Target: TargetDynamicValue, Subordinate: SubordinateDynamicValue, UpdateContent: UpdateContextDynamicValue, PerformParentingChecks: false });
使用通过操作返回的动态值
如果基于操作的连接器返回对象,即使其属性没有类型,也可直接访问其属性。 但如果您想在 Power Apps 中将属性用于特定目的(如标记),请先进行类型转换。
在此示例中,httpRequest
函数返回的动态值已转换为布尔类型。
Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));
响应中的一个属性是 displayName。 可以使用如下所示的 Power Fx 表达式来访问和转换它:
Text(response.displayName)
转换为对象文本以在 Power Apps 标签控件中使用它。
使用 Dynamics 字段
操作回复现在捕获动态输出,您可以使用上述方法来访问这些属性。 您还可以使用动态输入字段。
考虑 Microsoft Teams 中的 GetMessageDetails
操作,其具有动态输入 body
参数。 以前,您无法查看或指定此参数。 随着最近的更新,请将名为 body
的变量设置为相应的 Power Fx 记录结构。
Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}})));
然后,我们可以调用 GetMessageDetails 操作并将响应分配给 teamsResponse 变量。
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 独占可用的错误信息,必须使用转换函数(如 Boolean、Text 或 Value)将动态值转换为特定类型。 如果给定这些函数,它们将产生错误。 以下示例介绍了这个情况:
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)
) ) )