共用方式為


ForAll 函數

適用於: 畫布應用程式 Copilot Studio 桌面流程 模型導向應用程式 Power Platform CLI Dataverse 函數 Power Pages

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

描述

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

Sequence 函數 與函數 ForAll 搭配使用,以根據計數進行反覆專案。

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

傳回值

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

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

如果公式的結果是 空白 值,則該輸入記錄的結果表格中沒有記錄。 在此情況下,結果資料表中的記錄少於來源資料表。

採取動作

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

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

請小心避免順序相依性。 因此,您無法在函式內ForAll使用 UpdateContextClearClearCollect 函式,因為它們很容易用來保存容易受到此影響的變數。 您可以使用 Collect,但新增記錄的順序並未定義。

修改資料來源的幾個函式包括 CollectRemoveUpdate,會傳回已變更的資料來源做為其傳回值。 這些傳回值可能很大,如果針對資料表的 ForAll 每筆記錄傳回,則會耗用大量資源。 您可能還會發現這些傳回值不是您預期的,因為 ForAll 可以平行運作,而且可能會將這些函式的副作用與取得其結果分開。 如果未使用 from 傳 ForAll 回值 (資料修改函式通常就是這種情況),則不會建立傳回值,而且沒有資源或順序問題。 但是,如果您使用傳回資料來源的函式之一的結果 ForAll ,請仔細考慮如何建構結果,並先在小型資料集上試用。

替代項目

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

另一個考慮因素是 不可 ForAll 委派,而其他功能可能是可委派的,例如 過濾器

委派

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

語法

ForAll公式

  • Table - 必需。 預計採取動作的資料表。
  • 公式 - 必需。 預計評估 資料表 記錄的公式。

範例

計算

以下範例使用 Squares資料來源

Squares 範例。

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

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

公式 描述 結果
ForAll( 正方形, sqrt( 值 ) )

Sqrt(方塊)
關於輸入資料表的所有記錄,計算 Value 欄位的平方根。 Sqrt 函數也可以與單列表一起使用,從而可以在不使用 ForAll的情況下執行此範例。 Sqrt 範例。
ForAll( 平方, 冪( 值, 3 ) ) 針對輸入資料表的所有記錄,將 Value 欄位做為三次方。 Power 函式不支援單欄資料表。 因此,在這種情況下必須使用。 ForAll Power 範例。

使用連線

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

運算式範例。

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

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

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

公式 描述 結果
ForAll(運算式,MicrosoftTranslator.Translate(值,“es”)) 針對運算式資料表中的所有記錄,將 欄位的內容翻譯成西班牙文 (縮寫為 "es")。 值為
ForAll(運算式,MicrosoftTranslator.Translate(值,“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 任何部分都是不可委派的。 只會評估 Products 資料表的第一部分,如果此資料表很大,這可能會發生問題。 因為 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中執行收集

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 資料來源,如果我們擷取它,這可能會累積成大量資料。

對應元件中的資料表

參閱對應資料表