| 功能 | 适用于 |
|---|---|
| AsType |
|
| IsType |
|
检查记录引用是否是特定的表类型(IsType)并将引用视为该类型(AsType)。
备注
PAC CLI pac power-fx 命令 不支持 IsType。
Description
和AsTypeIsType函数可用于将记录引用(例如 Dataverse 中的多态查找)和动态值转换为可以直接使用的类型化值。
记录引用
阅读了解记录引用和多态查找,了解更广泛的介绍和更多详细信息。
查找字段通常指特定表中的记录。 由于表格类型已经确定,因此可以使用简单的点符号访问查找的字段。 例如,First( Accounts ).'Primary Contact'.'Full Name' 从客户表到达联系人表中的主要联系人记录,提取全名字段。
Microsoft Dataverse 还支持多态查找字段,它可以引用一组表中的记录,如这些示例中所示。
| 查找字段 | 可以引用 |
|---|---|
| 所有者 | 用户或团队 |
| 客户 | 客户或联系人 |
| 关于 | 客户、联系人、知识文章等。 |
在区域应用公式中,使用记录引用处理多态查找。 由于记录引用可以引用不同的表,因此在编写公式时,无法知道哪些字段在运行时可用。 不能使用 Record.Field 表示法。 这些公式需要适应应用在运行时遇到的记录。
该 IsType 函数检查记录引用是否引用特定表类型。 函数返回布尔值 TRUE 或 FALSE。
该 AsType 函数将记录引用视为特定的表类型,也称为 强制转换。 将结果用作表的记录,并使用 Record.Field 表示法访问该记录的所有字段。 如果引用不是特定类型,则会发生错误。
将这些函数一起使用,首先检查记录的表类型,然后将其视为该类型的记录,以便字段可用:
If( IsType( First( Accounts ).Owner, Users ),
AsType( First( Accounts ).Owner, Users ).'Full Name',
AsType( First( Accounts ).Owner, Teams ).'Team Name'
)
仅当访问记录引用的字段时,才需要这些函数。 例如,在 Filter 函数中使用记录引用,而不 IsType 使用或 AsType:
Filter( Accounts, Owner = First( Users ) )
同样,可以将记录引用与 Patch 函数一起使用:
Patch( Accounts, First( Accounts ), { Owner: First( Teams ) } )
在记录上下文中使用这些函数(例如 在库 或 编辑窗体 控件中),可能需要 全局消除歧义运算符 来引用表类型。 例如,此公式适用于显示 公司名称 是 客户 查找联系人列表的库:
If( IsType( ThisItem.'Company Name', Accounts ),
AsType( ThisItem.'Company Name', Accounts ).'Account Name',
AsType( ThisItem.'Company Name', Contacts ).'Full Name'
)
对于这两个函数,请使用连接到表的数据源的名称指定类型。 若要使公式正常工作,请将数据源添加到应用中,用于检查或强制转换的任何类型。 例如,如果要使用该IsType表和AsType所有者查找和记录,请将“用户”表添加为数据源。 仅添加在应用中使用的数据源;无需添加查找可以引用的所有表。
如果记录引用为 空, IsType 则返回 FALSE,并 AsType 返回 空白。 空白记录的所有字段也为空白。
动态值
重要提示
- 使用AsType和配合IsType动态值是一项实验性功能。
- 实验性功能不适用于生产用途,可能不完整。 这些功能在正式发布之前已经可用,以便您可以及早使用并提供反馈。 详细信息:了解画布应用中的试验、预览和停用功能
- 本文介绍的行为仅在用户定义类型试验功能在设置 > 即将推出的功能 > 试验打开(默认关闭)时可用。
- 您的反馈对我们很重要。 请在 Power Apps 试验功能社区论坛中告诉我们您的想法。
需要将 Web API 或 [ParseJSON 函数]中的动态值转换为特定类型化值,然后才能在 Power Fx 中使用它。 以下是一些选项。
- 在使用该字段时隐式键入字段。 例如,如果将某个对象与运算符一起使用
+,则对象将转换为数字(如果可以转换为数字)。 此选项可能会导致意外的转换,并且无法整体转换记录和表。 - 使用 Decimal、Text、DateTime、GUID 及其他类型构造函数分别明确键入每个字段。 此选项对公式最具侵入性,因为你需要单独执行每个字段。
- 使用 ParseJSON 函数的第二个参数明确键入 JSON。 此选项非常简单,无需使用 动态 值。
- 使用AsType函数显式键入动态值。 还可以在尝试使用 IsType 函数进行转换之前检查类型。
语法
AsType( RecordReference、 TableType )
- RecordReference - 必需。 记录引用,通常是引用多个表中的记录的查阅字段。
- TableType - 必需。 要将记录强制转换为的特定表。
AsType(DynamicValue,TypeSpecification)
- DynamicValue - 必需。 ParseJSON 函数或 API 调用中的动态值。
- TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。
IsType( RecordReference、 TableType )
- RecordReference - 必需。 一个记录引用,通常是一个查找字段,可以引用多个表中任何一个表的记录。
- TableType - 必需。 要测试的特定表。
IsType(DynamicValue,TypeSpecification)
- DynamicValue - 必需。 ParseJSON 函数或 API 调用中的动态值。
- TypeSpecification - 必填。 使用 Type 函数定义的类型名称或类型规范。
示例
记录引用
了解记录引用和多态查找中包含大量示例。
创建适用于平板电脑的空白画布应用。
在左窗格中,选择“数据>”,然后添加“帐户”和“联系人”表。
在左窗格中,选择“ + 插入” >布局>空白垂直库。
选择连接到数据,然后选择联系人作为数据源。
将库布局设置为 标题和副标题。
在数据窗格中,打开 Title1 列表,然后选择命名。
选择 Subtitle1 Label 控件。
将 Subtitle1 的 Text 属性设置为以下公式:
If( IsBlank( ThisItem.'Company Name' ), "--", IsType( ThisItem.'Company Name', Accounts ), "Account: " & AsType( ThisItem.'Company Name', Accounts ).'Account Name', "Contact: " & AsType( ThisItem.'Company Name', Contacts ).'Full Name' )
库中的副标题显示以下值:
- 如果 'Company Name' 为空白,则为 "--"。
- “帐户:”和“帐户名称”表中的“帐户名称”字段(如果公司名称字段引用帐户)。
- “联系人:”和联系人表中的全名字段(如果公司名称字段引用联系人)。
结果可能会有所不同,因为可以修改示例数据以显示更多类型的结果。
动态值
以下示例演示了 ParseJSONAsTypeIsType 和 Pac CLI Power Fx REPL 以各种方式解释的简单 JSON 记录。
在此第一个示例中, 没有向 ParseJSON 提供类型信息,因此它将返回动态值。
>> Set( rec, ParseJSON( "{""a"":1}" ) )
rec: <Dynamic: Use Value, Text, Boolean, or other functions to establish the type>
在数字上下文中使用时,该字段会隐式转换为数字。
>> 1 + rec.a
2
作为另一种选择,本例通过 ParseJSON 的第二个参数显式地将记录转换为类型化的 Power Fx 记录。
>> ParseJSON( "{""a"":1}", Type( {a: Number} ) )
{a:1}
另一种替代方法是,此示例使用 AsType显式将记录转换为类型化的 Power Fx 记录。
>> AsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
{a:1}
最后,如果不确定,此示例在将类型与 IsType 函数转换之前进行测试。
>> IsType( ParseJSON( "{""a"":1}" ), Type( {a: Number} ) )
true