适用于: 画布应用
Copilot Studio
Desktop 流
模型驱动应用
Power Platform CLI
Dataverse 函数
Power Pages
描述
该 ForAll 函数计算表中所有记录的公式。 该公式可以计算值并/或执行操作,例如修改数据或使用连接。 使用 With 函数评估单个记录的公式。
将 Sequence 函数 与函数一起使用 ForAll ,以基于计数进行循环访问。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
返回值
每个公式求值的结果都在表中返回,并采用与输入表相同的顺序。
如果公式的结果是单个值,则生成的表是单列表。 如果公式的结果是一条记录,则结果表将包含与结果记录具有相同列的记录。
如果公式的结果为 空 值,则该输入记录的结果表中没有记录。 在这种情况下,结果表中的记录数比源表少。
执行操作
公式可以包含用于执行操作的函数,例如使用 Patch 和 Collect 函数修改数据源的记录。 公式还可以调用针对连接的方法。 可以通过使用 ; 运算符对每条记录执行多个操作。 不能修改该函数的主题的 ForAll 表。
在编写公式时,请记住,可以按任何顺序处理记录,并且有可能可以并行处理。 可以在表的最后一条记录后处理第一条记录。
请小心避免使用排序依赖关系。 因此,不能在函数中使用 ForAllUpdateContext、Clear 和 ClearCollect 函数,因为它们可以轻松用于保存容易受此影响影响的变量。 您可以使用 Collect,但添加记录的顺序是不确定的。
多个可修改数据源的函数(包括 Collect、Remove 和 Update)会将更改后的数据源作为其返回值来返回。 如果为表的每个记录 ForAll 返回,则这些返回值可能很大,并且消耗大量资源。 还可以发现这些返回值不是预期值,因为 ForAll 可以并行运行,并且可能会将这些函数的副作用与获取其结果分开。 如果未使用返回值 ForAll (通常是数据修改函数的情况),则不会创建返回值,并且没有任何资源或顺序问题。 但是,如果使用的是返回数据源的函数 ForAll 和函数之一的结果,请仔细考虑如何构造结果,并在小型数据集上先试用它。
替代方法
Power Apps 中的许多函数可以使用单列表一次处理多个值。 例如,Len 函数可以处理一个文本值表,以相同的方式返回长度表。ForAll 这可以消除在许多情况下使用 ForAll 的需求,可以更高效,并且更易于阅读。
另一个考虑因素是 ForAll ,在其他函数(如 Filter)时不可委派。
代理
与数据源一起使用时,无法委派此函数。 将仅检索数据源的第一部分,然后应用该函数。 结果并不能代表整个过程。 创作时可能会显示一条警告,以提醒您有此限制,并建议尽可能切换到可委派的替代项。 有关详细信息,请参阅委派概述。
语法
ForAll(表, 公式)
- Table - 必需。 要对其执行操作的表。
- 公式 - 必需。 用于对 Table 中的所有记录进行求值的公式。
示例
计算
以下示例使用 Squares数据源:
若要将此数据源创建为集合,请将某个 Button 控件的 OnSelect 属性设置为以下公式,打开“预览”模式,然后单击按该钮:
ClearCollect( Squares, [ "1", "4", "9" ] )
| 公式 | 描述 | 结果 |
|---|---|---|
|
ForAll(方块、Sqrt(值) Sqrt(方块) |
针对输入表中的所有记录计算 Value 列的平方根。 Sqrt 函数还可以与单列表一起使用,因此可以在不使用的情况下ForAll执行此示例。 |
|
| ForAll(方块,幂(值,3) | 针对输入表中的所有记录计算 Value 列的三次幂。 Power 函数不支持单列表。 因此, ForAll 在这种情况下必须使用。 |
|
使用连接
以下示例使用 Expressions数据源:
若要将此数据源创建为集合,请将某个 Button 控件的 OnSelect 属性设置为以下公式,打开“预览”模式,然后单击按该钮:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
此示例还使用一个 Microsoft Translator 连接。 若要将此连接添加到你的应用,请参阅有关如何管理连接的文章。
| 公式 | 描述 | 结果 |
|---|---|---|
| ForAll(表达式,MicrosoftTranslator.Translate(值,“es”)) | 针对 Expressions 表中的所有记录将 Value 列的内容翻译为西班牙语(缩写为“es”)。 |
|
| ForAll(表达式,MicrosoftTranslator.Translate(值,“fr”)) | 针对 Expressions 表中的所有记录将 Value 列的内容翻译为法语(缩写为“fr”)。 |
|
复制表
有时候,您需要对数据进行筛选、整形、排序和操作。 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
最后,我们可以直接在以下项ForAll中执行 Collect:
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
同样, ForAll 目前无法委托函数。 如果 “产品 ”表很大, ForAll 则只查看第一组记录,我们可能会错过需要订购的某些产品。 但是,对于我们知道的表仍然很小,这种方法很好。
请注意,我们不会捕获结果 ForAll。 从它内部进行的 Collect 函数调用返回所有记录的 NewOrder 数据源,如果我们正在捕获这些数据,可能会增加大量数据。
映射组件中的表
请参阅映射表。