运算符和标识符

备注

Microsoft Power Fx 是画布应用公式语言的新名称。 当我们从画布应用中提取语言,将其与其他 Microsoft Power Platform 产品集成并使其作为开放源代码提供时,这些文章还在撰写。 从 Microsoft Power Fx 概述开始,了解对此语言的介绍。

Microsoft Power Fx 中的运算符将在下文中介绍。 其中的某些运算符依赖于作者的语言。 有关详细信息,请参阅全局应用

符号 Type 语法 描述
. 属性选择器 Slider1.Value
Color.Red
从表、控件、或枚举中提取属性。 要实现向后兼容性,可以使用 !
.
与语言相关
小数分隔符 1.23 整数和小数之间的分隔符。 字符取决于语言。
( ) 括号 Filter(T, A < 10)

(1 + 2) * 3
强制执行优先顺序和较大表达式中的组子表达式
+ 算数运算符 1 + 2 加法
-   2 - 1 减法和减号
*   2 * 3 乘法
/   2 / 3 除法(另请参阅 Mod 函数)
^   2 ^ 3 求幂,相当于 Power 函数
%   20% 百分比(相当于 "* 1/100")
= 比较运算符 Price = 100 等于
>   Price > 100 大于
>=   Price >= 100 大于等于
<   Price < 100 小于
<=   Price <= 100 小于等于
<>   Price <> 100 不等于
& 字符串连接运算符 "hello" & " " & "world" 使多个字符串连续显示
&&And 逻辑运算符 Price < 100 && Slider1.Value = 20
Price < 100 And Slider1.Value = 20
逻辑关联,相当于 And 函数
||Or   Price < 100 || Slider1.Value = 20Price < 100 Or Slider1.Value = 20 逻辑或,相当于 Or 函数
!Not   !(Price < 100)Not (Price < 100) 逻辑非,相当于 Not 函数
exactin 成员运算符 Gallery1.Selected exactin SavedItems 属于集合或表
exactin   "Windows" exactin “To display windows in the Windows operating system...” 子字符串测试(区分大小写)
包含   Gallery1.Selected in SavedItems 属于集合或表
包含   "The" in "The keyboard and the monitor..." 子字符串测试(不区分大小写)
@ 消除歧义运算符 MyTable[@fieldname] 字段消除歧义
@   [@MyVariable] 全局消除歧义
,
[与语言相关]
列表分隔符 If( X < 10, "Low", "Good" )
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
分隔:
  • 函数调用中的参数
  • 记录中的字段
  • 中的记录
此字符取决于语言。
;
[与语言相关]
公式链接 Collect(T, A); Navigate(S1, "") 在行为属性中分隔函数的调用。 链接运算符取决于语言。
作为 As 运算符 AllCustomers 代表客户 覆盖库中的 ThisItemThisRecord,并记录范围函数。 As 在提供更好的具体名称时非常有用,在嵌套方案中特别重要。
自身 Self 运算符 Self.Fill 访问当前控件的属性
Parent Parent 运算符 Parent.Fill 控件容器属性的访问权限
ThisItem ThisItem 运算符 ThisItem.FirstName Gallery 或 Form 控件字段的访问权限
ThisRecord ThisItem 运算符 ThisRecord.FirstName 访问 ForAllSumWith 和其他记录范围函数内完整的记录和记录的单个字段。 可以替换为 As 运算符。

in 和 exactin 运算符

使用 inexactin 运算符查找数据源中的字符串,如集合或导入的表。 in 运算符标识匹配项(不区分大小写),而 exactin 运算符仅在大小写相同时标识匹配项。 下面是一个示例:

  1. 创建或导入一个名为清单的集合,并在库中显示它,如在库中显示图像和文本所述的第一个过程。

  2. 将库的 Items 属性设置为以下公式:
    Filter(Inventory, "E" in ProductName)

    库显示除 Callisto 以外的所有产品,因为该产品的名称是唯一不包含您所指定的字母的产品。

  3. 将库的 Items 属性更改为以下公式:
    Filter(Inventory, "E" exactin ProductName)

    库仅显示 Europa,因为只有它的名称中包含您所指定的字母。

ThisItem、ThisRecord 和 As 运算符

一些控件和函数也将公式应用于单独的表记录。 若要引用公式中的单个记录,请使用以下运算符之一:

运算符 适用范围 描述
ThisItem Gallery 控件
Edit form 控件
Display form 控件
Gallery 或 Form 控件中当前记录的默认名称。
ThisRecord ForAllFilterWithSum 和其他记录范围函数 ForAll 和其他记录范围函数中当前记录的默认名称。
Asname Gallery 控件
ForAllFilterWithSum 和其他记录范围函数
定义当前记录的名称,并替换默认的 ThisItemThisRecord。 使用 As 让公式在进行嵌套时更容易理解和解决不明确之处。

ThisItem 运算符

例如,在下面的控件中,属性设置为员工数据源(如 Northwind Traders 示例随附的员工实体):

Employees

库中显示的员工。

库中的第一项是为每位员工复制的模板。 在此模板中,图片的公式使用 ThisItem 引用当前项:

ThisItem.Picture

员工图片的公式。

同样,姓名的公式也使用 ThisItem

ThisItem.'First Name' & " " & ThisItem.'Last Name'

员工名字和姓氏的公式。

ThisRecord 运算符

ThisRecord 在采用记录范围的函数中使用。 例如,可以使用 Filter 函数和库的 Items 属性仅显示以 M 开头的名字:

Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )

使用 ThisRecord 根据姓名筛选员工。

ThisRecord 是可选的,其通过直接使用字段指明,例如,在此情况下,可能编写了:

Filter( Employees, StartsWith( 'First Name', "M" ) )

虽然 ThisRecord 是可选的,但是如果使用,可以让公式更容易理解,并且在字段名称也可能是关系名称的明确情况下,可能是必需的。 ThisRecord 是可选的,但是 ThisItem 始终是必需的。

ThisRecordPatchCollect 及其他记录范围函数可用于引用整个记录。 例如,以下公式将所有非在职雇员的状态设置为在职:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees, 
              Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )

As 运算符

As 运算符用于为库或记录范围函数中的记录名称,并覆盖默认的 ThisItemThisRecord。 为记录命令可以让公式更容易理解,在嵌套情况下,可能需要执行此操作才能访问其他范围中的记录。

例如,可以修改库的 Items 属性,以便使用 As 确定我们在处理员工:

Employees As Employee

员工的库,使用了 As 运算符。

将调整图片和名称的公式以将此名称用于当前记录:

Employee.Picture

员工的图片,该员工的姓名是通过 As 运算符设置的。

Employee.'First Name' & " " & Employee.'Last Name'

员工的名字和姓名,该员工的姓名是通过 As 运算符设置的。

As 也可以与记录范围函数一起用于替代默认名称 ThisRecord。 可以将此应用于前一个示例来明确正在处理的记录:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees As Employee, 
              Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )

在嵌套库和记录范围函数时,ThisItemThisRecord 始终引用最内的范围,从而导致外部范围的记录不可用。 可使用 As 通过为每个记录范围提供唯一名称来激活所有记录范围。

例如,下面的公式通过嵌套两个 ForAll 函数生成一个文本字符串形式的棋盘格:

Concat( 
    ForAll( Sequence(8) As Rank,
        Concat( 
            ForAll( Sequence(8) As File, 
                    If( Mod(Rank.Value + File.Value, 2) = 1, " X ", " . " ) 
            ),
            Value 
        ) & Char(10) 
    ), 
    Value 
)

如果将 Label 控件的 Text 属性设置为此公式,将显示:

Label 控件中显示的棋盘文本。

下面我们来分析发生的情况:

  • 我们首先迭代 Sequence 函数中 8 个编号记录的未命名表。 此循环针对板的每一行,这通常称为 Rank,所以我们为其提供此名称。
  • 我们为每行迭代一个未命名的 8 列表,并提供通用名称 File
  • 如果 Rank.Value + File.Value 为奇数,则为方块提供一个 X,否则为其提供一个点。 公式的这部分同时引用两个 ForAll 循环,这是使用 As 运算符实现的。
  • Concat 将使用两次,第一次用于组件列,然后用于组件行,并引发 Char(10) 以创建一个新行。

不使用 ForAll 函数而是使用 Gallery 控件也可以达到类似效果。 首先为 Rank 使用垂直库。 此 Gallery 控件将采用以下类型的 Items 公式:

Sequence(8) as Rank

提供 Rank 迭代的外部库的图示。

在此库中,我们将把要为每个 Rank 复制的 File 的水平库替换为以下对象的 Items 属性:

Sequence(8) as File

提供 File 迭代的内部库的图示。

最后,我们将在此库内添加一个 Label 控件,将为每个 File 和每个 Rank 复制该控件。 我们将把其大小设置为填满整个控件,然后设置 Fill 属性,以便使用此公式提供颜色:

If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )

这两个库内的 Label 控件,用于为棋盘提供备用颜色。

Self 和 Parent 运算符

有三种方法可以在公式中引用控件及其属性:

方法 描述
通过控件名称 任何控件都可由应用内任何位置的名称引用。

例如,Label1.Fill 表示名称为 Label1 的控件的 fill 属性。
Self 运算符 在编写公式时,引用同一控件的另一个属性通常很方便。 不使用名称的绝对引用,使用对 oneself 的相对引用更加容易和便利。 Self 运算符使您可以轻松访问当前控件。

例如,Self.Fill 表示当前控件的填充颜色。
Parent 运算符 有些控件托管其他控件,如 ScreenGallery 控件。 控件内控件的托管控件称为 parent。 与 Self 运算符一样,Parent 运算符为 Container 控件提供简单的相对引用。

例如,Parent.Fill 引用作为当前控件容器的控件的 fill 属性。

SelfParent 是运算符,不是控件本身的属性。 不支持引用 Parent.ParentSelf.ParentParent.Self

标识符名称

变量、数据源、列和其他对象的名称可以包含任何 Unicode

使用单引号将包含空格或其他特殊字符的名称括起来。
同时使用两个单引号表示名称中的一个单引号。 不包含特殊字符的名称不需要单引号。

以下是您可能在表中遇到的一些示例列名称,以及它们在公式中的表示方式:

数据库中的列名称 公式中的列引用
SimpleName SimpleName
NameWith123Numbers NameWith123Numbers
带有空格的名称 'Name with spaces'
带有“双”引号的名称 'Name with "double" quotes'
带有“单”引号的名称 'Name with ''single'' quotes'
带有 @ at 符号的名称 'Name with an @ at sign'

双引号用于指定文本字符串

显示名称和逻辑名称

某些数据源(如 SharePoint 和 Microsoft Dataverse)使用两个不同的名称来引用同一个数据表或数据列:

  • 逻辑名称 - 确保唯一的名称,创建后不会更改,通常不允许使用空格或其他特殊字符,并且不会本地化为其他语言。 结果,名称很难懂。 这些名称由专业开发人员使用。 例如,cra3a_customfield。 此名称也可以称为架构名称或就称为名称

  • 显示名称 - 用户友好的名称,供最终用户查看。 此名称可能不是唯一的,可能会随时间变化,可能包含空格和任何 Unicode 字符,并且可能本地化为不同的语言。 显示名称与上面的示例对应,可能是 Custom Field,其中的单词之间有空格。

因为显示名称很容易理解,因此 Power Fx 建议选择显示名称,而不建议使用逻辑名称。 虽然不建议使用逻辑名称,但是如果间接键入,还是可以使用。

例如,假设您已向 Dataverse 中的实体添加了 Custom Field。 系统将为您分配一个逻辑名称,您只能在创建字段时进行修改。 结果将类似于:

添加了“自定义字段”的“客户”实体,显示名称为“Custom Field”,逻辑名称为“cr5e3_customfield”。

在编写对“客户”字段的引用时,会建议使用 'Custom Field',因为这是显示名称。 必须使用单引号,因为此名称中有空格:

显示“客户”的字段名称建议的 Studio 公式栏,突出显示了显示名称“Custom Field”。

选择建议后,公式栏中将显示 'Custom Field',并会检索数据:

显示为字段使用显示名称“Custom Field”的 Studio 公式栏。

虽然不建议使用,但我们也可以为此字段中使用逻辑名称。 这将会检索到相同的数据。 无需使用单引号,因为此名称不包含空格或特殊字符:

显示为字段使用逻辑名称 cr5e3_customfield 的 Studio 公式栏。

在后台,在公式中看到的显示名称和基础逻辑名称之间会保持映射。 由于必须使用逻辑名与数据源进行交互,因此,此映射用于自动将当前显示名转换为逻辑名称,这就是在网络流量中看到的名称。 此映射也用于转换回逻辑名称,以便切换为新显示名称,例如,在显示名称改变或其他语言的开发者编辑应用时。

备注

在环境之间移动应用时,不会翻译逻辑名称。 对于 Dataverse 系统实体和字段名称,这应该不是问题,因为逻辑名称在环境之间是一致的。 但是任何自定义字段,如此示例上面的 cra3a_customfield,可能都有不同的环境前缀(本例中为 cra3a)。 首选显示名称,因为它们可以与新环境中的显示名称匹配。

名称消除歧义

由于显示名称不是唯一的,因此相同的显示名称可能在同一实体中出现多次。 发生这种情况时,对于一个或多个冲突的名称,逻辑名称将添加到括号中的显示名称的末尾。 在以上示例的基础上,如果存在另一个具有相同显示名称 Custom Field,逻辑名称为 cra3a_customfieldalt 的字段,建议会显示:

显示使用逻辑名称 cr5e3_customfieldalt 来消除两个版本“Custom Field”的歧义的 Studio 公式栏。

在其他发生名称冲突的情况下,如实体、选项集和其他 Dataverse 项的名称,会添加消除名称歧义字符串。

消除歧义运算符

某些函数创建记录范围,用于在处理每条记录时访问表的字段,如 FilterAddColumnsSum。 使用记录作用域添加的字段名称将替代应用中来自其他位置的同一名称。 在此情况下,仍可以使用 @ 消除歧义运算符访问来自记录范围以外的值:

  • 若要访问来自嵌套记录作用域的值,请使用 @ 运算符,其中所操作的表名称使用该模式:
    Table[@FieldName]
  • 若要访问全局值,如数据源、集合和上下文变量,请使用模式 [@ObjectName](无需指派表)。

有关详细信息和示例,请参阅记录范围