計算值並對資料表的所有記錄執行動作。

說明

ForAll 函式會評估資料表所有記錄的公式。 該公式可以計算值,並/或執行動作,例如修改資料或使用連線。

在公式內可使用目前處理之記錄的欄位。 您只要依名稱 (如同任何其他值) 來參考這些欄位。 您也可以參考整個應用程式中的控制項屬性和其他值。 如需詳細資訊,請參閱以下範例和處理記錄範圍

傳回值

會在資料表中傳回每個公式評估的結果,與輸入資料表的順序相同。

如果公式的結果是單一值,則產生的資料表為單一資料行的資料表。 如果公式的結果是一筆記錄,則產生的資料表會包含具有與結果記錄相同之資料行的記錄。

如果公式的結果為空白值,則該輸入記錄的結果資料表中不會有任何記錄。 在此情況下,結果資料表中的記錄會比來源資料表的記錄少。

採取動作

公式可以包含採取行動的函式,例如使用 PatchCollect 函式修改資料來源的記錄。 此公式也可以在連線上呼叫方法。 每筆記錄可以執行多個動作,方法為使用 ; 運算子。 您無法修改 ForAll 函式之主題的資料表。

在撰寫您的公式時,請記住,記錄可以依任何順序處理,可能的話,請以平行方式處理。 資料表的第一筆記錄可能會在最後一筆記錄之後處理。 請小心避免順序相依性。 基於這個理由,您不能使用 ForAll 函式內的 UpdateContextClearClearCollect 函式,因為它們可輕易地用來保存會受到此效果威脅的變數。 您可以使用Collect,但新增記錄的順序並未定義。

修改資料來源的多個函式,包括 CollectRemoveUpdate,會傳回已變更的資料來源做為其傳回值。 這些傳回值如果傳回 ForAll 資料表的每一筆記錄,則傳回值可能會很大而且會耗用大量資源。 您也可能會發現這些傳回值並不如預期,因為 ForAll 可以平行操作,且可能會隔開這些函式的副作用而無法取得其結果。 幸運的是,如果來自 ForAll 的傳回值並未實際使用,其通常是使用資料修改函式時的情況,則將不會建立傳回值,且沒有任何資源或排序問題。 但是,如果您是使用 ForAll 和其中一個傳回資料來源之函式的結果,請仔細思考如何架構結果,並先在小的資料集試試看。

替代項目

PowerApps 中的許多函式可以透過使用單一資料行的資料表一次處理多個值。 例如,Len 函式可以 ForAll 可進行的相同方式處理文字值的資料表,傳回長度的資料表。 這在許多情況下不需要使用 ForAll、可以更有效率,而且更容易閱讀。

另一個考量是,ForAll 尚無法委派,而其他函式則可以,例如 Filter

委派

此函式搭配資料來源使用時無法委派。 系統將只擷取資料來源的第一個部分,然後套用函式。 結果可能無法代表全貌。 編寫階段時會以藍點提醒您這項限制,並建議在可能的情況下切換為可委派的替代項目。 如需詳細資訊,請參閱委派概觀

語法

ForAll( Table, Formula )

  • Table - 必要項目。 要執行時所依據的資料表。
  • Formula - 必要項目。 所有*資料表*的記錄所要評估的公式。

範例

計算

下列範例會使用計算平方資料來源

若要建立此資料來源做為集合,將按鈕OnSelect 屬性設為此公式、開啟預覽模式,然後按一下或點選按鈕︰

  • ClearCollect( Squares, [ "1", "4", "9" ] )
公式 說明 結果
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
針對輸入資料表的所有記錄,計算資料行的平方根。 Sqrt 函式也可與單一資料行的資料表搭配使用,讓它不使用 ForAll 即可執行此範例。
ForAll( Squares, Power( Value, 3 ) ) 針對輸入資料表的所有記錄,將資料行做為三次方。 Power 函式不支援單一資料行的資料表。 因此,在此情況下必須使用 ForAll

使用連線

下列範例會使用運算式資料來源

若要建立此資料來源做為集合,將按鈕OnSelect 屬性設為此公式、開啟預覽模式,然後按一下或點選按鈕︰

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

此範例也會使用 Microsoft Translator 連線。 若要將此連線新增至您的應用程式,請參閱關於如何管理連線的主題。

公式 說明 結果
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) 針對運算式資料表中的所有記錄,將資料行的內容轉譯成西班牙文 (縮寫為 "es")。
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) 針對運算式資料表中的所有記錄,將資料行的內容轉譯成法文 (縮寫為 "fr")。

複製資料表

有時候您需要篩選、塑造、排序和操作資料。 PowerApps 提供數個函式來執行此操作,例如 FilterAddColumnsSort。 PowerApps 會將每個資料表視為值,使其流經公式,並可輕鬆取用。

有時候您會想要複製一份此結果以供稍後使用。 或者,您會想要從一個資料來源將資訊移到另一個資料來源。 PowerApps 提供 Collect 函式來複製資料。

但是,在製作該複本之前,請仔細考慮是否真的需要。 使用公式隨需篩選及塑造基礎資料來源可以解決許多情況。 製作複本的一些缺點包括︰

  • 相同資訊的兩份副本表示其中一份可能會不同步。
  • 製作複本可能會耗用大量電腦記憶體、網路頻寬和/或時間。
  • 對於大部分的資料來源,複製無法委派,會限制可移動的資料量。

下列範例會使用產品資料來源

若要建立此資料來源做為集合,將按鈕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 } ) )

我們的目標是要使用只包含要求大於可用之項目,以及我們需要下訂單的衍生資料表︰

我們可以透過幾個不同的方式來執行這項工作,全都會產生相同的結果,與不同的優缺點。

隨選成形的資料表

不要製作該複本! 我們可以在任何所需之處使用下列公式︰

  • ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )

記錄範圍是由 FilterAddColumns 函式所建立,分別可執行比較和減法運算,使用每一筆記錄的 'Quantity Requested''Quantity Available' 欄位。

在此範例中,可以委派 Filter 函式。 這很重要,因為它可找到符合準則的所有產品,即使這只是數以百萬計的資料表中少數的記錄。 此時,無法委派 ShowColumnsAddColumns,因此需要訂購之產品的實際數目會受到限制。 如果您知道這個結果的大小一律會相對較小,則這種方法是正常的。

而且因為我們沒有製作副本,所以沒有任何額外的資訊複本需要管理或過期。

隨選 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' } ) ) )

無法委派 ClearCollectCollect。 因此,可以這種方式移動的資料數量會很有限。

在 ForAll 內收集

最後,我們可以直接在 ForAll 內執行 Collect

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

同樣地,此時無法委派 ForAll 函式。 如果我們的產品資料表很大,ForAll 只會查看第一組記錄,且我們可能會遺失某些需要排序的產品。 但是對於我們知道會維持很小的資料表,則適合這種方法。

請注意,我們不會擷取 ForAll 的結果。 從其中產生的 Collect 函式呼叫會傳回所有記錄的 NewOrder 資料來源,因此如果我們予以擷取,可能會累積大量的資料。