With 函数
适用于: 画布应用 桌面流 模型驱动应用 Power Pages Power Platform CLI
计算值的结果并对单个记录(包括命名值中的内联记录)执行操作。
描述
With 函数计算单个记录的公式。 该公式可以计算值并/或执行操作,例如修改数据或使用连接。 使用 ForAll 函数可以计算记录表中的所有记录的公式。
当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围。
使用 With 可以通过将复杂公式拆分为更小的命名子公式,来提高这些复杂公式的可读性。 这些命名值就像简单的局部变量一样,限制在 With 的作用域中。 与 UpdateContext 函数一起使用的内联记录语法可以与 With 一起使用。 与上下文或全局变量相比,优先使用 With,因为它是自包含的,易于理解,并且可以在任何声明性公式上下文中使用。
使用 With 可以访问由诸如 Patch 或 Match 等函数返回的记录的字段。 With 保存这些函数的值足够长的时间,以便在进一步的计算或操作中使用。
如果 With 的 Record 参数是一个错误,该错误将由函数返回,并且不会计算 Formula。
语法
with( 记录, 公式 )
- 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
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 中均可用。
由于 Slider 控件只能以 1 的增量移动,因此可以通过与滑块相除或相乘来有效创建自定义增量。 对于利率,RateSlider 将其 Max 属性设置为 48,除以 8 得到 1/8 个百分点的增量,除以 100 从百分比转换为小数,涵盖范围从 0.125% 到 6%。 对于贷款金额,AmountSlider 将其 Max 属性设置为 60,并乘以 10,000,涵盖范围为 10,000 到 600,000。
With 会随着滑块的移动自动重新计算并显示新的贷款付款。 不使用变量,也不需要使用 Slider 控件的 OnChange 属性。
以下是创建此应用的详细说明:
- 创新一个新应用。
- 添加 Slider 控件,然后将其命名为 RateSlider。 将其 Max 属性设置为 48。
- 在 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Interest Rate:"。
- 在 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 RateSlider/8 & " %"。
- 添加另一个 Slider 控件,并将其命名为 AmountSlider。 将其 Max 属性设置为 60。
- 在此 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Loan Amount:"。
- 在此 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 AmountSlider/8 * 10000。
- 添加另一个 Slider 控件,并将其命名为 YearsSlider。 将其 Max 属性设置为 40。
- 在此 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Number of Years:"。
- 在此 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 YearsSlider。
- 添加一个 Label 控件,然后将 Text 属性设置为上方所示的公式。
- 在上一个 Label 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Recurring Monthly Payment:"。
从 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 函数转换为数字。
映射组件中的记录
请参阅映射记录。