Power Apps 的 Power Fx 公式参考 - Power Platform | Microsoft Learn
1.Back 和 Navigate 函数
Back
和
Navigate
函数可用于更改所显示的屏幕。
例如,如果您希望用户在选中某个按钮后显示其他屏幕,请将该按钮的
OnSelect
属性设置为一个包含
Navigate
函数的公式。 在这个公式中,您可以指定视觉变换效果(比如
Fade
)来控制屏幕切换方式。
Back
和
Navigate
只能更改当前显示的屏幕。
当前未显示的屏幕仍然在后台运行。
您可以构建公式来引用其他屏幕上控件的属性。
例如,用户可以更改某一个屏幕上滑块的值,导航到在公式中使用这个值的另一个屏幕,确定对新屏幕的显示有何影响。 然后,用户可以导航回原来的屏幕,并且确认滑块保留了自己的值。
当用户在屏幕之间导航时,
上下文变量
也会保留。 您可以使用
Navigate
设置公式会显示的屏幕的一个或多个上下文变量,这是从屏幕外部设置上下文变量的唯一方法。 这个方法可用于将参数传递到屏幕。
使用
App
对象的
StartScreen
属性来控制要显示的第一个屏幕。
Navigate
在第一个参数中,指定要显示的屏幕的名称。
在第二个参数中,指定旧屏幕切换为新屏幕的方式:
Transition 参数描述演示
ScreenTransition.Cover
新屏幕将滑入视图,从右向左移动,覆盖当前屏幕。
可以使用
Navigate
创建或更新新屏幕的
上下文变量
。 第三个参数是可选的,它可用于传递一条
记录
,其中包含上下文变量名称(以
列
名称的形式)和上下文变量的新值。 这条记录就是用于
UpdateContext
函数的记录。
设置旧屏幕的
OnHidden
属性和/或新屏幕的
OnVisible
属性,以在过渡期间进行其他更改。
App.ActiveScreen
属性将更新以反映更改。
Navigate
通常返回
true
,但是如果遇到错误,将返回
false
。
Back
函数返回最近显示的屏幕。
对于每个
Navigate
调用,应用都会跟踪出现的屏幕和过渡。 您可以使用连续的
Back
调用直接返回到用户启动应用时出现的屏幕。
当
Back
函数运行时,默认情况下使用反向过渡。 例如,如果屏幕通过
CoverRight
过渡出现,
Back
将使用
UnCover
(向左)返回。
Fade
和
None
是它们各自的反向。 将可选参数传递给
Back
可以强制执行特定的过渡。
Back
通常返回
true
,但如果用户自启动应用以来未导航到另一个屏幕,则返回
false
。
公式描述结果
Navigate( Details )
显示
Details
屏幕,没有任何过渡效果,也不会更改上下文变量的值。
Details
屏幕会快速显示。
Navigate( Details, ScreenTransition.Fade )
用
淡入淡出
过渡效果显示
Details
屏幕。 不更改上下文变量的任何值。
当前屏幕淡化消失,以显示
Details
屏幕。
Navigate( Details, ScreenTransition.Fade, { ID: 12 } )
使用
淡入淡出
过渡效果显示
Details
屏幕,
并且将
ID
上下文变量的值更新为
12
。
当前屏幕淡化消失,以显示
Details
屏幕,并且将这个屏幕的上下文变量
ID
设置为
12
。
Navigate( Details, ScreenTransition.Fade,
{ ID: 12 , Shade: Color.Red }
)
用
淡入淡出
过渡效果显示
Details
屏幕。
将
ID
上下文变量的值更新为
12
,并且将
Shade
上下文变量的值更新为
Color.Red
。
当前屏幕淡化消失,以显示
Details
屏幕。 将
Details
屏幕的上下文变量
ID
设置为
12
,并且将上下文变量
Shade
设置为
Color.Red
。 如果将
Details
屏幕上某一控件的
Fill
属性设置为
Shade
,则该控件会显示为红色。
Back()
显示带有默认返回过渡效果的上一屏幕。
通过当前屏幕显示所使用的过渡的反向过渡显示上一个屏幕。
Back( ScreenTransition.Cover )
显示带有
Cover
过渡的上一屏幕。
通过
Cover
过渡显示上一个屏幕,不考虑当前屏幕显示所使用的过渡。
2.Choices 函数
Choices
函数返回查找列可能值的表。
使用
Choices
函数提供选项列表让用户选择。 此函数通常与
Combo box
控件一起用在编辑窗体中。
对于查找,
Choices
返回的表与和查找相关联的外部表匹配。 使用
Choices
,就无需将外部表添加为另一个数据源。
Choices
会返回外部表的所有列。
由于
Choices
会返回表,因此可使用
Filter
、
Sort
、
AddColumns
以及其他所有表操作函数对表进行筛选、排序和定型。
目前,不能
委派
Choices
。
如果此限制在您的应用中造成问题,请将外部表添加为数据源,并直接使用它。
Choices
不要求列名称为字符串且括在双引号中
,这一点与
ShowColumns
、
Search
和其他表函数不同。 就像直接引用列一样提供公式。
列引用必须直接连接到数据源
。 例如,如果数据源是
客户
而查找是
SLA
,则列引用是
Accounts.SLA
。
引用不能通过函数、变量或控件传递。
深化此示例,如果
客户
馈送给
Gallery
控件,则使用公式
Gallery.Selected.SLA
引用所选帐户的 SLA。 但是,此引用通过了一个控件,因此它不能传递给
Columns
函数,即仍必须使用
Accounts.SLA
。
目前,只能将查找列与 SharePoint 和 Microsoft Dataverse 一起使用。
Choices
(
column-reference
)
column-reference
– 必需。 数据源的查找列。
请勿将列名括在双引号中。 引用必须直接指向数据源的列,而不能通过函数或控件传递。
如:Choices(RAApproval.申请类型)
3. Collect、Clear 和 ClearCollect 函数
Collect
Collect
函数将记录添加到数据源。 可添加的项包括:
单个值
:该值置于新记录的
Value
字段中。 所有其他属性保留为
blank
。
记录
:每个命名属性都置于新记录的对应属性中。 所有其他属性保留为空白。
表
:如上所述,表中的每条记录将作为数据源的单个记录添加。 表不是以嵌套表形式添加到记录。 为实现此目的,需首先将表整合到记录中。
当用于集合时,将根据需要创建额外的
列
。 该数据源将固定其他数据源的列,且无法添加新列。
如果数据源尚不存在,则会创建一个集合。
集合有时可用于保留全局变量或作为数据源的临时副本。 画布应用以公式为基础,这些公式会在用户与应用交互时自动重新计算。 集合不具有此优势,并且使用这些集合可能会让应用更加难以进行创建和理解。
以此方式使用集合前,请查看
使用变量
。
还可使用
Patch
函数在数据源中创建记录。
Collect
以表格形式返回修改后的数据源。
Collect
只能在
行为公式
中使用。
Clear
Clear
函数删除集合的所有记录。 集合的列将保留。
请注意,
Clear
仅对集合执行运算,而不包括其他数据源。 鉴于此,
可以使用
RemoveIf
(
DataSource
, true )
。 此函数将删除数据源存储中的所有记录并影响其他用户
,请谨慎使用。
可使用
Remove
函数选择性地删除记录。
Clear
没有返回值。 只能在行为公式中使用。
ClearCollect
ClearCollect
函数删除集合中的所有记录。 然后将不同的记录集添加到同一集合。 单个函数
ClearCollect
可提供
Clear
和
Collect
的组合功能。
ClearCollect
以表形式返回修改后的集合。
ClearCollect
只能在行为公式中使用。
与数据源一起使用时,无法委派这些函数。 将仅检索数据源的第一部分,然后应用该函数。 结果并不能代表整个过程。 创作时可能会显示一条警告,以提醒您有此限制,并建议尽可能切换到可委派的替代项。 有关详细信息,请参阅
委派概述
。
清除并将记录添加到数据源
在以下示例中,将擦除名为
IceCream
的集合并向其进行添加。 数据源以下列内容开始:
公式描述结果
ClearCollect( IceCream, { Flavor: "Strawberry", Quantity: 300 } )
清除
IceCream
集合中的所有数据,然后添加包含草莓冰淇淋数量的记录。
IceCream
集合也已修改。
Collect( IceCream, { Flavor: "Pistachio", Quantity: 40 }, { Flavor: "Orange", Quantity: 200 } )
向
IceCream
集合添加两条记录,其中包括开心果味冰淇淋和橙子味冰淇淋的数量。
ClearCollect( IceCream, { Flavor: "Chocolate", Quantity: 100 }, { Flavor: "Vanilla", Quantity: 200 } )
清除所有数据,然后将两条记录添加到包含一定数量的巧克力和香草冰淇淋的
IceCream
集合中。 要添加的记录作为函数的各个参数提供。
ClearCollect( IceCream, Table( { Flavor: "Chocolate", Quantity: 100 }, { Flavor: "Vanilla", Quantity: 200 } ) )
除将记录合并到表中并通过单个参数传递
外,与前面的示例相同。 表的内容先按记录逐条提取,然后再添加到
IceCream
集合中。
ClearCollect( IceCream,
{ MyFavorites: Table( { Flavor: "Chocolate", Quantity: 100 }, { Flavor: "Vanilla", Quantity: 200 } ) } )
除了将表整合在记录中外,与前面的示例相同。 不会提取表的记录,而是将整个表添加为记录的一个单元。
4. If 和 Switch 函数
If
函数会一直测试一个或多个条件,直到结果为
true
时为止。 如果结果为 true,将返回相应的值。 否则,将返回默认值。 无论属于上述哪种情况,返回的值可以是要显示的字符串、要求值的公式或另一种形式的结果。
Switch
函数
先对公式求值,再确定结果是否与指定序列中的任何值一致
。 如果找到匹配值,将返回相应的值。 否则,将返回默认值。 无论属于上述哪种情况,返回的值可以是要显示的字符串、要求值的公式或另一种形式的结果。
If
(
Condition
,
ThenResult
[,
DefaultResult
] )
If
(
Condition1
,
ThenResult1
[,
Condition2
,
ThenResult2
, ... [ ,
DefaultResult
] ] )
Condition(s)
- 必需。 要测试是否为
true
的公式。
此类公式通常包含比较
运算符
(如
<
、
>
和
=
)和测试函数(如
IsBlank
和
IsEmpty
)。
ThenResult(s)
- 必需。 对计算结果为
true
的条件返回的对应值。
DefaultResult
- 可选。 没有条件求值为
true
时返回的值。 如果未指定此参数,则将返回
空白
。
Switch
(
Formula
,
Match1
,
Result1
[,
Match2
,
Result2
, ... [,
DefaultResult
] ] )
Formula
- 必需。
为进行匹配而求值的公式。 此公式仅求值一次。
Match(s)
- 必需。 要与
Formula
结果比较的值。 如果找到完全匹配项,将返回相应的
Result
。
Result(s)
- 必需。 找到完全匹配项时返回的相应值。
DefaultResult
- 可选。 如果找不到匹配项,将返回此值。 如果未指定此参数,则将返回
空白
。
操作只由一个分支触发。 将按顺序对条件和匹配进行求值,如果条件为
true
或找到匹配项,将停止求值。
如果没有条件为
true
、找不到任何匹配项且未指定默认结果,将返回
Blank
。
在下面这些示例中,
Slider
控件(名为
Slider1
)的值为
25
。
公式描述结果
If( Slider1.Value = 25, "Result1" )
条件为
true
,并返回相应结果。
“Result1”
If( Slider1.Value = 25, "Result1", "Result2" )
条件为
true
,并返回相应结果。
“Result1”
If( Slider1.Value > 1000, "Result1" )
条件为
false
,且未提供
DefaultResult
。
If( Slider1.Value > 1000, "Result1", "Result2" )
条件为
false
,但提供了
DefaultResult
,将返回此结果。
“Result2”
If( Slider1.Value = 25, "Result1", Slider1.Value > 0, "Result2" )
第一个条件为
true
,并返回相应结果。 第二个条件也为
true
,但未进行求值,因为它在参数列表中的出现时间要晚于比求值为
true
的条件。
“Result1”
If( IsBlank( Slider1.Value ), "Result1", IsNumeric( Slider1.Value ), "Result2" )
第一个条件为
false
,因为滑块不是
空白
。 第二个条件为
true
,因为滑块的值是数字,并返回相应结果。
“Result2”
If( Slider1.Value > 1000, "Result1", Slider1.Value > 50, "Result2", "Result3")
第一个和第二个条件均为
false
,但提供了
DefaultResult
,将返回此结果。
“Result3”
Switch( Slider1.Value, 25, "Result1" )
滑块的值与要检查的第一个值一致,将返回相应的结果。
“Result1”
Switch( Slider1.Value, 20, "Result1", 25, "Result2", 30, "Result3" )
滑块的值与要检查的第二个值一致,将返回相应的结果。
“Result2”
Switch( Slider1.Value, 20, "Result1", 10, "Result2", 0, "Result3", "DefaultResult" )
滑块的值与要检查的任何值都不一致。 因为提供了
DefaultResult
,所以将返回此结果。
“DefaultResult”
在下面这些示例中,用户在名为
FirstName
的
Text input
控件中键入的值为“John”。
公式描述结果
If( ! IsBlank( FirstName.Text ), Navigate( Screen1, ScreenTransition.None ) )
条件为
true
,因此将运行
Navigate
函数。
可使用
IsBlank
函数测试所需的窗体字段是否已填充。
如果
FirstName
为
blank
,此公式不会产生任何影响。
true
显示更改为
Screen1
。
If( IsBlank( FirstName.Text ), Navigate( Screen1, ScreenTransition.None ), Back() )
没有
!
运算符,条件为
false
,因此不会运行
Navigate
函数。 因为
Back
函数作为
DefaultResult
提供,所以将运行此函数。
true
将重新显示之前显示的屏幕。
Switch( FirstName.Text, "Carlos", Navigate( Screen1, ScreenTransition.None ), "Kirstin", Navigate( Screen2, ScreenTransition.None ), "John", Navigate( Screen3, ScreenTransition.None ) )
将
FirstName.Text
的值与“Carlos”、“Kirstin”和“John”(按此顺序)进行比较。 因为找到与“John”匹配的项,所以应用将转到
Screen3
。
true
切换显示
Screen3
。
5.Blank、Coalesce、IsBlank 和 IsEmpty 函数
测试值是否为空白值,或测试
表
是否不包含任何
记录
,并能创建
空白
值。
Blank
是“空值”或“未知值”的占位符。
例如,如果用户未进行选择,
Combo box
控件的
Selected
属性将为
空白
。 很多数据源可以存储和返回 NULL 值,此类值在 Power Apps 中表示为
空白
。
Power Apps 中任何属性的值或计算的值都可以是
空白
值。 例如,布尔型数据的值通常是:
true
或
false
。 不过除了这两个值以外,它还可以是指示状态未知的
空白
。 这跟 Microsoft Excel 很相似,Excel 工作表的单元格一开始可能是空白无内容,但是它可以包含
TRUE
或
FALSE
(等等)。 您随时可以再次清除单元格中的内容,将其返回
空白
状态。
空字符串
是指不包含任何字符的字符串。
Len 函数
对于此类字符串返回零,它可以在公式中将其写为两个双引号,在
""
之间不写入任何内容。 某些控件和数据源使用空字符串表示“无值”条件。 为了简化应用的创建,
IsBlank
和
Coalesce
函数同时测试
空白
值或空字符串。
在
IsEmpty
函数的上下文中,
空
特定于不包含记录的表
。 即使表只包含
列
名称,而不包含任何数据,它也是一个完整的表。 一个表刚开始可能是空表,但填入记录后,就不再是空表了;如果将其中的记录删除,那么它又会变成空表。
我们正处于过渡时期。 到目前为止,
空白
还用于报告错误,因此无法将有效的“无值”与错误区分开。 为此,目前,只有本地集合支持存储
空白
值。 如果在
设置
>
即将发布的功能
>
试验性
下面打开
公式级错误管理
试验性功能,则您可以在其他数据源中存储
空白
值。 我们正在积极完成此功能,并完成
空白
值与错误的正确分离。
Blank
函数返回
空白
值。 此函数可用于在支持 NULL 值的数据源中存储这些值,进而可以从字段中有效删除所有值。
IsBlank
IsBlank
函数测试
空白
值或空字符串。
测试包括空字符串,以简化应用的创建过程,因为某些数据源和控件在不存在任何值时会使用空字符串。
要专门测试
空白
值,请使用
if( Value = Blank(), ...
而不是
IsBlank
。
为现有应用启用错误处理时,考虑将
IsBlank
替换为
IsBlankOrError
以保留现有应用行为。
在添加错误处理之前,
空白
值用于同时表示数据库中的空值和错误值。
错误处理将两个
空白
解释分开,这可能会改变继续使用
IsBlank
的现有应用的行为。
IsBlank
的返回值为布尔值
true
或
false
。
Coalesce
Coalesce
函数按顺序对参数求值并返回第一个值(不是
空白
或空字符串)。
使用此函数将
空白
值或空字符串替换为其他值,但保留非
空白
和非空字符串值不变。 如果所有参数都是
空白
或空字符串,函数将返回
blank
,这让
Coalesce
成为将空字符串转换为
空白
值的好方法。
Coalesce( value1, value2 )
是
If( Not IsBlank( value1 ), value1, Not IsBlank( value2 ), value2 )
的更简明的等效项,不需要对
value1
和
value2
求值两次。 如果没有“else”公式,
If 函数
将返回
空白
。
Coalesce
的所有参数必须是同一种类型;例如,不能将数字和文本字符串混合在一起。
Coalesce
的返回值属于这种常见类型。
IsEmpty
IsEmpty
函数用于测试表是否包含记录。 这个函数跟使用
CountRows
函数的效果相同,只不过它是检查表中的记录数是否为零。 可以结合使用
IsEmpty
和
Errors
函数,从而检查数据源错误。
IsEmpty
的返回值为布尔值
true
或
false
。
Blank
()
Coalesce
(
Value1
[,
Value2
, ... ] )
Value(s)
– 必需。 要测试的值。
按顺序计算每个值,直到找到不是
空白
且不是空字符串的值。 不会计算这一点之后的值。
IsBlank
(
Value
)
Value
– 必需。
要测试
空白
值或空字符串的值。
IsEmpty
(
Table
)
Table
- 必需。
要测试是否包含记录的表。
Coalesce
公式描述结果
Coalesce( Blank(), 1 )
测试从
Blank
函数返回的值,此函数始终返回
空白
值。 由于第一个参数为
空白
,因此继续对下一个参数求值,直至找到非
空白
值和非空字符串。
Coalesce( "", "2" )
测试第一个参数,它是一个空字符串。 由于第一个参数是空字符串,因此继续对下一个参数求值,直至找到非
空白
值和非空字符串。
Coalesce( Blank(), "", Blank(), "", "3", "4" )
Coalesce
从参数列表的开头开始并按顺序评估各个参数,直至找到非
空白
值和非空字符串。 在本例中,前四个参数均返回
空白
或非空字符串,因此继续评估第五个参数。
第五个参数是非
空白
和非空字符串,因此计算在此处停止。 将返回第五个参数的值,并且不再对第六个参数求值。
Coalesce( "" )
测试第一个参数,它是一个空字符串。 因为第一个参数是一个空字符串,并且没有更多参数,所以函数返回
空白
。
Blank
其他示例:
公式描述结果
IsBlank( Blank() )
测试从
Blank
函数返回的值,此函数始终返回
空白
值。
IsBlank( "" )
不包含任何字符的字符串。
IsBlank( "Hello" )
包含一个或多个字符的字符串。
false
IsBlank(
AnyCollection
)
由于存在
集合
,所以即使不包含任何记录,它的值也不是空值。
要检查是不是空集合,请使用
IsEmpty
。
false
IsBlank( Mid( "Hello", 17, 2 ) )
Mid
函数的起始字符超出了字符串的结束位置。 所以结果是空字符串。
IsBlank( If( false, false ) )
没有
ElseResult
的
If
函数。 由于条件的结果始终是
false
,所以
If
函数始终返回
空白
。
还可以使用
IsEmpty
测试一个计算的表是不是空表,请参阅以下示例:
公式描述结果
IsEmpty( [ 1, 2, 3 ] )
单列表包含三条记录,所以,它不是空表。
false
IsEmpty( [ ] )
单列表不包含任何记录,所以它是空表。
IsEmpty( Filter( [ 1, 2, 3 ], Value > 5 ) )
单列表不包含任何大于 5 的值。 筛选器没有筛选出任何记录,所以它是空表。
FirstN
函数返回表中的
第一组记录
,
第二个参数指定要返回的记录数
。
Last
函数返回表中的最后一条记录。
LastN
函数返回表中的最后一组记录,第二个参数指定要返回的记录数。
Index
函数基于记录在表中的排序位置返回表的记录。 记录编号从 1 开始,因此
First( table )
返回与
Index( table, 1 )
相同的记录。
如果请求的记录索引小于 1、大于表中的记录数或表为空,
Index
将返回错误
。
First
、
Index
和
Last
返回单个记录。
FirstN
和
LastN
都返回一个表,即使仅指定了单个记录。
与数据源一起使用时,
无法委派这些函数
。 将仅检索数据源的第一部分,然后应用该函数。 结果并不能代表整个过程。 创作时可能会显示一条警告,以提醒您有此限制,并建议尽可能切换到可委派的替代项。 有关详细信息,请参阅
委派概述
。
例如,当用于包含具有 100 万个记录的大表的数据源时,
Last
将受到非委派限制,不会返回整个数据源的最后一个记录。 同样,使用
Index
请求 100 万个记录中间的记录会导致错误,因为基于非委派限制索引超出了的范围。
可以使用以下公式将此表放入集合中(放入 Button 控件的 OnStart 公式并按下按钮)
Collect( IceCream, Table( { Flavor: "Chocolate", Quantity: 100 },
{ Flavor: "Vanilla", Quantity: 200 },
{ Flavor: "Strawberry", Quantity: 300 },
{ Flavor: "Mint Chocolate", Quantity: 60 },
{ Flavor: "Pistachio", Quantity: 200 } ) )
公式说明结果
First( IceCream )
返回 IceCream 的第一个记录。
{ Flavor: "Chocolate", Quantity: 100 }
Last( IceCream )
返回 IceCream 的最后一个记录。
{ Flavor: "Pistachio", Quantity: 200 }
Index( IceCream, 3 )
返回 IceCream 的第三个记录。
{ Flavor: "Strawberry", Quantity: 300 }
FirstN( IceCream, 2 )
返回包含 IceCream 的前两个记录的表。
Sort 函数根据公式对表进行排序。
系统会针对表的每条记录计算公式,然后根据结果对表进行排序。 公式的计算结果必须是数字、字符串或布尔值;不得是表或记录。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
若要先按一列进行排序,然后再按另一列进行排序,请在 Sort 公式中嵌入另一个此公式。 例如,可以使用以下公式先按 LastName 列对 Contacts 表进行排序,然后再按 FirstName 列进行排序:Sort( Sort( Contacts, LastName ), FirstName )
还可以使用 SortByColumns 函数根据一列或多列对表进行排序。
SortByColumns 的参数列表提供了作为排序依据的列的名称,以及每个列的排序方向。 系统按参数顺序执行排序(先按第一列排序,然后按第二列排序,依此类推)。 将列名称指定为字符串,如果直接在参数列表中添加列名称,必须用双引号括起来。 例如,SortByColumns( CustomerTable, "LastName" )。
可以将 SortByColumns 与 Drop down 或 List box 控件结合使用,以便用户能够选择作为排序依据的列。
除了进行升序或降序排序之外,SortByColumns 还可以根据单列表值进行排序。 例如,可以提供 [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" ] 作为排序顺序,从而根据星期几的名称对记录进行排序。 所有包含 Monday" 的记录会先显示,随后显示包含 Tuesday 的记录,依此类推。 与排序顺序表不匹配的记录被置于列表末尾显示。
表是 Power Apps 中的一个值,与字符串或数字类似。 可以向函数传递表,也可以从函数返回表。 Sort 和 SortByColumn 并不修改表,而是将表视为参数,然后返回排序后的新表。 请参阅使用表,了解更多详细信息。
如果可能,Power Apps 会将筛选和排序操作委派给数据源,并根据需要在结果中翻页。 例如,当您启动一个应用程序来显示填充了数据的 库 控件时,最初只会将第一组记录导入到设备中。 当用户滚动时,会将数据源中的其他数据转入下页。 这样,应用程序的启动时间更短,并且可以访问非常大的数据集。
但是,可能并非总是可以进行委派。 各数据源对委派支持的函数和运算符可能有所不同。 如果无法进行完全公式委派,则创作环境将用一条警告来标记无法委派的部分。 如果可能,请考虑更改公式以避免出现无法委派的函数和运算符。 委派列表详细说明了可以委派的数据源和操作。
如果无法进行委派,则 Power Apps 将仅拉取一小部分记录以在本地进行处理。 筛选和排序函数将对少数一部分记录进行操作。 库 中提供的内容可能不是整个过程,这可能会使用户感到困惑。
有关详细信息,请参阅委派概述。
Sort( Table, Formula [, SortOrder ] )
Table - 必需。 要排序的表。
Formula - 必需。 系统会针对表的每条记录计算此公式,然后根据结果对表进行排序。 可以引用表中的列。
SortOrder - 可选。 指定 SortOrder.Descending 可对表进行降序排序。 SortOrder.Ascending 是默认值。
SortByColumns( Table, ColumnName1 [, SortOrder1, ColumnName2, SortOrder2, ... ] )
Table - 必需。 要排序的表。
ColumnName(s) - 必需。 要排序的列名称(以字符串形式)。
SortOrder(s) - 可选。 SortOrder.Ascending 或 SortOrder.Descending。 SortOrder.Ascending 是默认值。 如果提供了多个 ColumnNames,则最后一列必须包括 SortOrder 。
对于列名称带空格的 SharePoint 和 Excel 数据源,请将每个空格指定为 "_x0020_"。 例如,将 "Column Name" 指定为 "Column_x0020_Name"。
SortByColumns( Table, ColumnName, SortOrderTable )
Table - 必需。 要排序的表。
ColumnName - 必需。 要排序的列名称(以字符串形式)。
SortOrderTable - 必需。 作为排序依据的单列表值。
对于列名称带空格的 SharePoint 和 Excel 数据源,请将每个空格指定为 "_x0020_"。 例如,将 "Column Name" 指定为 "Column_x0020_Name"。
在下面的示例中,我们将使用 IceCream 数据源,其中包含下表中的数据:
公式描述结果
Sort( IceCream, Flavor )
SortByColumns( IceCream, "Flavor" )
按 Flavor 列对 IceCream 进行排序。 由于 Flavor 列包含字符串,因此该表按字母顺序进行排序。 默认情况下,排序顺序为升序。
Sort( IceCream, Quantity, SortOrder.Descending )
SortByColumns( IceCream, "Quantity", SortOrder.Descending )
按 Quantity 列对 IceCream 进行排序。 由于 Quantity 列包含数字,因此按数值大小进行排序。 排序顺序已指定为降序。
Sort( Sort( IceCream, OnOrder ), Quantity )
SortByColumns( IceCream, "OnOrder", Ascending, "Quantity", Ascending )
先按 OnOrder 列对 IceCream 进行排序,然后再按 Quantity 列进行排序。 请注意,在按 OnOrder 进行第一次排序时,“Pistachio”的排序高于“Vanilla”,然后再按 Quantity 进行排序时,它们一同移到相应的位置上。
如果后一位数字等于或大于 5,Round 函数会向上舍入。 否则向下舍入。
RoundDown 函数始终向零的方向向下舍入到前一个较小的数值。
RoundUp 函数始终向远离零的方向向上舍入到下一个较大的数值。
可以为以下函数指定小数位数:
小数位数描述示例
该数字四舍五入到小数点分隔符的右侧。
Round( 12.37, 1 )
返回 12.4。
该数字四舍五入到最接近的整数。
Round( 12.37, 0 )
返回 12。
该数字四舍五入到小数点分隔符的左侧。
Round( 12.37, -1 )
返回 10。
Int 和 Trunc
Int 和 Trunc 函数将数值舍入为整数(没有小数的整数):
Int 向下舍入到最接近的整数。
Trunc 通过删除任何小数部分将数字截断为仅整数部分。
Int 和 Trunc 之间的区别在于对负数的处理。 例如,对于参数 -4.3
,Int 将返回距离零更远的整数,即 -5
,而 Trunc 将返回更接近零的整数,即 -4
。 Int 返回五个舍入函数中唯一的值,而 Trunc 返回与 RoundDown 相同的值。
使用 Trunc 提取数字的小数部分,方法是从原始数字中减去此函数,例如 X - Trunc(X)
。
Trunc 不能像 Microsoft Excel 一样指定小数位数。 如果需要的话,可改用 RoundDown。
这些函数支持单列表格。 如果传递单个数值,则返回值为这个数值的舍入版本。 如果传递包含数值的单列表,则返回值为舍入数值的单列表。 DecimalPlaces 参数可以是单个值,也可以为单列表格。 如果单列表格包含的值少于相应 数值,则对其余值使用零。 使用 ShowColumns 和其他表形状函数从较大的表格中提取单列表格。
Round( Number, DecimalPlaces )
RoundDown( Number, DecimalPlaces )
RoundUp( Number, DecimalPlaces )
Number - 必需。 要舍入的数值。
DecimalPlaces - 必需。 要四舍五入到的小数位数。 使用正值表示小数点分隔符右侧的小数位数,使用负值表示左侧的小数位数,使用零表示整数。
Int(数值)
Trunc(数值)
Number - 必需。 要舍入为整数的数值。
舍入为整数。
X
Round( X, 0 )
RoundUp( X, 0 )
RoundDown( X, 0 )
Int( X )
Trunc( X )
舍入到小数点分隔符右侧的两位小数 (0.01)。
X
Round( X, 2 )
RoundUp( X, 2 )
RoundDown( X, 2 )
430.123
430.12
430.13
430.12
430.125
430.13
430.13
430.12
430.128
430.13
430.13
430.12
舍入到小数点分隔符左侧的两位小数 (100)。
X
Round( X, -2 )
RoundUp( X, -2 )
RoundDown( X, -2 )
430.123
449.942
450.000
450.124
479.128
舍入值的单列表格。
X
Int( X )
Round( X, 2 )
RoundDown( X, [ 0, 1, 2 ] )
RoundUp( X, [ 2 ] )
[ 123.456,
987.593,
542.639 ]
[ 123,
987,
542 ]
[ 123.46,
987.59,
542.64 ]
[ 123,
987.5,
542.63 ]
[ 123.46,
988,
543 ]
9.Sequence 函数
Sequence 函数生成单列的顺序数字(如 1、2、3)表。 列的名称为 Value。 Sequence( 4 )
与 [1,2,3,4]
等效。
可使用 Sequence 和 ForAll 函数迭代特定次数。 例如,以下公式向集合 MyRandomNumbers 添加 10 个随机数字:
Power Apps复制
ForAll( Sequence( 10 ), Collect( MyRandomNumbers, Rand() ) )
也可以使用 ForAll 将值转换为其他数据类型,并返回新表。 例如,以下公式返回接下来 10 天的表:
Power Apps复制
ForAll( Sequence( 10 ), DateAdd( Today(), Value, Days ) )
要生成的记录的数量将向下取整为最近的整数,并且范围必须为 0 到 50,000。 生成无记录的表将生成 空 表。
Sequence 限制为 50,000 个记录。
Sequence( Records [, Start [, Step ] ] )
Records - 必需。 要创建的记录的数量。 范围必须为 0 到 50,000。
Start – 可选。 序列的起始数字。 默认值为 1。
Step – 可选。 序列中每个连续数字的增量。 Step 可以是从 Start 倒数的负值。 默认值为 1。
公式描述结果
Sequence( 4 )
生成一个从默认数字 1 开始,以默认值 1 为增量的 4 记录表。
计算值的结果并对单个记录(包括命名值中的内联记录)执行操作。
With 函数计算单个记录的公式。 该公式可以计算值并/或执行操作,例如修改数据或使用连接。 使用 ForAll 函数可以计算记录表中的所有记录的公式。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
使用 With 可以通过将复杂公式拆分为更小的命名子公式,来提高这些复杂公式的可读性。 这些命名值就像简单的局部变量一样,限制在 With 的作用域中。 与 UpdateContext 函数一起使用的内联记录语法可以与 With 一起使用。 与上下文或全局变量相比,优先使用 With,因为它是自包含的,易于理解,并且可以在任何声明性公式上下文中使用。
使用 With 可以访问由诸如 Patch 或 Match 等函数返回的记录的字段。 With 将这些函数的值保留足够长的时间,以用于进一步的计算或操作。
如果 With 的 Record 参数是一个错误,该错误将由函数返回,并且不会计算 Formula。
With( Record, Formula )
Record – 必需。 要执行的记录。 对于名称值,请使用内联语法 { name1: value1, name2: value2, ... }
Formula – 必需。 要为 Record 计算的公式。 此公式可以直接引用 Record 的任何字段作为记录范围。
简单命名值
With( { radius: 10,
height: 15 },
Pi() * (radius*radius) * height
// Result: 4712.38898038 (as shown in a label control)
此示例使用命名值记录来计算圆柱体的体积。 With 用于一起捕获所有输入值,从而很容易将它们与计算本身分开。
With( { AnnualRate: RateSlider/8/100, // slider moves in 1/8th increments and convert to decimal
Amount: AmountSlider*10000, // slider moves by 10,000 increment
Years: YearsSlider, // slider moves in single year increments, no adjustment required
AnnualPayments: 12 }, // number of payments per year
With( { r: AnnualRate/AnnualPayments, // interest rate
P: Amount, // loan amount
n: Years*AnnualPayments }, // number of payments
r*P / (1 - (1+r)^-n) // standard interest calculation
此示例嵌套 With 函数为每月抵押贷款付款创建双层计算。 只要没有冲突,所有外部 With 命名值在内部 With 中均可用。
从 Patch 返回的主键
With( Patch( Orders, Defaults( Orders ), { OrderStatus: "New" } ),
ForAll( NewOrderDetails,
Patch( OrderDetails, Defaults( OrderDetails ),
{ Order: OrderID, // from With's first argument, primary key of Patch result
Quantity: Quantity, // from ForAll's NewOrderDetails table
ProductID: ProductID } // from ForAll's NewOrderDetails table
此示例将一条记录添加到 SQL Server 中的 Order 表中。 然后,它使用订单的返回主键(由 OrderID 字段中的 Patch 函数返回)在 OrderDetails 表中创建相关记录。
With(
Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ),
Time( Value( hours ), Value( minutes ), Value( seconds ) )
// Result: 2:01 AM (as shown in a label control, use the Text function to see the seconds)
此示例从 ISO 8601 持续时间值中提取小时、分钟和秒,然后使用这些子匹配项创建日期/时间值。
请注意,尽管子匹配项包含数字,但它们仍在文本字符串中。 在执行数学运算之前,使用 Value 函数转换为数字。
11.ForAll 函数
针对表中的所有记录计算值和执行操作。
ForAll 函数针对表中的所有记录对公式求值。 该公式可以计算值并/或执行操作,例如修改数据或使用连接。 使用 With 函数评估单个记录的公式。
使用 Sequence 函数和 ForAll 函数基于计数进行迭代。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
每个公式求值的结果都在表中返回,并采用与输入表相同的顺序。
如果公式的结果是单个值,则结果表将是一个单列表。 如果公式的结果是一条记录,则结果表将包含与结果记录具有相同列的记录。
如果公式的结果是 空 值,则结果表中将没有与该该输入记录对应的记录。 在这种情况下,结果表中的记录数将少于源表中的记录数。
公式可以包含用于执行操作的函数,例如使用 Patch 和 Collect 函数修改数据源的记录。 公式还可以调用针对连接的方法。 可以通过使用 ; 运算符对每条记录执行多个操作。 无法修改作为 ForAll 函数的使用者的表。
在编写公式时,请记住,可以按任何顺序处理记录,并且有可能可以并行处理。 可以在表的最后一条记录后处理第一条记录。
请小心避免使用排序依赖关系。 因此,您不能在 ForAll 函数内使用使用 UpdateContext、Clear 和 ClearCollect 函数,因为它们很容易用来存放易受此效果影响的变量。 您可以使用 Collect,但添加记录的顺序是不确定的。
多个可修改数据源的函数(包括 Collect、Remove 和 Update)会将更改后的数据源作为其返回值来返回。 如果针对 ForAll 表的每条记录进行返回,则这些返回值可能很大并占用大量资源。 您还可能会发现这些返回值不是您想要的,因为 ForAll 可以并行操作并且可能会将这些函数的副作用与获取其结果分离开来。 如果来自 ForAll 的返回值未使用(对于数据修改函数这是常见情况),则不会创建返回值,因此不需要考虑资源或顺序。 但是,如果您使用 ForAll 的结果并且使用了返回数据源的函数之一,请仔细考虑如何安排结果的结构并首先针对小型数据集进行测试。
Power Apps 中的许多函数可以通过使用单列表一次处理多个值。 例如,Len 函数可以采用与 ForAll 相同的方式处理包含文本值的表,返回包含长度的表。 这样,在很多情况下将不需要使用 ForAll,因此可以更高效并且更容易阅读。
另一个需要注意的事项是 ForAll 不可委派,而诸如 Filter 之类的其他函数则可以。
与数据源一起使用时,无法委派此函数。 将仅检索数据源的第一部分,然后应用该函数。 结果并不能代表整个过程。 创作时可能会显示一条警告,以提醒您有此限制,并建议尽可能切换到可委派的替代项。 有关详细信息,请参阅委派概述。
ForAll( Table, Formula )
Table - 必需。 要对其执行操作的表。
Formula - 必需。 用于对 Table 中的所有记录进行求值的公式。
以下示例使用 Squares 数据源:
若要将此数据源创建为集合,请将某个 Button 控件的 OnSelect 属性设置为以下公式,打开“预览”模式,然后单击按该钮:
ClearCollect( Squares, [ "1", "4", "9" ] )
公式描述结果
ForAll( Squares, Sqrt( Value ) )
Sqrt( Squares )
针对输入表中的所有记录计算 Value 列的平方根。 Sqrt 函数还可以与单列表一起使用,从而可以在不使用 ForAll 的情况下执行此示例。
以下示例使用 Expressions 数据源:
若要将此数据源创建为集合,请将某个 Button 控件的 OnSelect 属性设置为以下公式,打开“预览”模式,然后单击按该钮:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
此示例还使用一个 Microsoft Translator 连接。 若要将此连接添加到你的应用,请参阅有关如何管理连接的文章。
公式描述结果
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )
针对 Expressions 表中的所有记录将 Value 列的内容翻译为西班牙语(缩写为“es”)。
有时候,您需要对数据进行筛选、整形、排序和操作。 Power Apps 提供大量函数来执行此操作,如 Filter、AddColumns 和 Sort。 Power Apps 将每个表视为一个值,允许它在公式中流动和并可轻松使用。
有时您希望创建此结果的副本供将来使用,或者希望将信息从一个数据源移到另一个数据源。 Power Apps 提供 Collect 函数来复制数据。
但是,在创建该副本之前,请仔细考虑是否需要该副本。 许多情况可以通过按需使用公式对基础数据源进行筛选和整形来解决。 创建副本的一些不利影响包括:
同一信息存在两个副本意味着它们有可能不同步。
创建副本会消耗大量的计算机内存、网络带宽和/或时间。
对于大多数数据源,复制无法委派,这限制了可以移动的数据量。
以下示例使用 Products 数据源:
若要将此数据源创建为集合,请将某个 Button 控件的 OnSelect 属性设置为以下公式,打开“预览”模式,然后单击按该钮:
ClearCollect( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
我们的目标是使用一个派生表,使其中仅包含所请求数量大于可用数量并且我们需要订购的商品:
我们可以通过几种不同的方法执行此操作,所有这些方法都生成相同的结果,各有优缺点。
按需进行表整形
不要创建该副本! 我们可以在有需要的任何位置使用以下公式:
// Table shaping on demand, no need for a copy of the result
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
"Product",
"Quantity To Order"
Filter 和 AddColumns 函数分别会创建一个 记录范围来使用每条记录的 'Quantity Requested' 和 'Quantity Available' 字段执行比较和减法操作。
在此示例中,Filter 函数可以委派。 这非常重要,因为它可以找到符合条件的所有产品,即使表中的数百万产品中只有少数产品符合条件也是如此。 同时,ShowColumns 和 AddColumns 无法委派,因此,需要订购的实际产品数量将是有限的。 如果您知道此结果的大小始终比较小,则此方法很合适。
并且,因为我们没有创建副本,因此该信息没有额外的副本需要管理或者会过期。
按需 ForAll
另一种方法是使用 ForAll 函数来替换表整形函数:
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
对某些人来说,此公式可能更容易阅读和编写。
ForAll 的任何部件都不可委派。 只会对 Products 表的第一部分进行评估,如果此表非常大,这可能是一个问题。 因为 Filter 在上一示例中是可委派的,因此它可能更适用于大型数据集。
在某些情况下,可能需要数据的副本。 您可能需要将信息从一个数据源移动到另一个数据源。 在此示例中,订单是通过供应商的系统上的 NewOrder 表下达的。 为实现高速用户交互,您可能希望缓存表的一个本地副本以便消除服务器延迟。
我们使用与前面的两个示例相同的表整形,但是将结果捕获到一个集合中:
ClearCollect( NewOrder,
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
"Product",
"Quantity To Order"
ClearCollect( NewOrder,
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
ClearCollect 和 Collect 无法委派。 因此,可以通过此方式移动的数据量是有限的。
ForAll 内的 Collect
最后,我们可以直接在 ForAll 内执行 Collect:
Clear( ProductsToOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
同样,ForAll 函数此时无法委派。 如果我们的 Products 表很大,则 ForAll 将仅查找第一组记录,我们可能会错过一些需要订购的产品。 但是,对于我们知道一直会比较小的表,此方法很合适。
注意,我们未捕获 ForAll 的结果。 从其中调用的 Collect 函数将返回所有记录的 NewOrder 数据源,如果我们捕获结果,这可能会增加大量的数据。
12.Power Apps 中的 Filter、Search 和 LookUp 函数
Filter 函数查找表中满足公式的记录。 使用 Filter 可查找匹配一个或多个条件的一组记录并丢弃不匹配的记录。
LookUp 函数查找表中满足公式的第一条记录。 使用 LookUp 可查找匹配一个或多个条件的单个记录。
对于这两者,系统都会针对表的每条记录计算公式。 结果为 true 的记录将包含在结果中。 除常规公式 运算符外,还可对子字符串匹配项使用 in 和 exactin 运算符。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
Search 函数在表中查找其某个列中包含某个字符串的记录。 字符串可能出现在列中的任何位置;例如,搜索“rob”或“bert”会在包含“Robert”的列中找到匹配项。 搜索不区分大小写。 与 Filter 和 LookUp 不同,Search 函数使用单个字符串而非公式进行匹配。
Filter 和 Search 返回包含与原始表相同的列的表和匹配条件的记录。 LookUp 用公式将记录归约为单个值后,仅返回找到的第一条记录。 如果未找到记录,Filter 和 Search 将返回 空表,LookUp 将返回 空白。
表是 Power Apps 中的一个值,与字符串或数字类似。 可以向函数传递表,也可以从函数返回表。 Filter、Search 和 LookUp 不会修改表。 相反,它们将表作为参数,并从中返回表、记录或单个值。 请参阅使用表,了解更多详细信息。
如果可能,Power Apps 会将筛选和排序操作委派给数据源,并根据需要在结果中翻页。 例如,当您启动一个应用程序来显示填充了数据的 库 控件时,最初只会将第一组记录导入到设备中。 当用户滚动时,会将数据源中的其他数据转入下页。 这样,应用程序的启动时间更短,并且可以访问非常大的数据集。
但是,可能并非总是可以进行委派。 各数据源对委派支持的函数和运算符可能有所不同。 如果无法进行完全公式委派,则创作环境将用一条警告来标记无法委派的部分。 如果可能,请考虑更改公式以避免出现无法委派的函数和运算符。 委派列表详细说明了可以委派的数据源和操作。
如果无法进行委派,则 Power Apps 将仅拉取一小部分记录以在本地进行处理。 筛选和排序函数将对少数一部分记录进行操作。 库 中提供的内容可能不是整个过程,这可能会使用户感到困惑。
有关详细信息,请参阅委派概述。
Filter(Table*, Formula1 [, *Formula2*, ... ] )
Table - 必需。 要搜索的表。
Formula(s) - 必需。 计算表的每个记录时所依据的公式。 此函数返回计算结果为 true 的所有记录。 可以引用表中的列。 如果提供多个公式,则通过 And 函数将所有公式的结果合并。
Search(Table*, SearchString, Column1 [, *Column2*, ... ] )
Table - 必需。 要搜索的表。
SearchString - 必需。 要搜索的字符串。 如果为 空白 或者是空字符串,将返回所有记录。
Column(s) - 必需。 要在 表 中搜索的列的名称。 要搜索的列必须包含文本。 列名称必须是用双引号括起来的字符串。 但是,列名称必须是静态的,并且不能使用公式计算。 如果在任意这些列的数据中找到了作为部分匹配项的 SearchString ,将返回完整记录。
对于列名称带空格的 SharePoint 和 Excel 数据源,请将每个空格指定为 "_x0020_"。 例如,将 "Column Name" 指定为 "Column_x0020_Name"。
LookUp(Table*, Formula [, *ReductionFormula* ] )
Table - 必需。 要搜索的表。 在 UI 中,此语法显示为函数框上方的 源。
Formula - 必需。 计算表的每个记录时所依据的公式。 此函数返回计算结果为 true 的第一条记录。 可以引用表中的列。 在 UI 中,此语法显示为函数框上方的 条件。
ReductionFormula - 可选。 此公式会对找到的记录进行计算,然后将记录缩减为一个值。 可以引用表中的列。 如果没有使用这个参数,此函数将返回表中的完整记录。 在 UI 中,此语法显示为函数框上方的 结果。
以下示例使用 IceCream 数据源:
公式描述结果
Filter( IceCream, OnOrder > 0 )
返回 OnOrder 大于零的记录。
LookUp( IceCream, Flavor = "Chocolate", Quantity )
搜索 Flavor 等于“Chocolate”的记录,其中有一个此类记录。 对于找到的第一个记录,将返回该记录的 Quantity。
LookUp( IceCream, Quantity > 150, Quantity + OnOrder )
搜索 Quantity 大于 150 的记录,其中有多个此类记录。 对于找到的第一个 Flavor 为“Vanilla”的记录,将返回 Quantity 和 OnOrder 列的总和。
LookUp( IceCream, Flavor = "Pistachio", OnOrder )
搜索 Flavor 等于“Pistachio”的记录,其中不存在此类记录。 由于未找到匹配项,Lookup 将返回 空白。
blank
LookUp( IceCream, Flavor = "Vanilla" )
搜索 Flavor 等于“Vanilla”的记录,其中有一个此类记录。 由于未提供归约公式,因此将返回完整记录。
{ Flavor: "Vanilla", Quantity: 200, OnOrder: 75 }
13.Power Apps 中的 AddColumns、DropColumns、RenameColumns 和 ShowColumns 函数
以下函数通过调整表的列来为表造型:
将包含多个列的表缩减为包含一个列,使该表可用于 Lower 或 Abs 等单列函数。
将计算结果列(例如,显示 数量 乘以 单价 后的结果的 总价 列)添加到某个表。
使用更有意义的名称将列重命名,以便向用户显示或者在公式中使用。
表是 Power Apps 中的一个值,与字符串或数字类似。 可将表指定为公式中的参数,函数可以返回表作为结果。
本主题中介绍的函数不会修改原始表。 这些函数将该表用作参数,并转换一个应用了转换的新表。 请参阅使用表,了解更多详细信息。
无法使用这些函数修改数据源的列。 必须在数据源中修改数据。 可以使用 Collect 函数将列添加到集合。 有关更多详细信息,请参阅使用数据源。
AddColumns 函数将列添加到表,某个公式将定义该列中的值。 现有列保持不变。
将会针对表的每条记录计算该公式。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
DropColumns 函数从表中排除列。 其他所有列保持不变。 DropColumns 排除列,ShowColumns 包含列。
使用 RenameColumns 函数重命名表的一个或多个列,方法是提供至少一个参数对,用于指定表包含的列的名称(要替换的旧名称)和表不包含的列的名称(要使用的新名称)。 旧名称必须已存在于表中,新名称不能存在。 每个列名在参数列表中只能出现一次,作为旧列名或新列名。 要将列重命名为现有列名,请先使用 DropColumns 删除现有列,或者通过在另一个函数中嵌套一个 RenameColumns 函数来重命名现有列。
ShowColumns 函数包含某个表的列并删除其他所有列。 可以使用 ShowColumns 从多列表创建单列表。 ShowColumns 包含列,DropColumns 排除列。
对于所有这些函数,结果是已应用转换的新表。 不会修改原始表。 无法使用公式修改现有表。 SharePoint、Microsoft Dataverse、SQL Server 和其他数据源提供用于修改列表、表的列和表(通常称为架构)的工具。 此主题中的函数仅将输入表转换为输出表以供进一步使用,不修改原始表。
这些函数的参数支持委派。 例如,即使 '[dbo].[AllListings]' 数据源包含一百万行,用作引入相关记录的参数的 Filter 函数也会搜索所有列表:
Power Apps复制
AddColumns( RealEstateAgents,
"Listings",
Filter( '[dbo].[AllListings]', ListingAgentName = AgentName )
不过,这些函数的输出有非委派记录限制。 在此示例中,即使 RealEstateAgents 数据源有 501 个或更多记录,也仅返回 500 个记录。
如果以这种方式使用 AddColumns,Filter 必须分别对 RealEstateAgents 中每个第一条记录的数据源单独进行调用,这会引起大量的网络震颤。 如果 [dbo](.[AllListings] 足够小并且不经常更改,则可以在 OnStart 中调用 Collect 函数来在您的应用启动时在应用中缓存数据源。 或者,您可以重组应用,以便仅在用户要求时才拉入相关记录。
AddColumns( Table, ColumnName1, Formula1 [, ColumnName2, Formula2, ... ] )
Table - 必需。 要运算的表。
ColumnName(s) - 必需。 要添加的列的名称。 必须为此参数指定字符串(例如 "Name",包括双引号)。
Formula(s) - 必需。 要针对每条记录计算的公式。 结果将添加为相应新列的值。 可在此公式中引用表的其他列。
DropColumns( Table, ColumnName1 [, ColumnName2, ... ] )
Table - 必需。 要运算的表。
ColumnName(s) - 必需。 要删除的列的名称。 必须为此参数指定字符串(例如 "Name",包括双引号)。
RenameColumns( Table, OldColumnName1, NewColumnName1 [, OldColumnName2, NewColumnName2, ... ] )
Table - 必需。 要运算的表。
OldColumnName - 必需。 要从原始表重命名的列的名称。 此元素首先出现在参数对中(或者如果公式包含多个对,则首先出现在每个参数对中)。 此名称必须是字符串(例如 "Name",包括双引号)。
NewColumnName - 必需。 替换后的名称。 此元素最后出现在参数对中(或者如果公式包含多个对,则最后出现在每个参数对中)。 必须为此参数指定字符串(例如 "Customer Name",包括双引号)。
ShowColumns( Table, ColumnName1 [, ColumnName2, ... ] )
Table - 必需。 要运算的表。
ColumnName(s) - 必需。 要包含的列的名称。 必须为此参数指定字符串(例如 "Name",包括双引号)。
本部分中的示例使用 IceCreamSales 数据源,其中包含下表中的数据:
这些示例都不会修改 IceCreamSales 数据源。 每个函数将数据源的值转换为表,然后返回该值作为结果。
公式描述结果
AddColumns( IceCreamSales, "Revenue", UnitPrice * QuantitySold )
将 Revenue 列添加到结果。 对于每条记录,将计算 UnitPrice * QuantitySold,并将结果放在新列中。
DropColumns(
RenameColumns(
AddColumns( IceCreamSales, "Revenue",
UnitPrice * QuantitySold ),
"UnitPrice", "Price" ),
"Quantity" )
从公式内部开始,按顺序执行以下表转换:
- 根据针对每条记录计算 UnitPrice * Quantity 后的结果添加 Revenue 列。
- 将 UnitPrice 重命名为 Price。
- 排除 Quantity 列。
请注意,顺序很重要。 例如,不能在重命名 UnitPrice 后计算该列。
User()
当前 Power Apps 用户的所有信息记录。
{ FullName: "John Doe", Email: "john.doe@contoso.com", Image: "blob:1234...5678" }
User().Email
当前 Power Apps 用户的电子邮件地址。
“john.doe@contoso.com”
User().FullName
当前 Power Apps 用户的全名。
“John Doe”
User().Image
当前 Power Apps 用户的图像 URL。 将 Image 控件的 Image 属性设置为此值可以在应用中显示用户图像。
“blob:1234...5678”
使用 ImageControl.Image:
地址(必需),网页的 URL 或画布的应用 ID。
参数(可选),要传递到网页或画布应用的命名值。 在画布应用中,可以使用 Param 函数读取参数。
目标(可选),要在其中启动网页或画布应用的浏览器选项卡。
Launch 只能在行为公式中使用。
网页通过 URL 地址启动。 例如:
Power Apps复制
Launch( "https://bing.com" )
您可以使用 Web 链接 或 应用 ID 启动画布应用。 若要查找应用的这些值,请执行以下操作:
转至 Power Apps。
从左侧导航窗格中选择 应用。
选择您的应用。
从顶部菜单中选择 详细信息。
您还可以选择 ...(更多命令),然后从下拉菜单中选择 详细信息。
复制 Web 链接 或 应用 ID。
Web 链接 可以在任何网页中使用,将启动画布应用。 它也可以与 Launch 函数一起使用。
应用 ID 可以与 Launch 函数一起使用,但必须以 /providers/Microsoft.PowerApps/apps/
作为前缀。 例如:
Power Apps复制
Launch( "/providers/Microsoft.PowerApps/apps/f342faaf-5f82-4ace-a64b-7c1b01499231" )
设备上的本机应用无法直接启动。 在某些平台上可能有间接选项可用,例如安装自定义 URL 架构或在 Web 浏览器中注册以为特定网站提供选项的本机应用。
Launch 可以将参数传递到网页或画布应用。 可以通过两种方式提供参数:
名称/值对的参数列表。 例如:
Power Apps复制
Launch( "http://bing.com/search", "q", "Power Apps", "count", 1 )
字段值的记录。 例如:
Power Apps复制
Launch( "http://bing.com/search", { q: "Power Apps", count: 1 } )
这种形式可以使名称和值之间的关联更加清晰,因此更易于使用。 这是唯一支持可选 LaunchTarget 参数的形式。
地址和参数在传递前经过 URL 编码,来将某些非字母数字字符替换为 %
和十六进制数字,就像 EncodeUrl 函数对每个地址和参数所使用的。
启动网页时,可以在 URL 地址的末尾包含参数的查询字符串。 提供给 Launch 的所有其他参数都将添加到查询字符串的末尾。 启动画布应用时,查询字符串不起作用。
使用 LaunchTarget 参数指定在其中打开网页或应用的目标浏览器窗口。 使用以下 LaunchTarget 枚举值之一或提供自定义窗口 名称。
LaunchTarget 枚举描述
网页或应用会在新窗口或标签页中打开。
Replace
网页或应用将替换当前的窗口或标签页。
代替枚举值,使用您自己的文本字符串 命名 窗口或标签页。Self 是仅在内部使用的名称,仅由 Launch 函数使用。 它对用户看到的窗口的标题没有影响,也不会与之匹配。 如果具有给定 名称 的窗口或标签页已经存在,其内容将被替换。 否则,将创建新窗口或标签页。 名称 不能以下划线字符“_”开头。
在将 Replace 和 name 作为可用选项的 Web 浏览器中运行时,New 是默认枚举。 在移动播放器中,New 是将 指定 作为可用选项的网页的默认设置;而当前的画布应用将始终被另一个画布应用替换。
Param
当应用启动时,Param 函数可用于检索传递给应用的参数。 如果没有传递指定的参数,Param 会返回 blank。
从另一个画布应用启动画布应用时,请对 Launch 函数使用 Parameter 参数。 参数名称和值将自动进行 URL 编码。
从网页启动画布应用时,将参数添加到画布应用 Web 链接的查询字符串中。 假设已经为 tenantId
启动了查询字符串,则需要添加 ¶metername=parametervalue
。 例如,添加 &First%20Name=Vicki&category=3
会传递两个参数:值为 "Vicki"
的 First Name
和值为 "3"
的 category
(值类型为 文本)。 如果参数名称和值包含空格或特殊字符,则必须进行 URL 编码,类似于使用 EncodeURL 函数。
参数名称区分大小写。
参数名称和值将自动进行 URL 解码,以在您的应用中使用。
即使参数包含数字,Param 返回的类型也始终是文本字符串。 会自动进行其他类型的转换,或使用显式转换(例如 Value 函数)显式转换为数字。
Launch( Address [, ParameterName1, ParameterValue1, ... ] )
Address – 必需。 要启动的网页的网址或应用的 ID。
ParameterName(s) – 可选。 参数名称。
ParameterValue(s) – 可选。 要传递给应用或网页的相应参数的值。
Launch( Address, { [ ParameterName1: ParameterValue1, ... ] } [, LaunchTarget ] )
Address – 必需。 要启动的网页的网址或应用的 ID。
ParameterName(s) – 可选。 参数名称。
ParameterValue(s) – 可选。 要传递给应用或网页的相应参数的值。
LaunchTarget – 可选。 LaunchTarget 枚举值或自定义 名称。
Param( ParameterName )
ParameterName - 必需。 传递给应用的参数的名称。
以下关键字将保留供内部使用,不应用作 Param() 函数中的自定义参数:
amp%3Bauthmode
amp%3Benableonbehalfof
amp%3Bhidenavbar
amp%3Blocale
appmetadataversion
authmode
channeltype
correlationid
delegatelaunchurl
delegatelaunchurl
disablepreviewredirect
embedderorigin
enableonbehalfof
groupid
hideappsplash
hidenavbar
hostclienttype
hostmode
iframecontainerid
isfullscreen
ispreviewmode
locale
packageproperties
screencolor
sdkversion
skipappmetadata
skipiframecreation
skiplaunchappcache
source
standaloneconsent
teamid
teamtype
tenantId
theme
userteamrole
从画布应用到网页:
公式描述
Launch( "http://bing.com/search",
"q", "Power Apps", "count", 1 )
打开网页 **http://bing.com/search?q=Power%20Apps&count=1**。 将打开一个新窗口或标签页。
Launch( "http://bing.com/search",
{ q: "Power Apps", count: 1 } )
与前面的示例相同,使用等效的记录表示法。 将打开一个新窗口或标签页。
Launch( "http://bing.com/search",
{ q: "Power Apps", count: 1 },
LaunchTarget.Replace )
与前面的示例相同,如果在 Web 浏览器中运行,则将当前窗口或标签页替换为结果。
Launch( "http://bing.com/search",
{ q: "Power Apps", count: 1 },
"Search Results" )
与前面的示例相同,创建或替换名为 搜索结果 的窗口或标签页的内容。
从画布应用到画布应用
相应地更新应用 ID、屏幕名称和记录编号。
Launch( "/providers/Microsoft.PowerApps/apps/YOUR-APP-ID",
{ Navigate: "Second Screen", Record: 34 }
)
从网页到画布应用
相应地更新应用 ID、租户 ID、屏幕名称和记录编号。
<html>
<body>
<a
href="https://apps.powerapps.com/play/YOUR-APP-ID?tenantId=YOUR-TENANT-ID&Navigate=Second%20Screen&Record=34"
>
Launch canvas app
</a>
</body>
</html>
上面的简单启动示例从网页或从另一个画布应用启动画布应用,显示了 Param 函数的简单示例:
公式描述结果
Param( "Navigate" )
应用启动并返回时,将提供 Navigate 参数。
“第二个屏幕”
Param( "Record" )
应用启动时,将提供 Record 参数。 即使已将其作为数字传递给 Launch 函数,Param 的结果仍将是可以隐式或显式转换为其他类型的文本字符串。
Param( "User" )
未提供 User 参数。 返回一个 空白 值,可以使用 IsBlank 函数进行测试。
在控件上模拟选择操作,导致对 OnSelect 公式进行求值。
Select 函数在控件上模拟选择操作,就像用户已单击或点击控件一样。 结果是,在目标控件上对 OnSelect 公式求值。
使用 Select 将选择操作传播到父控件。 此类型的传播是在库等位置的默认行为。 默认情况下,Gallery 控件中的任何控件的 OnSelect 属性均设置为 Select( Parent )。 这样一来,您可以设置 Gallery 控件本身的 OnSelect 属性的值,并将对该公式求值,无论用户在库中可能单击或点击哪个位置。
如果您希望库中的一个或多个控件从库本身执行不同的操作,请将这些控件的 OnSelect 属性设置为默认值以外的其他值。 如果您希望这些控件从库本身执行同一操作,可保留库中大部分控件的 OnSelect 属性的默认值。
Select 对目标 OnSelect 排队,以便以后进行处理,此操作可能在当前公式完成求值后执行。 Select 不会导致目标 OnSelect 立即求值,Select 也不会等待 OnSelect 完成求值。
不能跨屏幕使用 Select。
只能对具有 OnSelect 属性的控件使用 Select。
只能在 行为公式中使用 Select。
控件不能通过其他控件直接或间接使用 Select。
Select 函数还可在图像库中使用。 例如,它可用来指定要在图像库中选定的行或列,或指定要在图像库的该行或该列中选定的控件。 选择某行或某列时,图像库所选内容将出现变化,并且对计算图像 Gallery 控件上的 OnSelect 公式进行求值。 如果提供了行或列中的控件,则对计算子控件的 OnSelect 公式进行求值。
Select( Control )
Control – 必需。 代表用户进行选择的控件。
Select( Control, Row or column, Child Control )
Control – 必需。 代表用户进行选择的控件。
Row or column – 不需要。 要代表用户在图像 Gallery 控件中选择的行数或列数(从 1 开始)。
Child Control - 不需要。 在要选择的“control”参数中标识的控件的子控件。
Select(button1)
Select(Gallery1, 1)
模拟用户在 Gallery1 中选择第 1 行或第 1 列的情况。
Select(Gallery1, 1, ChildControl1)
模拟用户在 Gallery1 的第 1 行或第 1 列中选择 ChildConttrol1 的情况。
17.UpdateContext 函数
使用 UpdateContext 函数创建上下文变量,该变量暂时保留一条信息,比如用户已选择某按钮的次数或数据运算的结果。
上下文变量的作用域限于一个屏幕,这意味着不能生成引用另一屏幕上的上下文变量的公式。 如果已使用另一种编程工具,可将上下文变量视为与本地变量类似。 使用 Set 函数来处理整个应用中可用的全局变量。
Power Apps 以公式为基础,这些公式会在用户与应用交互时自动重新计算。 上下文变量不具有此优势,因此在应用的创建和理解上可能难度更大。 使用上下文变量之前,请查看使用变量。
若要创建或更新上下文变量,请向 UpdateContext 函数传递一条记录。 在每条记录中指定列的名称,用于定义或匹配变量的名称以及要将该变量设为的值。
如果指定之前已定义的变量的名称,UpdateContext 会将该变量的值设置为指定的值。
如果指定尚不存在的变量的名称,UpdateContext 会以该名称创建一个变量并将该变量的值设置为指定的值。
如果之前已定义某变量,但未在这一特定 UpdateContext 公式中指定它,其值保持不变。
使用 UpdateContext 或 Navigate 函数隐式创建上下文变量。 无需显式声明。 如果删除所有 UpdateContext 和 Navigate 到上下文变量的引用,则该上下文变量将不复存在。 若要清除变量,请将其值设置为 Blank 函数的结果。
在创作环境中,可以使用“文件”菜单下的“变量”视图查看变量的值、定义和使用情况。
使用变量的列名称可引用公式中的上下文变量。 例如,UpdateContext( { ShowLogo: true } ) 创建一个名为 ShowLogo 的上下文变量,并将其值设置为 true。 然后可通过在公式中使用名称 ShowLogo 来使用此上下文变量的值。 可将 ShowLogo 编写为 Image 控件 Visible 属性的公式,然后根据上下文变量的值是 true 还是 false 来显示或隐藏该控件。
如本主题后面的示例所示,上下文变量可保留多种信息,包括:
公式的任何结果
上下文变量可保留其值,直到应用关闭。 如果定义一个上下文变量并在特定屏幕上设置其值,则该信息保持不变,即使用户切换到不同的屏幕。 应用关闭后,上下文变量的值将丢失,重新加载应用时则必须重新创建该值。
每个上下文变量的作用于限于一个屏幕。 如果想要在一个屏幕上定义上下文变量,但想要从另一个屏幕修改该变量,必须生成一个基于 Navigate 函数的公式。 或者,使用全局变量。
UpdateContext 没有返回值,只可以在行为公式中使用它。
UpdateContext( UpdateRecord )
UpdateRecord – 必需。 一条记录,其中包含至少一列的名称以及该列的值。 将为每列和指定的值创建或更新上下文变量。
UpdateContext( { ContextVariable1: Value1 [, ContextVariable2: Value2 [, ... ] ] } )
ContextVariable1 - 必需。 要创建或更新的上下文变量的名称。
Value1 - 必需。 要分配给上下文变量的值。
ContextVariable2: Value2, ... - 可选。 要创建或更新的其他上下文变量及其值。
公式描述结果
UpdateContext( { Counter: 1 } )
创建或修改上下文变量 Counter,将其值设置为 1。
Counter 的值为 1。 可通过在公式中使用名称 Counter 来引用该变量。
UpdateContext( { Counter: 2 } )
将上一示例中 Counter 上下文变量的值设置为 2。
Counter 的值为 2。
UpdateContext( { Name: "Lily", Score: 10 } )
创建或修改上下文变量 Name 和 Score,分别将它们的值设置为 Lily 和 10。
Name 的值为 Lily,Score 的值为 10。
UpdateContext( { Person: { Name: "Milton", Address: "1 Main St" } } )
创建或修改上下文变量 Person,将其值设置为一条记录。 该记录包含名为 姓名 和 地址 的两列。 姓名 列为 Milton,地址 列的值为 1 Main St。
Person 具有记录 { Name: "Milton", Address: "1 Main St" } } 的值。
使用名称 Person 整体引用此记录,或使用 Person.Name 或 Person.Address 引用此记录的单个列。
UpdateContext( { Person: Patch( Person, {Address: "2 Main St" } ) } )
搭配使用 Patch 函数更新 Person 上下文变量,将 地址 列的值设置为 2 Main St。
Person 现在具有记录 { Name: "Milton", Address: "2 Main St" } } 的值。