次の方法で共有


ForAll 関数

適用対象: キャンバス アプリ Copilot Studio デスクトップ フロー モデル駆動型アプリ Power Platform CLI Dataverse 関数 Power Pages

値を計算し、テーブル ですべての レコード に対して操作を実行します。

内容

ForAll関数は、テーブル内のすべてのレコードの数式を評価します。 数式では、値を計算したり、データの変更や接続の操作などのアクションを実行したりすることができます。 With 関数 を使用して、単一のレコードの数式を評価します。

シーケンス関数ForAll関数と共に使用して、カウントに基づいて反復処理します。

現在処理されているレコードのフィールドは、この数式内で使用できます。 ThisRecord 演算子を使用するか、他の値を参照するのと同様に名前でフィールドを参照します。 As 演算子を使用して処理対象のレコードを指定することもできます。そうすると数式がわかりやすくなり、入れ子になったレコードにアクセスしやすくなります。 詳細については、以下の例と「レコードのスコープに関する作業」を参照してください。

値を返す

各数式の評価結果は、入力テーブルと同じ順序でテーブルに返されます。

数式の結果が 1 つの値である場合、結果のテーブルは単一列テーブルになります。 数式の結果がレコードの場合、結果として返されるテーブルには、結果のレコードと同じ列を含むレコードが格納されます。

数式の結果が 空白 の値の場合、その入力レコードの結果テーブルにレコードはありません。 この場合、結果テーブルのレコード数はソース テーブルよりも少なくなります。

アクションの実行

数式には、Patch および Collect 関数を用いてデータ ソースのレコードの変更など、アクションを実行する関数を含めることができます。 数式は、接続に対してメソッドを呼び出すこともできます。 ; 演算子 を使用して、複数のアクションをレコードごとに実行できます。 ForAll関数の対象であるテーブルを変更することはできません。

数式を記述する場合、レコードは任意の順序で、可能な場合は並行して、処理できることに注意してください。 テーブルの最初のレコードが最後のレコードの後に処理される場合があります。

順序の依存関係を避けるように注意してください。 このため、 UpdateContextClearClearCollect 関数は、 ForAll 関数内では使用できません。これは、この効果の影響を受けやすい変数を保持するために簡単に使用できるためです。 Collect を使用することはできますが、レコードが追加される順序は定義されていません。

CollectRemove、および Update を含むデータ ソースを変更する複数の関数は、変更されたデータ ソースを戻り値として返します。 これらの戻り値は大きくなる可能性があり、 ForAll テーブルのすべてのレコードに対して返された場合、大量のリソースを消費します。 また、これらの戻り値は、 ForAll が並列に動作でき、これらの関数の副作用が結果を得られない可能性があるため、期待とは異なる場合があります。 ForAllからの戻り値が使用されていない場合 (多くの場合、データ変更関数の場合)、戻り値は作成されず、リソースや順序の問題はありません。 ただし、 ForAll の結果とデータ ソースを返す関数の 1 つを使用している場合は、結果を構造化する方法を慎重に検討し、小さなデータ セットで最初に試してみてください。

代替手段

Power Apps の多くの関数は、単一列テーブルを使用して一度に複数の値を処理できます。 たとえば、 Len 関数はテキスト値のテーブルを処理し、同じ方法で長さのテーブルを返 ForAll 。 これにより、多くの場合、 ForAll を使用する必要がなくなり、より効率的になり、読みやすくなることができます。

もう 1 つの考慮事項は、 ForAll が委任できないのに対し、 フィルターなどの他の関数が存在する可能性がある点です。

委任

データ ソースと共に使用する場合、この関数は委任できません。 データ ソースの最初の部分のみが取得され、その後にその関数が適用されます。 結果は完全なストーリーを表さない場合があります。 この制限が存在することを知らせ、可能であれば委任できる代替の選択肢に切り替えるように提案する警告が、作成時に表示される場合があります。 詳しくは、「委任の概要」を参照してください。

構文

ForAll(数式)

  • - 必須。 操作されるテーブル。
  • - 必須。 Table のすべてのレコードに関して評価する数式。

計算

次の例では、Squaresデータ ソース を使用します:

正方形の例。

このデータ ソースをコレクションとして作成するには、Button コントロールの OnSelect プロパティをこの数式に設定し、プレビュー モードを開始して、ボタンを選択します。

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

計算式 内容 結果
ForAll( Squares, Sqrt( Value ) )

Sqrt( 平方 )
入力テーブルのすべてのレコードについて、列の平方根を計算します。 Sqrt 関数は単一列のテーブルでも使用できるため、ForAllを使用せずにこの例を実行できます。 平方根の例。
ForAll( Squares, Power( Value, 3 ) ) 入力テーブルのすべてのレコードについて、列を三乗します。 Power 関数は、単一列テーブルをサポートしていません。 そのため、この場合は ForAll を使用する必要があります。 力の例。

接続の使用

次の例では、Expressionsデータ ソース を使用します:

式の例。

このデータ ソースをコレクションとして作成するには、Button コントロールの OnSelect プロパティをこの数式に設定し、プレビュー モードを開始して、ボタンを選択します。

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

この例では、Microsoft Translator 接続も使用します。 アプリにこの接続を追加するには、接続を管理する 方法に関する記事を参照してください。

計算式 内容 結果
ForAll(Expressions, MicrosoftTranslator.Translate(Value, "es")) Expressions テーブルのすべてのレコードについて、Value 列の内容をスペイン語 (省略形 "es") に翻訳します。 値が
ForAll(Expressions, MicrosoftTranslator.Translate(Value, "fr")) Expressions テーブルのすべてのレコードについて、Value 列の内容をフランス語 (省略形 "es") に翻訳します。 値が

テーブルのコピー

場合によっては、データをフィルター処理、整形、並べ替え、および操作する必要があります。 Power Apps には、FilterAddColumnsSort など、この処理を行うための多数の関数が用意されています。 Power Apps は各テーブルを値として扱い、数式を流して簡単に使用できるようにします。

また、後で使用するためにこの結果のコピーを作成する場合や、データ ソース間で情報を移動する場合があります。 Power Apps では、データをコピーするため Collect 関数 を提供しています。

ただし、そのコピーを作成する前に、必要に応じて慎重に検討してください。 要求に応じて、数式を使用して基になるデータ ソースのフィルター処理および整形を行うことにより、多くの状況に対処することができます。 コピーの作成のいくつかの欠点を次に示します。

  • 同じ情報のコピーが 2 部あるということは、そのうち一方が同期されなくなる可能性があることを意味します。
  • コピーの作成では、多くのコンピューター メモリ、ネットワーク帯域幅、時間が使用される可能性があります。
  • ほとんどのデータ ソースでは、コピーを委任できないため、移動できるデータの量が制限されます。

次の例では、Productsデータ ソース を使用しています:

製品のデータ ソースの例。

このデータ ソースをコレクションとして作成するには、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"
)

レコード スコープ は、各レコードの 'Quantity Requested' および 'Quantity Available' フィールドを使用して、それぞれ、比較および減算操作を実行する Filter および AddColumns 関数によって作成されます。

この例では、Filter 関数を委任できます。 たとえそれが多数のテーブルのうちのわずか少数のレコードであっても、条件を満たすすべての製品を見つけることができるので、これは重要です。 現時点では、 ShowColumnsAddColumns を委任できないため、注文する必要がある製品の実際の数は限られています。 この結果のサイズが常に比較的小さいことがわかっている場合は、この方法で問題ありません。

また、コピーを作成していないため、管理する情報や古い情報の追加コピーはありません。

ForAll オンデマンド

もう 1 つの方法は、 ForAll 関数を使用してテーブル シェイプ関数を置き換える方法です。

ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        {
            Product: Product,
            'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
        }
    )
)

この数式は、一部のユーザーにとって読み取りおよび書き込みが容易な可能性があります。

ForAllの一部は委任できません。 Products テーブルの最初の部分のみが評価されます。このテーブルが大きい場合は問題になる可能性があります。 前の例で、Filter は委任することができたので、大規模なデータ セットではよりよく機能する可能性があります。

結果の収集

場合によっては、データのコピーが必要な場合があります。 データ ソースから別の場所に情報を移動することが必要になる場合もあります。 この例では、ベンダーのシステムで NewOrder テーブルによって注文を行います。 高速なユーザー操作の場合は、サーバーの待機時間が発生しないように、テーブルのローカル コピーをキャッシュすることができます。

前の 2 つの例と同じテーブル整形を使用しますが、結果をコレクションに取り込みます。

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内で直接収集を実行できます。

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

ここでも、 ForAll 関数は現在委任できません。 Products テーブルが大きい場合、ForAllはレコードの最初のセットのみを調べ、注文が必要な製品を見逃す可能性があります。 ただし、テーブルが小さいままであることがわかっている場合は、この方法で問題ありません。

ForAllの結果はキャプチャされていないことに注意してください。 その中から行われた Collect 関数呼び出しは、すべてのレコードの NewOrder データ ソースを返します。これは、キャプチャする場合に多数のデータに加算される可能性があります。

コンポーネント内のマップ テーブル

マップ テーブル を参照します。