With 函数

适用于:画布应用桌面流模型驱动应用 Power Platform CLI

计算值的结果并对单个记录(包括命名值中的内联记录)执行操作。

描述

With 函数计算单个记录的公式。 该公式可以计算值并/或执行操作,例如修改数据或使用连接。 使用 ForAll 函数可以计算记录表中的所有记录的公式。

当前正在处理的记录的字段在公式中可用。 可以使用 ThisRecord 运算符,也可以只按名称引用字段,就像引用任何其他值一样。 As 运算符也可用于为正在处理的记录命名,从而使您的公式更易于理解,并且使嵌套记录可以被访问。 有关详细信息,请参阅以下示例和使用记录范围

使用 With 可以通过将复杂公式拆分为更小的命名子公式,来提高这些复杂公式的可读性。 这些命名值就像简单的局部变量一样,限制在 With 的作用域中。 与 UpdateContext 函数一起使用的内联记录语法可以与 With 一起使用。 与上下文或全局变量相比,优先使用 With,因为它是自包含的,易于理解,并且可以在任何声明性公式上下文中使用。

使用 With 可以访问由诸如 PatchMatch 等函数返回的记录的字段。 With 将这些函数的值保留足够长的时间,以用于进一步的计算或操作。

如果 WithRecord 参数是一个错误,该错误将由函数返回,并且不会计算 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

使用 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 属性。

以下是创建此应用的详细说明:

  1. 创新一个新应用。
  2. 添加 Slider 控件,然后将其命名为 RateSlider。 将其 Max 属性设置为 48。
  3. 在 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Interest Rate:"
  4. 在 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 RateSlider/8 & " %"
  5. 添加另一个 Slider 控件,并将其命名为 AmountSlider。 将其 Max 属性设置为 60。
  6. 在此 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Loan Amount:"
  7. 在此 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 AmountSlider/8 * 10000
  8. 添加另一个 Slider 控件,并将其命名为 YearsSlider。 将其 Max 属性设置为 40。
  9. 在此 Slider 控件的左侧添加一个 Label 控件。 将其 Text 属性设置为 "Number of Years:"
  10. 在此 Slider 控件的右侧添加一个 Label 控件。 将其 Text 属性设置为公式 YearsSlider
  11. 添加一个 Label 控件,然后将 Text 属性设置为上方所示的公式。
  12. 在上一个 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 函数转换为数字。

映射组件中的记录

请参阅映射记录