ForAll 函式
適用於: 畫布應用 桌面流 模型驅動應用 Power Pages Power Platform CLI
描述
ForAll 函式會評估資料表所有記錄的公式。 該公式可計算值,與/或執行動作,例如修改資料或使用連線。 使用 With 函式來評估單一記錄的公式。
使用 Sequence 函式搭配 ForAll 函式,根據計數進行反覆運算。
目前處理中的記錄其各個欄位可供您在公式內使用。 使用 ThisRecord 運算子,,或只需依名稱參照欄位,就像任何其他的值一樣。 As 運算子也可以用來命名所處理的記錄,這有助於讓您的公式更易於了解並讓嵌套記錄可以存取。 如需更多資訊,請參閱下列範例以及 處理記錄範圍。
傳回值
會在資料表中傳回每個公式評估的結果,與輸入資料表的順序相同。
如果公式的結果是單一值,則產生的資料表將為單一欄位資料表。 如果公式的結果是一筆記錄,則產生的資料表會包含具有與結果記錄相同之資料行的記錄。
如果公式的結果為空白值,則該輸入記錄的結果資料表中不會有任何記錄。 在此情況下,結果資料表中的記錄會比來源資料表的記錄少。
採取動作
公式會包括採取行動的函式,例如使用 Patch 和 Collect 函式修改資料來源的記錄。 此公式也可以呼叫連線上的方法。 每筆記錄可以執行多個動作,方法為使用 ; 運算子。 您無法修改 ForAll 函式主題的資料表。
在撰寫您的公式時,請記住記錄可依任何順序處理,可能的話,請以平行方式處理。 資料表的第一筆記錄可能會在最後一筆記錄之後處理。
請小心避免順序相依性。 基於這個理由,您不能使用 ForAll 函式內的 UpdateContext、Clear 和 ClearCollect 函式,因為它們可輕易用來保存會受到此效果威脅的變數。 您可以使用 Collect,但新增記錄的順序並未定義。
修改資料來源的幾個函式包括 Collect、Remove 和 Update,會傳回已變更的資料來源做為其傳回值。 如果 ForAll 資料表的每筆記錄已傳回,這些傳回值會很大且會耗用大量資源。 您也可以發現這些傳回值不如預期,因為 ForAll 會平行作業且可能分開這些函式取得結果的負面效果。 如果來自 ForAll 的傳回值並未實際使用,其通常是使用資料修改函式時的情況,則將不會建立傳回值,且沒有任何資源或順序問題。 但如果您正在使用 ForAll 結果和傳回資料來源的函式,請務必審慎思考您該如何組構結果並先試做小型資料集。
替代項目
Power Apps 中有許多函數可一次透過單一欄位資料表的使用處理一個以上的值。 例如,Len 函式可處理文字值資料表並傳回長度資料表,方式和 ForAll 同。 這會消除許多情況下使用 ForAll 的需要,能因此更有效率且更易於閱讀。
另一項考量是 ForAll 無法委派,而其他函式可以,例如 Filter。
委派
搭配資料來源使用時,無法委派此函數。 將僅擷取資料來源的第一個部分,然後再套用函數。 結果不一定代表完整的全貌。 製作期間可能會出現警告,提醒您有此限制並建議盡可能切換至可委派的替代函數。 如需詳細資訊,請參閱委派概觀。
語法
ForAll(表, 公式)
- Table - 必需。 預計採取動作的資料表。
- 公式 - 必需。 預計評估 資料表 記錄的公式。
範例
計算
以下範例使用 Squares 資料來源:
若要建立此資料來源做為集合,將Button的 OnSelect 屬性設為此公式、開啟預覽模式,然後選取按鈕︰
ClearCollect( Squares, [ "1", "4", "9" ] )
公式 | 描述 | 結果 |
---|---|---|
ForAll (squares,sqrt(值)) Sqrt(方塊) |
關於輸入資料表的所有記錄,計算 Value 欄位的平方根。 Sqrt 函數也可搭配單欄位資料表使用,使其有可能在不使用 ForAll 情況下執行此範例。 | |
ForAll (平方,冪(值,3)) | 針對輸入資料表的所有記錄,將 Value 欄位做為三次方。 Power 函式不支援單一欄位的資料表。 因此,在此情況下必須使用 ForAll。 |
使用連線
下列範例會使用運算式資料來源:
若要建立此資料來源做為集合,將Button的 OnSelect 屬性設為此公式、開啟預覽模式,然後選取按鈕︰
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
此示例還使用 Microsoft Translator 連接。 若要將此連線新增至您的應用程式,請參閱關於如何管理連線的文章。
公式 | 描述 | 結果 |
---|---|---|
ForAll (Expressions,MicrosoftTranslator.Translate(value,“es”)) | 針對運算式資料表中的所有記錄,將 值 欄位的內容翻譯成西班牙文 (縮寫為 "es")。 | |
ForAll (表達式,MicrosoftTranslator.Translate(值,“fr”)) | 針對運算式資料表中的所有記錄,將 值 欄位的內容翻譯成法文 (縮寫為 "fr")。 |
複製資料表
有時候您需要篩選、塑造、排序和操作資料。 Power Apps 提供許多用來執行此動作的函式,例如 Filter、AddColumns 及 Sort。 Power Apps 會將每個資料表視為值,使其流經公式,並可輕鬆取用。
有時您想要製作此結果的複本供稍後使用,或者想要將資訊從一個資料來源移至另一個。 Power Apps 提供 Collect 函式複製資料。
但是,在製作該複本之前,請仔細考慮是否需要。 使用公式隨需篩選及塑造基礎資料來源可以解決許多情況。 製作複本的一些缺點包括︰
- 相同資訊的兩份副本表示其中一份可能會不同步。
- 製作複本可能會耗用大量電腦記憶體、網路頻寬和/或時間。
- 對於大部分的資料來源,複製無法委派,會限制可移動的資料量。
下列範例會使用產品資料來源:
若要建立此資料來源做為集合,將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 的任何部分皆不可委派。 只有產品資料表的第一個部份會受評估,如果此資料表很大,這可能是問題。 因為 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 資料來源,因此如果我們予以擷取,可能會累積大量的資料。
對應元件中的資料表
參閱對應資料表。