ForAll 函式

適用於: 畫布應用程式 桌面流程 模型導向應用程式 Power Platform CLI

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

描述

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

使用 Sequence 函式搭配 ForAll 函式,根據計數進行反覆運算。

目前處理中的記錄其各個欄位可供您在公式內使用。 使用 ThisRecord 運算子,,或只需依名稱參照欄位,就像任何其他的值一樣。 As 運算子也可以用來命名所處理的記錄,這有助於讓您的公式更易於了解並讓嵌套記錄可以存取。 如需更多資訊,請參閱下列範例以及 處理記錄範圍

傳回值

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

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

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

採取動作

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

在撰寫您的公式時,請記住記錄可依任何順序處理,可能的話,請以平行方式處理。 資料表的第一筆記錄可能會在最後一筆記錄之後處理。

請小心避免順序相依性。 基於這個理由,您不能使用 ForAll 函式內的 UpdateContextClearClearCollect 函式,因為它們可輕易用來保存會受到此效果威脅的變數。 您可以使用 Collect,但新增記錄的順序並未定義。

修改資料來源的幾個函式包括 CollectRemoveUpdate,會傳回已變更的資料來源做為其傳回值。 如果 ForAll 資料表的每筆記錄已傳回,這些傳回值會很大且會耗用大量資源。 您也可以發現這些傳回值不如預期,因為 ForAll 會平行作業且可能分開這些函式取得結果的負面效果。 如果來自 ForAll 的傳回值並未實際使用,其通常是使用資料修改函式時的情況,則將不會建立傳回值,且沒有任何資源或順序問題。 但如果您正在使用 ForAll 結果和傳回資料來源的函式,請務必審慎思考您該如何組構結果並先試做小型資料集。

替代項目

Power Apps 中有許多函式可一次透過單一欄位資料表的使用處理一個以上的值。 例如,Len 函式可處理文字值資料表並傳回長度資料表,方式和 ForAll 同。 這會消除許多情況下使用 ForAll 的需要,能因此更有效率且更易於閱讀。

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

委派

搭配資料來源使用時,無法委派此函式。 將僅擷取資料來源的第一個部分,然後再套用函式。 結果不一定代表完整的全貌。 製作期間可能會出現警告,提醒您有此限制並建議盡可能切換至可委派的替代函式。 如需詳細資訊,請參閱委派概觀

語法

ForAll( Table, Formula )

  • Table – 必要。 預計採取動作的資料表。
  • Formula – 必要項目。 預計評估 資料表 記錄的公式。

範例

計算

以下範例使用 Squares資料來源

Squares 範例。

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

ClearCollect( Squares, [ "1", "4", "9" ] )

公式 描述 結果
ForAll( Squares, Sqrt( Value ) )

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

使用連線

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

運算式範例。

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

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

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

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

複製資料表

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

有時您想要製作此結果的複本供稍後使用,或者想要將資訊從一個資料來源移至另一個。 Power Apps 提供 Collect 函式複製資料。

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

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

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

產品資料來源的範例。

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

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"
)

記錄範圍 是由 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( NewOrder );
ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        Collect( NewOrder,
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

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

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

對應元件中的資料表

參閱對應資料表