Power Fx
Power Apps 的 Power Fx 公式参考 - Power Platform | Microsoft Learn
1. Abs、Exp、Ln、Power、Log 和 Sqrt 函数(可针对单个数字或单列表)
公式 | 描述 | 结果 |
---|---|---|
Abs( -55 ) | 返回不带负号的数字。 | 55 |
Exp( 2 ) | 返回 e 的 2 次方值,或 e * e 结果值。 | 7.389056... |
Ln( 100 ) | 返回数字 100 的自然对数(以 e 为底)。 | 4.605170... |
Log( 100 ) | 返回数字 100 以 10 为底数的对数。 | 2 |
Log( 64, 2 ) | 返回数字 64 以 2 为底数的对数。 | 6 |
Power( 5, 3 ) | 返回 5 的 3 次方值 ,或 5 * 5 * 5 结果值。 | 125 |
Sqrt( 9 ) | 返回 9 的平方根。 | 3 |
2.Acceleration、App、Compass、Connection 和 Location 信号
属性 | 描述 |
---|---|
App.ActiveScreen | 所显示的屏幕。 返回一个屏幕对象,可用于引用屏幕属性,或与其他屏幕进行比较,以判断显示的是哪个屏幕。 您可以使用 Back 或 Navigate 函数可以更改显示的屏幕。 |
详细信息:App 对象文档。
App.ActiveScreen.Fill | 返回所显示的屏幕的背景色。 |
3.AddColumns、DropColumns、RenameColumns 和 ShowColumns 函数
以下函数通过调整表的列来为表造型:
- 将包含多个列的表缩减为包含一个列,使该表可用于 Lower 或 Abs 等单列函数。
- 将计算结果列(例如,显示数量乘以单价后的结果的总价列)添加到某个表。
- 使用更有意义的名称将列重命名,以便向用户显示或者在公式中使用。
表是 Power Apps 中的一个值,与字符串或数字类似。 可将表指定为公式中的参数,函数可以返回表作为结果。
备注:本主题中介绍的函数不会修改原始表。 这些函数将该表用作参数,并转换一个应用了转换的新表。 请参阅使用表,了解更多详细信息。
无法使用这些函数修改数据源的列。 必须在数据源中修改数据。 可以使用 Collect 函数将列添加到集合。 有关更多详细信息,请参阅使用数据源。
AddColumns 函数将列添加到表,某个公式将定义该列中的值。 现有列保持不变。
DropColumns 函数从表中排除列。 其他所有列保持不变。
ShowColumns 函数包含某个表的列并删除其他所有列。 可以使用 ShowColumns 从多列表创建单列表。
使用 RenameColumns 函数重命名表的一个或多个列。
要将列重命名为现有列名,请先使用 DropColumns 删除现有列,或者通过在另一个函数中嵌套一个 RenameColumns 函数来重命名现有列。
对于所有这些函数,结果是已应用转换的新表。 不会修改原始表。 无法使用公式修改现有表。
本部分中的示例使用 IceCreamSales 数据源,其中包含下表中的数据:
这些示例都不会修改 IceCreamSales 数据源。 每个函数将数据源的值转换为表,然后返回该值作为结果。
公式 | 描述 | 结果 |
---|---|---|
AddColumns( IceCreamSales, "Revenue", UnitPrice * QuantitySold ) | 将 Revenue 列添加到结果。 对于每条记录,将计算 UnitPrice * QuantitySold,并将结果放在新列中。 | |
DropColumns( IceCreamSales, "UnitPrice" ) | 从结果中排除 UnitPrice 列。 使用此函数可排除列,使用 ShowColumns 可包含列。 | |
ShowColumns( IceCreamSales, "Flavor" ) | 仅在结果中包含 Flavor 列。 使用此函数可包含列,使用 DropColumns 可排除列。 | |
RenameColumns( IceCreamSales, "UnitPrice", "Price") | 在结果中将 UnitPrice 列重命名。 | |
RenameColumns( IceCreamSales, "UnitPrice", "Price", "QuantitySold", "Number") | 重命名结果中的 UnitPrice 和 QuantitySold 列。 | |
DropColumns( RenameColumns( AddColumns( IceCreamSales, "Revenue", UnitPrice * QuantitySold ), "UnitPrice", "Price" ), "Quantity" ) |
从公式内部开始,按顺序执行以下表转换:
|
ClearCollect( IceCreamSales,
Table(
{ Flavor: "Strawberry", UnitPrice: 1.99, QuantitySold: 20 },
{ Flavor: "Chocolate", UnitPrice: 2.99, QuantitySold: 45 },
{ Flavor: "Vanilla", UnitPrice: 1.50, QuantitySold: 35 }
)
)
ClearCollect( FirstExample,
AddColumns( IceCreamSales, "Revenue", UnitPrice * QuantitySold )
)
//AddColumns 函数将 IceCreamSales 用作只读参数;此函数未修改该参数引用的表。
//在文件菜单上,选择集合,然后选择 IceCreamSales 以显示该集合
4.And、Or 和 Not 函数
布尔逻辑函数,常用于操作比较结果和测试结果。
函数表示法 | Visual Basic 运算符表示法 | JavaScript 运算符表示法 |
---|---|---|
And( x, y ) | x And y | x && y |
Or( x, y ) | x Or y | x || y |
Not( x ) | Not x | ! X |
这些函数使用逻辑值。 不能直接向这些函数传递数字或字符串,而是必须执行比较或测试。
5.App 对象
提供有关当前正在运行的应用及对应用行为的控制的信息。
每个应用都有一个 App 对象。可以为 App 对象的某些属性编写公式。
ActiveScreen 属性标识正在显示的屏幕。
此属性返回一个屏幕对象,可用于引用屏幕属性,或与其他屏幕进行比较,以判断显示的是哪个屏幕。 您还可以使用表达式 App.ActiveScreen.Name 来检索显示的屏幕的名称。
使用 Back 或 Navigate 函数可以更改显示的屏幕。
没有人希望丢失未保存的更改。 使用 ConfirmExit 和 ConfirmExitMessage 属性可以在关闭应用之前警告用户。
ConfirmExit 是一个布尔属性,当为 true 时,会在应用关闭之前打开一个确认对话框。 默认情况下,此属性为 false,不会出现对话框。
使用此属性可以在用户进行了更改但未保存更改时显示确认对话框。 请使用可以检查变量和控件属性(例如,Edit form 控件的 Unsaved 属性)的公式。
在任何可能丢失数据的情况下,都会出现确认对话框,如以下示例所示:
- 运行 Exit 函数。
- 如果应用正在浏览器中运行:
- 关闭应用在其中运行的浏览器或浏览器标签页。
- 选择浏览器的后退按钮。
- 使用 Self 的 LaunchTarget 运行 Launch 函数。
- 如果应用在 Power Apps Mobile(iOS 或 Android)中运行:
- 轻扫在 Power Apps Mobile 中切换到其他应用。
- 选择 Android 设备上的后退按钮。
- 运行 Launch 函数启动另一个画布应用。
确认对话框的确切外观可能因设备和 Power Apps 的版本而异。
确认对话框不会出现在 Power Apps Studio 中。
默认情况下,确认对话框会以用户语言显示一条常规消息,如“您可能有未保存的更改。”。
使用 ConfirmExitMessage 可以在确认对话框中提供自定义消息。 如果此属性为空白,将使用默认值。 自定义消息会在必要时截断以适应确认对话框,因此请最多将消息保持在几行之内。
在浏览器中,确认对话框出现时可能会带有来自浏览器的常规消息。
备注: 应用对象还有两个试验性属性 OnMessage
和 BackEnabled
。 这些属性最终会被从应用对象中删除。 我们建议您不要在生产环境中使用这些属性。
备注: ConfirmExit 在嵌入到 Power BI 和 SharePoint 等的应用中不起作用。目前,如果启用了延迟加载预览功能(新应用默认启用),这些属性只能在第一个屏幕上引用控件。 如果进行了引用,Power Apps Studio 不会显示错误,但是生成的已发布应用不会在 Power Apps Mobile 或浏览器中打开。 我们正在积极努力消除这一限制。 同时,您可以在设置>即将发布的功能(在预览下面)中关闭延迟加载。
在 Power Apps 中,控件属性由公式驱动。 例如,要在应用中设置一致的背景颜色,您可以将每个公式的 Fill 属性设置为一个通用公式:
App.OnStart: Set( BGColor, ColorValue( Param( "BackgroundColor" ) ) )
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor
//在 OnStart 中创建一个全局变量来设置一次颜色,然后在整个应用中重复使用该值
虽然这种方法更好,但它还依赖于在 BGColor 的值建立之前运行的 OnStart。 BGColor 也可能在应用的某个角落被操作,而制作者并不知道,被其他人进行了更改,难以追踪。
在 Formulas 属性中使用命名公式来定义可在整个应用中重复使用的公式。
App.Formulas: BGColor = ColorValue( Param( "BackgroundColor" ) );
Label1.Fill: BGColor
Label2.Fill: BGColor
Label3.Fill: BGColor
使用命名公式的优点包括:
- 公式的值始终可用。 没有时间依赖性,没有必须在设置值之前首先运行的 OnStart,也没有公式值不正确的时间。 命名公式可以以任何顺序相互引用,只要它们不创建循环引用。 它们可以并行计算。
- 公式的值始终是最新的。 公式可以执行依赖于控件属性或数据库记录的计算,随着它们的变化,公式的值会自动更新。 您不需要像使用变量时那样手动更新值。 公式仅在需要时重新计算。
- 公式的定义不可变。 Formulas 中的定义是唯一的真实来源,值不能在应用的其他地方更改。 对于变量,某些代码可能会意外更改值,但对于命名公式则不可能。
- 公式的计算可以推迟。 因为它的价是不可变的,所以它始终可以在需要时进行计算,这意味着它只在需要时计算。 在应用的 screen2 显示之前不使用的公式值不需要在 screen2 可见之前计算。 这可以改善应用加载时间。 命名公式是声明性的,可以为系统提供优化公式计算方式和时间的机会。
- 命名公式是一个 Excel 概念。 Power Fx 会尽可能使用 Excel 概念,因为很多人都非常了解 Excel。 命名公式相当于 Excel 中的命名单元格和命名公式,由名称管理器管理。 它们会像电子表格一样自动重新计算,就像控件属性一样。
命名公式在 Formulas 属性中逐个定义,每个公式以分号结尾。 公式的类型从表达式的类型推断得出,基于表达式中元素的类型以及它们如何放在一起使用。 例如,这些命名公式从 Dataverse 检索有关当前用户的有用信息:
UserEmail = User().Email;
UserInfo = LookUp( Users, 'Primary Email' = User().Email );
UserTitle = UserInfo.Title;
UserPhone = Switch( UserInfo.'Preferred Phone',
'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
UserInfo.'Main Phone' );
命名公式的一些限制:
- 不能在应用中使用行为函数,否则会造成负面影响。
- 不能创建循环引用。 不允许在同一个应用中使用 a = b; 和 b = a;。
OnError 属性(试验性功能)
使用 OnError 在检测到错误后采取措施。 它提供了一个在错误横幅显示给最终用户之前拦截错误横幅的全局机会。 另外还可用于使用 Trace 函数记录错误或写入数据库或 Web 服务。
OnError 公式是并行计算的,它们的计算可能会与其他错误的处理重叠。 例如,如果您在 OnError 的顶部设置了一个全局变量,之后在同一公式中读取它,值可能已更改。 使用 With 函数创建公式在本地的命名值。
虽然每个错误由 OnError 单独处理,但默认错误横幅可能不会单独显示每个错误。 为避免同时显示太多错误横幅,如果最近已显示了某个错误,该错误则不会触发新的错误横幅。
添加一个 OnError 处理程序:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" )
从应用用户的角度,不会有任何错误。 但错误将被添加到监视器的跟踪中,并附上 FirstError 中的错误信息来源:
如果我们还想在跟踪之外显示相同的默认错误横幅,我们可以在 Trace 调用之后使用 Error 函数重新抛出错误,就像在 Trace 不存在时一样:
Trace( $"Error {FirstError.Message} in {FirstError.Source}" );
Error( FirstError )
OnStart 属性
OnStart 属性在用户启动应用时运行。 此属性通常用于执行以下任务:
此公式在第一个屏幕显示之前计算。 不加载屏幕,因此您无法使用 UpdateContext 函数设置上下文变量。 不过,您可以使用 Navigate 函数传递上下文变量。
更改 OnStart 属性后,通过将鼠标悬停在树视图窗格中的 App 对象上,选择省略号 (...),然后选择运行 OnStart 来测试它。 与第一次加载应用不同,现有集合和变量已经设置。 要从空集合开始,请使用 ClearCollect 函数而不是 Collect 函数。
备注 : 在 OnStart 属性中使用 Navigate 函数已停用。 现有应用将继续工作。 在一个有限的时间内,您仍然可以在应用设置中启用它(在已停用下)。 但是,以这种方式使用 Navigate 会导致应用加载延迟,因为它会强制系统在显示第一个屏幕之前完成对 OnStart 的计算。 请使用 StartScreen 属性计算显示的第一个屏幕。
StartScreen 属性确定首先显示哪个屏幕。 它在应用加载并返回要显示的屏幕对象时计算一次。 默认情况下,此属性为空,会首先显示工作室树视图中的第一个屏幕。
StartScreen 是一个数据流属性,不能包含行为函数。 所有数据流函数都可用。
- 读取用于启动应用的参数的 Param 函数。
- 读取有关当前用户的信息的 User 函数。
- LookUp、Filter、CountRows、Max 和从数据源读取的其他函数。
- 通过连接器的任何 API 调用,但要注意它会快速返回。
- Connection、Compass 和 App 等信号。
如果 StartScreen 返回错误,工作室树视图中第一个屏幕的显示状态会看似没有设置 StartScreen。 请使用 IfError 函数捕获任何错误并重定向到适当的错误屏幕。
在工作室中更改 StartScreen 后,通过将鼠标悬停在树视图窗格中的 App 对象上,选择省略号 (...),然后选择导航到 StartScreen 来测试它。 屏幕将改变,就像应用已加载一样。
6.运算符和标识符
有关画布应用中的语言支持的详细信息,请参阅全局应用。
符号 | 类型 | 示例 | 说明 |
---|---|---|---|
'...' | 标识符 | '客户名称' | 包含特殊字符(包括空格)的标识符用单引号括起来 |
"..." | 文本字符串 | "Hello, World" | 文本字符串用双引号括起来 |
$"..." | 字符串内插 | $"Dear {FirstName}," | 嵌入在文本字符串中的公式 |
. | 属性选择器 | Slider1.Value Color.Red Acceleration.X |
从表、控件、信号或枚举中提取属性。 为了向后兼容,也可能使用 !。 |
. [与语言相关] |
小数分隔符 | 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 = 20 或 Price < 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...” | 子字符串测试(区分大小写) | |
in | Gallery1.Selected in SavedItems | 属于集合或表 | |
in | "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 代表客户 | 覆盖库中的 ThisItem 和 ThisRecord,并记录范围函数。 As 在提供更好的具体名称时非常有用,在嵌套方案中特别重要。 |
自身 | Self 运算符 | Self.Fill | 访问当前控件的属性 |
Parent | Parent 运算符 | Parent.Fill | 控件容器属性的访问权限 |
ThisItem | ThisItem 运算符 | ThisItem.FirstName | Gallery 或 Form 控件字段的访问权限 |
ThisRecord | ThisRecord 运算符 | ThisRecord.FirstName | 访问 ForAll、Sum、With 和其他记录范围函数内完整的记录和记录的单个字段。 可以替换为 As 运算符。 |