Power Apps での ForAll 関数

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

内容

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

Sequence 関数ForAll 関数とともに使用して、カウントに基づいて繰り返します。

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

戻り値

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

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

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

アクションの実行

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

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

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

CollectRemove、および Update を含むデータ ソースを変更する複数の関数は、変更されたデータ ソースを戻り値として返します。 これらの戻り値は大きく、ForAll テーブルのすべてのレコードに対して返された場合、かなりのリソースを使用する可能性があります。 また、ForAll が並行して動作でき、結果の取得からこれらの関数の副作用を切り離す場合があるので、これらの戻り値が予想どおりのものではないこともあります。 幸いにも、ForAll からの戻り値が実際には使用されない場合 (データ変更関数の場合によく見られます)、戻り値は作成されないため、リソースまたは順序付けに関する懸念事項はありません。 ただし、ForAll の結果およびデータ ソースを返す関数のいずれかを使用している場合、結果の構造方法について十分検討し、最初は小さいデータ セットで試してください。

代替手段

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

別の考慮事項は、ForAll が委任可能ではないのに対して、Filter などの他の関数は可能であることです。

委任

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

構文

ForAll( Table, Formula )

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

計算

次の例では、平方データ ソース を使用します。

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

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

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

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

接続の使用

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

このデータ ソースをコレクションとして作成するには、ボタン コントロールの 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 部あるということは、そのうち一方が同期されなくなる可能性があることを意味します。
  • コピーの作成では、多くのコンピューター メモリ、ネットワーク帯域幅、時間が使用される可能性があります。
  • ほとんどのデータ ソースでは、コピーを委任できず、移動できるデータ量を制限します。

次の例では、製品データ ソース を使用しています。

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

別の方法として、ForAll 関数を使用して、テーブル整形関数を置き換えます。

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

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

ForAll のどんな部分も委任できません。 製品 テーブルの最初の部分のみが評価されますが、このテーブルが大きい場合は問題になることがあります。 前の例で、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 内で直接 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 データ ソースが返されるため、キャプチャした場合は最終的に大量のデータが生じることになります。