キャンバス アプリのテーブルとレコードについて

Power Appsでは、Microsoft Excel、SharePoint、SQL Server、およびレコードやテーブルにデータを格納する他のいくつかのソースの情報にアクセスするキャンバス アプリを作成できます。 この種類のデータを効率的に操作できるように、これらの構造の基になる概念を確認しておきましょう。

  • レコードには、個人、場所、または物に関する 1 つ以上の情報カテゴリが含まれます。 たとえば、1 つのレコードに、単一の顧客の名前、メール アドレス、電話番号が含まれます。 他のツールでは、レコードは "行" や "項目" と呼ばれます。
  • テーブルは、同じ情報カテゴリを含む 1 つまたは複数のレコードを保持します。 たとえば、テーブルには、50 人の顧客の名前、メール アドレス、電話番号が含まれている場合があります。

アプリで数式 を使用して 、レコードとテーブルを作成、更新、操作します。 外部 データ ソース (拡張テーブル) に対するデータの読み取りと書き込みが行われる可能性があります。 さらに、1 つまたは複数の内部テーブルを作成する場合があります。これは、コレクションと呼ばれます。

Excel の式が引数として 1 つまたは複数のセルの参照を受け取るのと同様に、引数としてテーブルの名前を受け取るさまざまな式を作成できます。 Power Appsの一部の数式は、指定した他の引数を反映するテーブルを返します。 たとえば、次のような数式を作成できます:

  • Patch 関数に対する複数の引数の 1 つとしてそのテーブルを指定することで、テーブル内のレコードを更新します
  • AddColumns 関数、DropColumns 関数、または RenameColumns 関数の引数としてそのテーブルを指定することで、テーブル内の列を追加、削除、名前変更します。 これらの関数のいずれも、元のテーブルを変更することはありません。 代わりに、指定する他の引数に基づいて、関数は別のテーブルを返します。

テーブルの要素

テーブル要素。

レコード

各レコードには、人、場所、物についての少なくとも 1 つの情報カテゴリが含まれています。 上の例では、各製品 (ChocolateBreadWater) のレコードと、各情報カテゴリ (PriceQuantity on HandQuantity on Order) の列が示されています。

数式では、テーブルのコンテキストの外側で、中かっこを使用してレコード自体を参照できます。 たとえば、このレコード { Name: "Strawberries", Price: 7.99 } はテーブルに関連付けられていません。 この例の [名前] や [価格] などのフィールド名は、二重引用符で囲まれません。

フィールド

フィールドは、レコード内の個々の情報です。 この種のフィールドは特定のレコードの列の値として視覚化できます。

コントロールと同様に、レコードで . 演算子 を使用してレコードのフィールドを参照できます。 たとえば、First(Products).Name は、製品テーブル内の 1 つ目のレコードに対する名前フィールドを返します。

GroupBy 関数の例が示すように、フィールドに別のレコードやテーブルを含めることができます。 必要なだけ多くのレベルのレコードとテーブルを入れ子にできます。

列は、テーブル内の 1 つまたは複数のレコードの同じフィールドを参照します。 前の例では、各製品には価格フィールドがあり、すべての製品がその価格に対して同じ列を共有しています。 上の表には、上に水平方向に表示される 4 つの列があります。

  • 氏名
  • 価額
  • Quantity on Hand (手持ち在庫数量)
  • 注文時の数量

列の名前には、その列のフィールドが反映されます。

列内のすべての値は、同じデータ型です。 前の例では、"Quantity on Hand" 列には常に数値が含まれており、1 つのレコードに対して "12 単位" などの文字列を含めることはできません。 すべてのフィールドの値は、空白にすることもできます。

列は、他のツールでは「フィールド」と呼ばれることもあります。

Note

列名とスペースを含む SharePoint、Excel、Power BI タイルなどのデータ ソースの場合、Power Apps はスペースを "_x0020_" に置き換えます。 たとえば、SharePoint、Excel、または Power BI タイルの "Column Name" は、データ レイアウトに表示されたときや数式で使用されると、Power Apps では "Column_x0020_Name" として表示されます。

テーブル

テーブルは 1 つ以上のレコードで構成され、各レコードには複数のフィールドであり、レコード間で名前が一貫しています。

テーブル名を使用して、データ ソースまたはコレクションに格納されている任意のテーブルを参照します。 テーブルを引数として受け取る関数にテーブル名を渡すこともできます。 関数または数式は、テーブルを返すこともできます。

次の例に示すように、Table 関数とレコードのセットを使用して、数式内の テーブル を表すことができます。この関数は中かっこで表します。

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

角かっこを使用して単一列テーブルを定義することもできます。 次の式は、前の式を記述する同等の方法です。

[ "Strawberry", "Vanilla" ]

テーブルの数式

Excel とPower Appsでは、数式を使用して、テキストの数値と文字列を同様の方法で操作します。

  • Excel では、セル A142 などの値を入力してから、別のセルに A1+2 などの数式を入力して、44 の値が表示されます。
  • Power Appsで、Default プロパティを 42 に設定し、ラベルの Text プロパティを Slider1.Value + 2 に設定して、44 の値を表示します。

どちらの場合も、引数の値 (たとえば、セル A1 の数値や Slider1 の値) を変更すると、計算された値が自動的に変更されます。

同様に、数式を使用して、テーブルやレコード内のデータにアクセスし、操作することができます。 カタログ テーブルの価格列内の最小値を表示する Min(Catalog, Price) など、テーブルの名前を一部の数式の引数として使用します。 RenameColumns(Catalog, "Price", "Cost") など、テーブル全体を戻り値として提供する他の数式もあります。これは、カタログ テーブルからのすべてのレコードを返しますが、価格列の名前をコストに変更します。

数値と同様に、テーブルとレコードを含む数式は、基になるテーブルまたはレコードの変更に合わせて自動的に再計算されます。 カタログ テーブル内の製品のコストが前の最小値より小さい値に下がると、Min 数式の戻り値がそれに合わせて自動的に変更されます。

単純な例をいくつか見ていきましょう。

  1. 電話用の空のアプリを作成し、他のコントロールを含む垂直方向の ギャラリー コントロールを追加します。

    既定では、画面には CustomGallerySample という名前のテーブルからのプレースホルダー テキストが表示されます。 画面の ギャラリー コントロールの Items プロパティは自動的にそのテーブルに設定されます。

    ギャラリー。

    Note

    一部のコントロールは、図を示す目的で再配置され、拡大されます。

  2. Items プロパティをテーブルの名前に設定する代わりに、次の例のように、テーブルの名前を引数として含む数式に設定します:

    Sort(CustomGallerySample, SampleHeading, SortOrder.Descending)

    この数式では Sort 関数が組み込まれています。これはテーブルの名前を最初の引数として、そのテーブル内の列の名前を 2 つ目の引数として受け取ります。 また、省略可能な 3 つ目の引数もサポートしており、データを降順で並べ替えるように指定します。

    ギャラリー向けの並べ替え。

  3. 次の例のように、Items プロパティを、前の手順から数式を引数として受け取り、テーブルを返す数式に設定します。

    FirstN(Sort(CustomGallerySample, SampleHeading, SortOrder.Descending), 2)

    この数式では、FirstN 関数を使用して、テーブルの特定の数のレコードを表示します。 Sort 関数を FirstN への 1 つ目の引数として使用し、数値 (この場合、2) を 2 つ目の引数として使用します。これにより表示するレコードの数を指定します。

    数式全体は、CustomGallerySample テーブルの最初の 2 つのレコードを含むテーブルを返し、SampleHeading 列で降順に並べ替えられます。

    ギャラリーの FirstN。

Table 関数とコントロール プロパティ

Lower 関数について検討しましょう。 変数 welcome がテキスト文字列 "Hello, World" を含む場合、数式 Lower( welcome )"hello, world" を返します。 この関数では、その変数の値は変更されません。 Lower 関数は入力のみを処理し、出力を生成するため、純粋な関数です。 副作用はありません。 Excel のすべての関数と Power Apps のほとんどの関数は純粋関数です。つまり、ブックまたはアプリは自動的に再計算されます。

Power Appsは、同じ方法でテーブルを操作する一連の関数を提供します。 これらの関数は、テーブルを入力として受け取り、データのテーブル全体をフィルタ―処理、並べ替え、変換、削減、および要約します。 実際には、Lower 関数や、通常は単一の値を受け取る他の多くの関数も、単一列テーブルを入力として受け取ります。

  • 並べ替えフィルター - レコードを並べ替え、フィルター処理します。
  • FirstNLastN - テーブルの最初の N または最後の N 個のレコードを返します。
  • AbsSqrtRoundRoundUpRoundDown - 単一列テーブルの各レコードに対して算術演算を実行すると、結果の単一列テーブルが生成されます。
  • LeftMidRightReplaceSubstituteTrimLowerUpperProper - 単一列テーブルの各レコードに対して文字列操作を実行すると、文字列の単一列テーブルが作成されます。
  • Len - 文字列の列の場合、各文字列の長さを含む単一列テーブルを返します。
  • Concatenate - 文字列の複数の列を連結し、文字列の単一列テーブルになります。
  • AddColumnsDropColumnsRenameColumnsShowColumns - テーブルの列操作を実行すると、異なる列を持つ新しいテーブルが作成されます。
  • 個別 - 重複するレコードを削除します。
  • Shuffle - レコードをランダムな順序でシャッフルします。
  • HashTags - 文字列でハッシュタグを検索します。
  • Errors - データ ソースを使用する場合にエラー情報を提供します。

これらの関数の多くは、単一列テーブルを入力として受け取ります。 テーブル全体に列が 1 つしかない場合は、名前で指定できます。 テーブルに複数の列がある場合は、Table.Column 構文を使用してそれらの列の 1 つを指定できます。 例えば、Products.Name は、製品テーブルからの名前値のみの単一列テーブルを返します。

AddColumnsRenameColumnsShowColumns、または DropColumns 関数を使用して、必要に応じてテーブルを完全に再整形できます。 この場合も、これらの関数は出力のみを変更し、ソースは変更しません。

コントロールのプロパティはテーブルにもなります:

  • Items - ギャラリー、リスト ボックス、およびコンボ ボックスに適用します。 このプロパティは、ギャラリーまたはリストが表示するテーブルを定義します。
  • SelectedItems - リスト ボックスおよびコンボ ボックスに適用します。 このプロパティは、 SelectMultiple が有効になっている場合にユーザーが選択した項目のテーブルを定義します。

動作の数式

一部の関数は、データを変更し、副作用を持つよう特別に設計されています。 これらの関数は純粋ではないので、慎重に構築する必要があります。 彼らはアプリでの値の自動再計算に参加できません。 これらの関数は、動作の数式内でのみ使用できます。

  • CollectClearClearCollect - コレクションを作成し、クリアし、それにデータを追加します。
  • Patch - レコードの 1 つ以上のフィールドを変更します。
  • UpdateUpdateIf - 指定する 1 つ以上の条件に一致するレコードを更新します。
  • RemoveRemoveIf - 指定する 1 つ以上の条件に一致するレコードを削除します。

レコードの数式

個々のレコード用にデータを計算したり、個々のレコードを引数として受け取り、戻り値として返したりする数式も構築できます。 ギャラリーの例に戻り、 Gallery1.Selected プロパティを使用して、ユーザーがそのギャラリーで選択したレコードの情報を表示します。

  1. ボタンを追加し、その OnSelect プロパティを次の数式に設定します:
    Collect( SelectedRecord, Gallery1.Selected )

  2. Alt キーを押しながら、ボタンを選択します。

  3. ファイル メニューで、コレクションを選択します。

    SelectedRecord コレクション。

この数式は、ギャラリーで現在選択されているレコードからのデータだけでなく、そのギャラリーの各コントロールも含むレコードを返します。 たとえば、レコードには、元のテーブルの SampleText 列に対応する SampleText 列と、その列からのデータを表示するラベルを示す Subtitle1 列の両方が含まれます。 Subtitle1 列のテーブル アイコンを選択して、そのデータの詳細情報を確認します。

Note

このトピックで指定されている要素以外の要素を追加する場合、 Subtitle1 列の名前は Subtitle2 または類似している可能性があります。

選択したレコードが作成されたので、 . 演算子を使用して、そのレコードから個々のフィールドを抽出できます。

  1. ラベル コントロールを追加してから、ギャラリーとボタンの下に移動します。

  2. ラベルの Text プロパティを次の数式に設定します:
    "選択: " & Gallery1.Selected.SampleHeading

    ラベルが更新されたテキスト プロパティ。

レコードである Selected プロパティを取得し、そこから SampleHeading プロパティを抽出しました。

関連する名前付き値に対する汎用的コンテナーとしてレコードを使用することもできます。

  • UpdateContext 関数や Navigate 関数を中心に数式を構築する場合は、レコードを使用して、更新するコンテキスト変数を収集できます。
  • 編集フォーム コントロールの Updates プロパティを使用して、ユーザーが フォーム で行った変更を収集します。
  • Patch 関数を使用して、データ ソースを更新してレコードを結合します。

このような場合、レコードはテーブルの一部ではありませんでした。

レコード関数とコントロール プロパティ

レコードを返す関数:

  • FirstNLastN - テーブルの最初または最後の 1 つまたは複数のレコードを返します。
  • Lookup - 1 つ以上の条件に一致するテーブルからの最初のレコードを返します。
  • Patch - データ ソースを更新するか、レコードを統合します。
  • Defaults – データ ソースの既定値を返します。

レコードを返すプロパティ:

  • Selected - ギャラリーおよびリスト ボックスに適用します。 現在選択されているレコードを返します。
  • Updates - ギャラリーに適用します。 ユーザーがデータ入力フォームで加えるすべての変更が 1 つにまとめられます。
  • Update - テキスト入力コントロールやスライダーなどの入力コントロールに適用します。 ギャラリーの個々のプロパティを 1 つにまとめて設定します。

レコードのスコープ

一部の関数は、テーブルのすべてのレコード (一度に 1 つのレコード) で数式を評価することによって機能します。 数式の結果は、関数ごとに異なる方法で使用します。

  • AddColumns - 数式を使用して、追加する新しいフィールドの値を取得します。
  • AverageMaxMinSumStdevPVarP - 数式を使用して集計する値を取得します。
  • フィルタールックアップ - 数式を使用して、レコードを出力の一部にするかどうかを決定します。
  • Concat - 数式を使用して、結合する文字列を決定します。
  • 個別 - 数式を使用して、重複するレコードを見つけるのに役立つ値を返します。
  • ForAll - 数式を使用して任意の値を返します。場合によっては副作用があります。
  • 並べ替え - 数式を使用して、レコードを並べ替える値を取得します。
  • With - 数式を使用して任意の値を返します。場合によっては副作用があります。

これらの数式内では、作業中のレコードのフィールドを参照できます。 これらの各関数は、数式が実行される "レコード スコープ" を作成します。 レコードのフィールドは、最上位の識別子として表示されます。 また、アプリ全体からのコントロール プロパティやその他の値を参照することもできます。

たとえば、 Products のテーブルを考えてみます。

製品例。

このサンプル テーブルをアプリに作成するには、ボタンを挿入し、そのOnSelect プロパティをこの数式に設定し、ボタンを選択します (Power Apps Studio で Alt キーを押しながらクリックします)。

Set( 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 }
    )
)

これらの製品の要求が使用可能な数を超えているかどうかを確認するには、次の式を使用します。

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Filter の最初の引数は、処理するレコードのテーブルです。 2 番目の引数は数式です。 フィルター は、この数式を評価するためのレコード スコープを作成します。 各レコードのフィールドは、[ 製品]、[ 要求された数量]、[ 利用可能な数量] などです。 比較の結果は、各レコードが関数の結果の一部である必要があるかどうかを決定します。

フィルターされたテーブル。

この例に追加するには、注文する各製品の量を計算します。

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

ここでは、計算列を結果に追加します。 AddColumns は、独自のレコード スコープを使用して、要求した内容と使用可能な内容の差を計算します。

追加された列。

最後に、結果テーブルを目的の列のみに減らすことができます。

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

更新されたテーブル。

前の例では、一部の場所では二重引用符 (") を使用し、他の場所では単一引用符 (') を使用しました。 フィールドやテーブルなどのオブジェクトの値を参照し、オブジェクトの名前にスペースが含まれている場合は、単一引用符が必要です。 オブジェクトの値を参照せず、代わりにそのことを説明する場合は、二重引用符を使用します。 特に 、AddColumns の場合のように、オブジェクトがまだ存在しない場合は二重引用符を使用します。

曖昧性の除去

レコード スコープで追加するフィールド名は、アプリ内の他の場所から同じ名前をオーバーライドします。 このような場合でも、 @ あいまいさを解消 する演算子を使用して、レコード スコープの外部から値にアクセスできます。

  • 入れ子になったレコード スコープから値にアクセスするには、次のパターンを使用して、 @ 演算子を操作しているテーブルの名前と共に使用します。
    Table[@FieldName]
  • データ ソース、コレクション、およびコンテキスト変数などのグローバル値にアクセスするには、[@ObjectName] のパターンを使用します (テーブルは指定しません)。

操作対象のテーブルが 、Filter(Table, ... などの式である場合) )、あいまいさを解消する演算子は使用できません。 最も内側のレコード スコープのみが、曖昧性除去演算子を使用せずに、このテーブル式からのフィールドにアクセスできます。

たとえば、コレクション X があると仮定します:

コレクション X。

このコレクションは 、ClearCollect( X, [1, 2] ) を使用して作成します。

別のコレクション Y:

コレクション Y。

このコレクションは 、ClearCollect( Y, ["A", "B") を使用して作成します。

さらに、Value というコンテキスト変数を、数式: UpdateContext( {Value: "!"} ) で定義します

これらを 1 つにまとめてみましょう。 このコンテキストでは、次の数式を使用します:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

次のテーブルが生成されます:

XY テーブル。

どうなっているのでしょうか? 最も外側の ForAll 関数は X のレコード スコープを定義し、処理する各レコードの Value フィールドにアクセスできるようにします。 それにアクセスするには、 Value という単語を使用するか 、X[@Value] を使用します

最も内側の ForAll 関数は 、Y の別のレコード スコープを定義します。このテーブルには Value フィールドも定義されているため、ここで Value を使用すると 、Y のレコードのフィールドが参照され、 X のフィールドは参照されなくなります。 XValue フィールドにアクセスするには、あいまいさを解消する演算子で長いバージョンを使用する必要があります。

Y は最も内側のレコード スコープであるため、このテーブルのフィールドにアクセスするにはあいまいさを解消する必要がないため、同じ結果でこの数式を使用できます。

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

すべての ForAll レコード スコープはグローバル スコープを上書きします。 定義した Value コンテキスト変数は、あいまいさを解消する演算子なしでは名前で使用できません。 この値にアクセスするには、[@Value] を使用します。

入れ子になった ForAll 関数は入れ子になった結果テーブルを生成するため、Ungroup は結果をフラット化します。

単一列テーブル

テーブルからの単一列を操作するには、この例のように ShowColumns 関数を使用します:

ShowColumns( Products, "Product" )

この数式は、この単一列テーブルを生成します:

単一列テーブル。

より短い代替策に関しては、Table.Column を指定し、テーブルからのの単一列のテーブルを抽出します。 たとえば、この数式は ShowColumns を使用した場合と全く同じ結果を生成します。

Products.Product

インライン レコード

中括弧に名前付きフィールドの値を含めてレコードを表現します。 たとえば、次の数式を使用して、このトピックの冒頭に出てきたテーブル内の最初のレコードを表すことができます:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

次の例に示すように、数式を他の数式に埋め込むこともできます:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

次の例に示すように、中かっこを入れ子にすると、レコードを入れ子にすることができます。

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

空白やコロンなどの特殊文字が含まれる各列名を、単一引用符で囲みます。 列名内で単一引用符を使用するには、二重にします。

価格列の値にはドル記号などの通貨記号が含まれていない点に注意してください。 その書式設定は、値が表示されるときに適用されます。

インライン テーブル

Table 関数と一連のレコードを使用してテーブルを作成します。 このトピックの冒頭で出てきたテーブルを、次の数式で表すことができます:

Table( 
	{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
	{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
	{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

また、テーブルを入れ子にすることができます:

Table( 
	{ Name: "Chocolate", 
	  'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
	                             { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
	}
)

インライン値テーブル

角かっこで囲まれた値を指定して、単一列テーブルを作成します。 結果のテーブルには、という名前の単一列があります。

例えば、[ 1, 2, 3, 4 ]Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) に相当し、次のテーブルを返します:

インライン テーブル。