Microsoft Power Fx(函数)

If 和 Switch 函数

确定集中的任何条件是否为 true (If),或确定公式的结果是否与集中的任何值一致 (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 - 可选。 如果找不到匹配项,将返回此值。 如果未指定此参数,则将返回空白。

示例一:以Slider 控件(滑块)为例

//true返回"Result1",false返回"DefaultResult"
If( Slider1.Value = 25, "Result1", "DefaultResult" )

//匹配20返回"Result1",匹配10返回"Result2",未匹配返回"DefaultResult"
Switch( Slider1.Value, 20, "Result1", 10,"Result2"  "DefaultResult" )

如果未提供DefaultResult值,则返回blank

示例二:页面跳转

//如果FirstName为空则跳转页面至Screen1,否则返回上一级屏幕。
If( IsBlank( FirstName.Text ), Navigate( Screen1, ScreenTransition.Fade ), Back() )

//如果FirstName为"John",跳转至Screen2。
Switch( FirstName.Text, "Carlos", Navigate( Screen1, ScreenTransition.None ), "John", Navigate( Screen2, ScreenTransition.None ) )

示例三:分步操作

1. 添加 Text input 控件,再将它命名为 Text1。

2. 在 Text1 中,键入 30。

3. 添加一个 Label 控件,然后将 Text 属性设置为以下公式:
If( Value(Text1.Text) < 20, "Order MANY more!", Value(Text1.Text) < 40, "Order more!", Text1.Text )
此时,Label 控件显示 Order more!,因为 Text1 的值大于 20 但小于 40。

4. 在 Text1 中,键入 15。
此时,Label 控件显示 Order MANY more!,因为 Text1 的值小于 20。

5. 在 Text1 中,键入 50。
此时,Label 控件显示所键入的值,因为 Text1 的值大于 40。

Count、CountA、CountIf 和 CountRows 函数

对表中所有记录计数,或对所有满足条件的记录计数。

语法:

//Count 函数对包含单列表中数值的记录数目进行计数。
Count( SingleColumnTable )

// CountA 函数对单列表中不为空白的记录数进行计数。 此函数包括计数中的空文本 ("")。
//SingleColumnTable - 必需。 要计数的记录的列。
CountA( SingleColumnTable )

//CountIf 函数对表中逻辑公式为 true 的记录数进行计数。 该公式可以引用表的列。
//Table - 必需。 要计数的记录的表。
//LogicalFormula - 必需。 用于对表中每条记录求值的公式。 对此公式返回 true 的记录进行计数。 该公式可以引用表的列。
CountIf( Table, LogicalFormula )

//CountRows 函数对表中的记录数进行计数。
//Table - 必需。 要计数的记录的表。
CountRows( Table )

示例:

  1. 导入或创建一个名为 Inventory 的集合。

  2. 添加一个标签,然后将其 Text 属性设置为以下公式:
    CountIf(Inventory, UnitsInStock < 30)
    标签显示为 2,因为有两种产品(Ganymede 和 Callisto)的库存量小于 30 套。

  3. 添加另一个标签,然后将其 Text 属性设置为以下公式:
    CountA(Inventory.UnitsInStock)
    标签显示为 5,表示 UnitsInStock 列中非空单元格的数目。

  4. 添加另一个标签,然后将其 Text 属性设置为以下公式:
    CountRows(Inventory)
    标签显示为 5,因为该集合包含 5 行。

Filter、Search 和 LookUp 函数

查找表中的一个或多个记录。

描述:

  • Filter :函数查找表中满足公式的记录。 使用 Filter 可查找匹配一个或多个条件的一组记录并丢弃不匹配的记录。

  • Search :函数在表中查找其某个列中包含某个字符串的记录。 字符串可能出现在列中的任何位置;例如,搜索“rob”或“bert”会在包含“Robert”的列中找到匹配项。 搜索不区分大小写。 与 Filter 和LookUp 不同,Search 函数使用单个字符串而非公式进行匹配。

  • Filter 和 Search 返回包含与原始表相同的列的表和匹配条件的记录。 LookUp 用公式将记录归约为单个值后,仅返回找到的第一条记录。 如果未找到记录,Filter 和 Search 将返回空表,LookUp 将返回空白。

  • LookUp :函数查找表中满足公式的第一条记录。 使用 LookUp 可查找匹配一个或多个条件的单个记录。

示例:

//筛选 Customers 数据源,查找Name 列或 Company 列以搜索字符串(例如 co)开头的记录。 如果任一 StartsWith 函数为 true,则 || 运算符 为 true。
Filter( Customers, StartsWith( Name, SearchInput.Text ) || StartsWith( Company, SearchInput.Text ) )

//筛选 Customers 数据源,查找Name 列或 Company 列任意位置包含搜索字符串(例如co)的记录。
Filter( Customers, SearchInput.Text in Name || SearchInput.Text in Company )

//与使用 in 运算符类似,Search函数筛选 Customers 数据源,查找 Name 列或 Company 列任意位置包含搜索字符串(例如co)的记录。 如果希望指定多个列和多个 in 运算符,那么Search 函数会比 Filter 更易于读取和写入。 请注意,必须将列的名称括在双引号内。
Search( Customers, SearchInput.Text, "Name", "Company" )

//搜索 Quantity 大于 100 的记录,其中有多个此类记录。 对于找到的第一个 Flavor 为“Vanilla”的记录,将返回 Quantity 和OnOrder 列的总和。
LookUp( IceCream, Quantity > 150, Quantity + OnOrder )

//搜索 Flavor 等于“Vanilla”的记录,其中有一个此类记录。 由于未提供归约公式,因此将返回完整记录。{风格:"普通",Quantity:200,OnOrder:50 }
LookUp( IceCream, Flavor = "Vanilla" )

Update 和 UpdateIf 函数

更新数据源中的记录。

描述:

  • 使用 Update 函数可替换数据源中的整个记录, 而使用 UpdateIf 和 Patch 函数则可修改记录中的一个或多个值,对其他值不作处理。
  • 使用 UpdateIf 函数可以在一个或多个记录中修改一个或多个值,而这些记录则与一个或多个条件匹配。 条件可以是其结果为 true 或 false 的任意公式,并且可以通过名称引用数据源的列。 函数会评估每个记录的条件,并修改结果为 true 的任何记录。

示例:

//替换数据源中的某条记录。
Update( IceCream, First( Filter( IceCream, Flavor="Chocolate" ) ), { ID: 1, Flavor: "Mint Chocolate", Quantity:150 } )

//修改其 Quantity 大于 175 的记录。 Quantity 字段按 10 递增,其他字段不进行修改。
UpdateIf( IceCream, Quantity > 175, { Quantity: Quantity + 10 } )

//替换数据源中的某条记录。 替换记录中未提供 Quantity 属性,因此在结果中该属性将为空白。
Update( IceCream,
First( Filter( IceCream, Flavor="Strawberry" ) ),
{ ID: 3, Flavor: "Strawberry Swirl"} )

//将数据源中所有记录的 Quantity 属性的值设置为 0。
UpdateIf( IceCream, true, { Quantity: 0 } )

Blank、IsBlank、IsEmpty 和 Coalesce 函数

测试值是否为空白值,或测试表是否不包含任何记录,并能创建空白值。

描述:

  • Blank 函数返回空白值。
    IsBlank 函数测试空白值或空字符串。返回值为布尔值 true 或 false。

  • IsEmpty 函数用于测试表是否包含记录。
    这个函数跟使用 CountRows 函数的效果相同,只不过它是检查表中的记录数是否为零。 可以结合使用 IsEmpty 和 Errors 函数,从而检查数据源错误。返回值为布尔值 true 或 false。

  • Coalesce 函数按顺序对参数求值并返回第一个值(不是空白或空字符串)。
    如果所有参数都是空白或空字符串,函数将返回 blank,这让 Coalesce 成为将空字符串转换为空白值的好方法。
    Coalesce( value1, value2 ) 是 If( Not IsBlank( value1 ), value1, Not IsBlank( value2 ), value2 ) 的更简明的等效项,不需要对 value1 和 value2 求值两次。 如果没有“else”公式,If 函数将返回空白。

语法:

Blank()

//Value – 必需。 要测试空白值或空字符串的值。
IsBlank( Value )

//Table - 必需。 要测试是否包含记录的表。
IsEmpty( Table )

//Value(s) – 必需。 要测试的值。 按顺序计算每个值,直到找到不是空白且不是空字符串的值。 不会计算这一点之后的值。
Coalesce( Value1 [, Value2, ... ] )

示例:

IsBlank( Blank() ) //结果:true
IsBlank( "Hello" ) //结果:true
IsBlank( AnyCollection ) //由于存在集合,所以即使不包含任何记录,它的值也不是空值。 要检查是不是空集合,请使用 IsEmpty。结果:false

IsEmpty( [ 1, 2, 3 ] ) //单列表包含三条记录,所以,它不是空表。结果:false
IsEmpty( [ ] ) //单列表不包含任何记录,所以它是空表。//结果:true
IsEmpty( Filter( [ 1, 2, 3 ], Value > 5 ) ) //单列表不包含任何大于 5 的值。 筛选器没有筛选出任何记录,所以它是空表。结果:true

Coalesce( Blank(), 1 ) //结果:1
Coalesce( "", "2" ) //结果:2
Coalesce( "" ) //结果:blank

Collect、Clear 和 ClearCollect 函数

创建和清除集合,以及将记录添加到任意数据源。

描述:

  • Collect 函数将记录添加到数据源。
    以表格形式返回修改后的数据源。 Collect 只能在行为公式中使用。

  • Clear 函数删除集合的所有记录。 集合的列将保留。
    没有返回值。 只能在行为公式中使用。

  • ClearCollect 函数删除集合中的所有记录。 然后将不同的记录集添加到同一集合。 单个函数 ClearCollect 可提供 Clear 和 Collect 的组合功能。
    ClearCollect 以表形式返回修改后的集合。 ClearCollect 只能在行为公式中使用。

语法:

//DataSource – 必需。 要向其添加数据的数据源。 如果尚不存在,将创建一个新的集合。
//Item(s) - 必需。 要添加到数据源的一个或多个记录或表。
Collect( DataSource, Item, ... )

//Collection – 必需。 要清除的集合。
Clear( Collection )

//Collection – 必需。 要清除然后向其添加数据的集合。
//Item(s) - 必需。 要添加到数据源的一个或多个记录或表。
ClearCollect( Collection, Item, ... )

示例:

//清除 sumu 集合中的所有数据,然后添加一条记录。
ClearCollect( sumu , { name: "su", age: 18} )

//向 sumu 集合添加两条记录。
Collect( sumu , { name: "mu", age: 20 }, { name: "张三", age: 25 } )

//删除 sumu 集合中的所有记录。
Clear( sumu )

//除了将表整合在记录中外,与前面的示例相同。 不会提取表的记录,而是将整个表添加为记录的一个单元。
ClearCollect( sumu ,
{ MyCollect: Table( { name: "李四", age: 20 }, { name: "Lina", age: 22 } ) } )

IceCream 集合也已修改。

AddColumns、DropColumns、RenameColumns 和 ShowColumns 函数

通过添加、删除、重命名和选择表的列来为表造型。

语法:

//Table - 必需。 要运算的表。
//ColumnName(s) - 必需。 要添加的列的名称。
//Formula(s) - 必需。 用于对每条记录求值的公式。 结果将添加为相应新列的值。 可在此公式中引用表的其他列。
AddColumns( Table, ColumnName1, Formula1 [, ColumnName2, Formula2, ... ] )

//Table - 必需。 要运算的表。
//ColumnName(s) - 必需。 要删除的列的名称。
DropColumns( Table, ColumnName1 [, ColumnName2, ... ] )

//Table - 必需。 要运算的表。
//OldColumnName(s) - 必需。 要从原始表重命名的列的名称。 此元素首先出现在参数对中(或者如果公式包含多个对,则首先出现在每个参数对中)。
//NewColumnName(s) - 必需。 替换后的名称。 此元素最后出现在参数对中(或者如果公式包含多个对,则最后出现在每个参数对中)。
RenameColumns( Table, OldColumnName1, NewColumnName1 [, OldColumnName2, NewColumnName2, ... ] )

//Table - 必需。 要运算的表。
//ColumnName(s) - 必需。 要包含的列的名称。
ShowColumns( Table, ColumnName1 [, ColumnName2, ... ] )

示例:

//将 Revenue 列添加到结果。 对于每条记录,将计算 UnitPrice * QuantitySold,并将结果放在新列中。
AddColumns( IceCreamSales, Revenue, UnitPrice * QuantitySold )

//从结果中排除 UnitPrice 列。 使用此函数可排除列,使用 ShowColumns 可包含列。
DropColumns( IceCreamSales, UnitPrice )

//仅在结果中包含 Flavor 列。 使用此函数可包含列,使用 DropColumns 可排除列。
ShowColumns( IceCreamSales, Flavor )

//在结果中将 UnitPrice 列重命名。
RenameColumns( IceCreamSales, UnitPrice, Price)

//重命名结果中的 UnitPrice 和 QuantitySold 列。
RenameColumns( IceCreamSales, UnitPrice, Price, QuantitySold, Number)

//从公式内部开始,按顺序执行以下表转换
DropColumns(
RenameColumns(
AddColumns( IceCreamSales, Revenue,
UnitPrice * QuantitySold ),
UnitPrice, Price ),
Quantity )

!!!都不会修改 IceCreamSales 数据源。 每个函数将数据源的值转换为表,然后返回该值作为结果。!!!

Concat 和 Concatenate 函数

将表中的文本和字符串连成单个字符串。

描述:

  • Concatenate 函数可将混合的单独字符串和单列表中的字符串连接起来。 当对单个字符串使用此函数时,等效于使用 &运算符。

  • Concat 函数可将应用于表中所有记录的公式的结果串联起来,从而产生单个字符串。 使用这个函数可汇总表的字符串,就像 Sum 函数可以汇总数字一样。

语法:

//String(s) - 必需。 单独字符串或单列表中字符串的混合形式。
Concatenate( String1 [, String2, ...] )

//Table - 必需。 要运算的表。
//Formula - 必需。 要对表中的记录应用的公式。
//分隔符 - 可选。 要在表的串联行之间插入的文本值。
Concat( Table, Formula, separator)

示例:

//Concatenate 函数和 & 运算符
//连接 LastName 中的值、字符串 ", "(逗号后跟空格)和 FirstName 中的值。
Concatenate( LastName, ", ", FirstName ) 
与 LastName & ", " & FirstName 效果相同

//对于 Products 表中的每条记录,连接字符串 "Name: "、产品的名称、字符串 ", Type: " 和产品的类型。
Concatenate( "Name: ", Products.Name, ", Type: ", Products.Type )

//对 Products 的每条记录的表达式 Name 求值,然后将结果连接在一起成为单个文本字符串,以 ", " 分隔。
Concat( Products, Name, ", " )
//对 Products 的每条记录的表达式 "'" & Name & "'" 求值,然后将结果连接在一起成为单个文本字符串,以 ", " 分隔。
Concat( Products, "'" & Name & "'", ", " )
//计算满足筛选条件 Type = "String" 的 Products 的每条记录的公式 Name,然后将结果连接为单个文本字符串,以 ", " 分隔。
Concat( Filter( Products, Type = "String" ), Name, ", " )
//Split 反转操作
Split( Concat( Products, Name, ", " ), "、 " )  //使用分隔符 "、 " 拆分文本字符串。

Patch 函数

在数据源中修改或创建一条或多条记录,或者合并数据源外的记录。

//使用 Patch 函数可修改数据源的一条或多条记录。 可以在不影响其他属性的情况下修改特定字段的值。 
//例如,以下公式更改名为 Contoso 的客户的电话号码:
Patch( Customers, First( Filter( Customers, Name = "Contoso" ) ), { Phone: "1-212-555-1234" } )

//结合使用 Patch 和 Defaults 函数可创建记录。 可以利用此行为生成一条记录,以供创建和编辑记录。 
//例如,以下公式为名为 Contoso 的客户创建记录:
Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

//即使不需要使用数据源,也可以使用 Patch 来合并两条或多条记录。 
//例如,以下公式将两个记录合并成一个同时识别 Contoso 的电话号码和位置的记录:
Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

变量

//全局变量(范围:应用)
Set( MyVar, 1 )

//上下文变量(范围:屏幕)
UpdateContext( { MyTotal: 0 } )
Navigate( Screen2, None, { MyTotal: -1000 } ) //跳转Screen2当前MyTotal定义的屏幕才有效

//集合(范围:应用)
Collect( MyCollect, TextInput1.Text ) 

Sum( MyCollect, Value ) // 显示汇总
Clear( MyCollect); LoadData( MyCollect, "StoredMyCollect", true ) //先清除再加载数据
SaveData( MyCollect, "StoredMyCollect" ) //保存

SaveData、LoadData 和 ClearData 函数

从应用主机的存储保存和重新加载集合。

//将 LocalCache 集合以名称“MyCache”保存到用户设备中,以供 LoadData 稍后检索。
SaveData( LocalCache, "MyCache" )

//从用户设备以名称“MyCache”加载 LocalCache 集合,该集合先前已使用 SaveData 调用存储。
LoadData( LocalCache, "MyCache" )

//清除名称“MyCache”下的存储。 此名称下存储的所有数据将不再通过 LoadData 提供。
ClearData( "MyCache" )

//清除与此应用关联的所有存储。 其他应用存储的数据不受影响。
ClearData()

Concurrent 函数

并发计算多个公式。

Concurrent(
    ClearCollect( Product, '[SalesLT].[Product]' ),
    ClearCollect( Customer, '[SalesLT].[Customer]' ),
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ),
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
)
posted @ 2024-04-25 09:12  苏沐~  阅读(129)  评论(0编辑  收藏  举报