运算符和标识符
备注
Microsoft Power Fx 是画布应用公式语言的新名称。 当我们从画布应用中提取语言,将其与其他 Microsoft Power Platform 产品集成并使其作为开放源代码提供时,这些文章还在撰写。 从 Microsoft Power Fx 概述开始,了解对此语言的介绍。
Microsoft Power Fx 中的运算符将在下文中介绍。 其中的某些运算符依赖于作者的语言。 有关详细信息,请参阅全局应用。
符号 | Type | 语法 | 描述 |
---|---|---|---|
. | 属性选择器 | Slider1.值 Color.Red |
从表、控件、或枚举中提取属性。 要实现向后兼容性,可以使用 !。 |
. 语言依赖 |
小数分隔符 | 1.23 | 整数和小数之间的分隔符。 字符取决于语言。 |
( ) | 括号 | 过滤器(T,A < 10) (1 + 2) * 3 |
强制执行优先顺序和较大表达式中的组子表达式 |
+ | 算数运算符 | 1 + 2 | 加法 |
- | 2 - 1 | 减法和减号 | |
* | 2 * 3 | 乘法 | |
/ | 2 / 3 | 除法(另请参阅 Mod 函数) | |
^ | 2 ^ 3 | 求幂,相当于 Power 函数 | |
% | 20% | 百分比(相当于 "* 1/100") | |
= | 比较运算符 | 价格 = 100 | 等于 |
> | 价格 > 100 | 大于 | |
>= | 价格 > = 100 | 大于等于 | |
< | 价格 < 100 | 小于 | |
<= | 价格 < = 100 | 小于等于 | |
<> | 价格 <> 100 | 不等于 | |
& | 字符串连接运算符 | “你好”&“”&“世界” | 使多个字符串连续显示 |
&&或 和 | 逻辑运算符 | 价格 < :100 & Slider1.值 = 20 或 Price < 100 And Slider1.Value = 20 |
逻辑关联,相当于 And 函数 |
|| 或 或 | 价格 < 100 ||Slider1.Value = 20 或 Price < 100 或 Slider1.Value = 20 | 逻辑或,相当于 Or 函数 | |
! 或 Not | !(价格 < 100) 或不 (价格 < 100) | 逻辑非,相当于 Not 函数 | |
精确蛋白 | 成员资格运算符 | Gallery1.选定的精确 SavedItems | 属于集合或表 |
精确蛋白 | “Windows”exactin“要在 Windows 操作系统中显示窗口...” | 子字符串测试(区分大小写) | |
在 | Gallery1.在 SavedItems 中选择 | 属于集合或表 | |
在 | “键盘和显示器...”中的“The” | 子字符串测试(不区分大小写) | |
@ | 消歧义操作员 | 我的表[@fieldname] | 字段消除歧义 |
@ | [@MyVariable] | 全局消除歧义 | |
, [与语言相关] |
列表分隔符 | if(x < 10,“低”,“好”) { X:12,Y:32 } [ 1, 2, 3 ] |
分隔: 此字符取决于语言。 |
; [与语言相关] |
公式链接 | 收集(T,A);导航(S1,“”) | 在行为属性中分隔函数的调用。 链接运算符取决于语言。 |
如 | 作为操作员 | AllCustomers 作为客户 | 覆盖库中的 ThisItem 和 ThisRecord,并记录范围函数。 As 对于提供更好的特定名称非常有用,并且在嵌套方案中尤其重要。 |
自我 | 自操作员 | Self.Fill 自我填充 | 访问当前控件的属性 |
父 | 父操作员 | 父级填充 | 控件容器属性的访问权限 |
ThisItem(此项) | ThisItem 操作员 | ThisItem.FirstName | Gallery 或 Form 控件字段的访问权限 |
thisrecord(此记录) | ThisItem 操作员 | ThisRecord.FirstName | 访问 ForAll、Sum、With 和其他记录范围函数内完整的记录和记录的单个字段。 可以替换为 As 运算符。 |
in 和 exactin 运算符
使用 in 和 exactin 运算符查找数据源中的字符串,如集合或导入的表。 in 运算符标识匹配项(不区分大小写),而 exactin 运算符仅在大小写相同时标识匹配项。 下面是一个示例:
创建或导入一个名为清单的集合,并在库中显示它,如在库中显示图像和文本所述的第一个过程。
将库的 Items 属性设置为以下公式:
Filter(Inventory, "E" in ProductName)库显示除 Callisto 以外的所有产品,因为该产品的名称是唯一不包含您所指定的字母的产品。
将库的 Items 属性更改为以下公式:
筛选条件(Inventory,“E”exactin ProductName)库仅显示 Europa,因为只有它的名称中包含您所指定的字母。
ThisItem、ThisRecord 和 As 运算符
一些控件和函数也将公式应用于单独的表记录。 若要引用公式中的单个记录,请使用以下运算符之一:
运算符 | 适用范围 | 描述 |
---|---|---|
ThisItem(此项) | Gallery 控件 编辑表单 控件 显示表单 控件 |
Gallery 或 Form 控件中当前记录的默认名称。 |
thisrecord(此记录) | ForAll、 Filter、 With、 Sum 等 记录范围 函数 | ForAll 和其他记录范围函数中当前记录的默认名称。 |
作为名称 | Gallery 控件 ForAll、 Filter、 With、 Sum 等记录范围函数 |
定义当前记录的名称,并替换默认的 ThisItem 或 ThisRecord。 使用 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 是可选的,并且通过直接使用字段来隐含,例如,在这种情况下,我们可以编写:
Filter( Employees, StartsWith( 'First Name', "M" ) )
虽然 ThisRecord 是可选的,但是如果使用,可以让公式更容易理解,并且在字段名称也可能是关系名称的明确情况下,可能是必需的。 ThisRecord 是可选的,而 ThisItem 始终是必需的。
ThisRecord 和 Patch、Collect 及其他记录范围函数可用于引用整个记录。 例如,以下公式将所有非在职雇员的状态设置为在职:
With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
ForAll( InactiveEmployees,
Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )
As 运算符
As 运算符用于为库或记录范围函数中的记录名称,并覆盖默认的 ThisItem 或 ThisRecord。 为记录命令可以让公式更容易理解,在嵌套情况下,可能需要执行此操作才能访问其他范围中的记录。
例如,可以修改库的 Items 属性,以便使用 As 确定我们在处理员工:
Employees As Employee
将调整图片和名称的公式以将此名称用于当前记录:
Employee.Picture
Employee.'First Name' & " " & Employee.'Last Name'
As 也可以与记录范围函数一起使用,以替换默认名称 ThisRecord。 可以将此应用于前一个示例来明确正在处理的记录:
With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
ForAll( InactiveEmployees As Employee,
Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )
在嵌套库和记录范围函数时,ThisItem 和 ThisRecord 始终引用最内的范围,从而导致外部范围的记录不可用。 可使用 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 属性设置为此公式,将显示:
下面我们来分析发生的情况:
- 我们首先迭代 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 复制的 File 的水平库替换为以下对象的 Items 属性:
Sequence(8) as File
最后,我们将在此库内添加一个 Label 控件,将为每个 File 和每个 Rank 复制该控件。 我们将把其大小设置为填满整个控件,然后设置 Fill 属性,以便使用此公式提供颜色:
If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )
Self 和 Parent 运算符
有三种方法可以在公式中引用控件及其属性:
方法 | 描述 |
---|---|
通过控件名称 | 任何控件都可由应用内任何位置的名称引用。 例如,Label1.Fill 表示名称为 Label1 的控件的 fill 属性。 |
自 操作员 | 在编写公式时,引用同一控件的另一个属性通常很方便。 不使用名称的绝对引用,使用对 oneself 的相对引用更加容易和便利。 Self 运算符使您可以轻松访问当前控件。 例如,Self.Fill 表示当前控件的填充颜色。 |
父 操作员 | 有些控件托管其他控件,如 Screen 和 Gallery 控件。 控件内控件的托管控件称为 parent。 与 Self 运算符一样,Parent 运算符为 Container 控件提供简单的相对引用。 例如,Parent.Fill 引用作为当前控件容器的控件的 fill 属性。 |
Self 和 父 是运算符,而不是控件本身的属性。 不支持引用 Parent.Parent、Self.Parent 或 Parent.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',因为这是显示名称。 必须使用单引号,因为此名称中有空格:
选择建议后,公式栏中将显示 'Custom Field',并会检索数据:
虽然不建议使用,但我们也可以为此字段中使用逻辑名称。 这将会检索到相同的数据。 无需使用单引号,因为此名称不包含空格或特殊字符:
在后台,在公式中看到的显示名称和基础逻辑名称之间会保持映射。 由于必须使用逻辑名与数据源进行交互,因此,此映射用于自动将当前显示名转换为逻辑名称,这就是在网络流量中看到的名称。 此映射也用于转换回逻辑名称,以便切换为新显示名称,例如,在显示名称改变或其他语言的开发者编辑应用时。
备注
在环境之间移动应用时,不会翻译逻辑名称。 对于 Dataverse 系统实体和字段名称,这应该不是问题,因为逻辑名称在环境之间是一致的。 但是任何自定义字段,如此示例上面的 cra3a_customfield,可能都有不同的环境前缀(本例中为 cra3a)。 首选显示名称,因为它们可以与新环境中的显示名称匹配。
名称消除歧义
由于显示名称不是唯一的,因此相同的显示名称可能在同一实体中出现多次。 发生这种情况时,对于一个或多个冲突的名称,逻辑名称将添加到括号中的显示名称的末尾。 在以上示例的基础上,如果存在另一个具有相同显示名称 Custom Field,逻辑名称为 cra3a_customfieldalt 的字段,建议会显示:
在其他发生名称冲突的情况下,如实体、选项集和其他 Dataverse 项的名称,会添加消除名称歧义字符串。
消除歧义运算符
某些函数创建记录范围,用于在处理每条记录时访问表的字段,如 Filter、AddColumns 和 Sum。 使用记录作用域添加的字段名称将替代应用中来自其他位置的同一名称。 在此情况下,仍可以使用 @ 消除歧义运算符访问来自记录范围以外的值:
- 若要访问来自嵌套记录作用域的值,请使用 @ 运算符,其中所操作的表名称使用该模式:
表格[@FieldName] - 若要访问全局值,如数据源、集合和上下文变量,请使用模式 [@ObjectName](无需指派表)。
有关详细信息和示例,请参阅记录范围。