With 函式
適用於: 畫布應用 桌面流 模型驅動應用 Power Pages Power Platform CLI
針對單一 記錄 計算值並執行動作,包括具名值的內嵌記錄。
描述
With 函式評估單一記錄的公式。 該公式可計算值,與/或執行動作,例如修改資料或使用連線。 使用 ForAll 函式評估記錄資料表中所有記錄的公式。
目前處理中的記錄其各個欄位可供您在公式內使用。 使用 ThisRecord 運算子,,或只需依名稱參照欄位,就像任何其他的值一樣。 As 運算子也可以用來命名所處理的記錄,這有助於讓您的公式更易於了解並讓嵌套記錄可以存取。 如需更多資訊,請參閱下列範例以及 處理記錄範圍。
使用 With 將複雜公式分成較小的具名子公式,以改善其可讀性。 這些具名值的行為類似將簡單的本機變數限制為 With 範圍。 與 UpdateContext 函式 搭配使用的相同內嵌記錄語法可以搭配 With 使用。 使用 With 勝於上下文或全域變數因其包含的易於理解,而且可用在任何宣告性公式上下文中。
使用 With 存取函數傳回的記錄欄位,例如 Patch 或 Match。 With 保存這些函數的值足夠長的時間,以便在進一步的計算或操作中使用。
若 With 的 Record 引數有誤,函式會傳回該錯誤,而且 公式 將不會進行評估。
語法
with( 記錄, 公式 )
- record– 必需。 記錄必須進行動作。 如果是名稱值,請使用內嵌語法
{ name1: value1, name2: value2, ... }
- Formula(公式) –必需。 評估 記錄 的公式。 公式可直接將任何 記錄 欄位參考為記錄範圍。
範例
簡單具名值
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。
既然滑塊控制項只能以 1 增量移動,滑塊會被相除或相乘以有效建立自訂增量。 以利率為例,RateSlider 的 Max 屬性會設定為 48,除以 8 表示 1/8 百分比點增量,再除以 100 從百分比轉換為小數點,涵蓋範圍 0.125% 到 6%。 在貸款金額的案例中,AmountSlider 的 Max 屬性設定為 60,並乘以 10000,涵蓋範圍 10,000 至 600,000。
With 會在滑塊移動時自動重新計算,並顯示新的貸款款項。 不會使用任何變數,也不需要使用滑塊控制項的 OnChange 屬性。
以下是建立此應用程式的詳細指示:
- 建立新的應用程式。
- 新增 Slider 控制項並將其命名為 RateSlider。 將其 Max 屬性設定為 48。
- 將 Label 控制項 新增至滑塊控制項的左側。 將其 Text 屬性設為 "Interest Rate:"。
- 將 Label 控制項新增至滑塊控制項的右側。 將其 Text 屬性設定為公式 RateSlider/8 & " %"。
- 新增另一個 Slider 控制項並將其命名為 AmountSlider。 將其 Max 屬性設定為 60。
- 將 Label 控制項新增至此滑塊控制項的左側。 將其 Text 屬性設為 "Loan Amount:"。
- 將 Label 控制項新增至此滑塊控制項的右側。 將其 Text 屬性設定為公式 AmountSlider/8 * 10000。
- 新增另一個 Slider 控制項並將其命名為 YearsSlider。 將其 Max 屬性設定為 40。
- 將 Label 控制項新增至此滑塊控制項的左側。 將其 Text 屬性設為 "年數:"。
- 將 Label 控制項新增至此滑塊控制項的右側。 將其 Text 屬性設定為公式 YearSlider。
- 新增 Label 控制項,並將其Text屬性設定為如上所示的公式。
- 將 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 函式轉換成數字。
對應元件中記錄
參閱對應記錄。