
今回は、Power Appsのテーブルとレコードについて深掘りしてみます。
とはいえ、マイクロソフトの公式に書いてあるのでそれを読んでいただいても構わないのですがサイト運営者であるコツリンはマイクロソフトの公式を読んで勘違いをしてしまいしばらく苦労してしまいました。
その後色々と調べて実験しているうちにテーブルとレコードについてわかってきましたのでその内容をまとめます。
あくまでも個人が調べた結果なので間違っている部分や、操作方法でもっと簡単な方法があるかもしれませんのでその場合は下のコメントなどからご連絡ください。
また、今回は結構複雑な内容になります。操作してみるのところまでは目次から該当箇所に飛んで読まずに上から順に読んでいってください。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

マイクロソフトの公式を見てみる
まずはマイクロソフトの公式による紹介を見てましょう。
レコードには、個人、場所、または物に関する 1 つ以上の情報カテゴリが含まれます。 たとえば、1 つのレコードに、単一の顧客の名前、電子メール アドレス、電話番号が含まれます。 他のツールでは、レコードを "行"や "項目" として参照します。
テーブルは、同じ情報カテゴリを含む 1 つまたは複数のレコードを保持します。 たとえば、1 つのテーブルに 50 人の顧客の名前、電子メール アドレス、電話番号が含まれます。
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/working-with-tables
色々と書かれていますが上記の部分が一番重要な部分です。これを図示したテーブルが次の図になります。

これと先程の説明を合わせて考えると、テーブルはフィールド(Field)の集合で成り立ち、横1列だと行(Record)となり、縦1列だと列(Column)となりますが、これ大きな勘違いの素ですので気をつけてください。
実際に動かしてみる
では色々と検証してみましょう。
下準備:コレクション作成
まず初めにコレクションを作ります。コレクションとはPoweAppsに作られるデータベースになります。
ボタンを挿入しOnselectに
ClearCollect(Test,
{商品:"きゅうり",分類:"野菜",価格:100},
{商品:"トマト",分類:"野菜",価格:100},
{商品:"キャベツ",分類:"野菜",価格:200},
{商品:"りんご",分類:"果物",価格:300},
{商品:"バナナ",分類:"果物",価格:400})
と入力し、ボタンを押してみてください。下のコレクションが作成されます。列の順番とか違うかもしれませんがコレクションは順番の概念を持ちません。そのため、必ずしもこっちが指定した順番通りには表示されませんので注意してください。
商品 | 分類 | 価格 |
---|---|---|
きゅうり | 野菜 | 100 |
トマト | 野菜 | 200 |
キャベツ | 野菜 | 300 |
りんご | 果物 | 400 |
バナナ | 果物 | 500 |
レコードを取り出す
では実際にレコードを取り出してみましょう。
検証のため2種類の方法でレコードを取り出してみます。下準備と同じくボタンを挿入しOnselectに次の関数を入れてください。
Collect(filTbl,Filter(Tbl_,商品="きゅうり"));
Collect(lkupTbl,LookUp(Tbl_,商品="きゅうり"))
これでfilTblとlkupTblという同じ中身の二つのコレクションが作成されました。ここまでは問題ありません。
次にコレクションではなく変数に先ほどと同じ二つの関数Filter(Tbl_,商品="きゅうり")とLookUp(Tbl_,商品="きゅうり")を入れてみます。ボタンを作成し次の関数を実行してみてください。
UpdateContext(
{filTbl_hensu:Filter(Tbl_,商品="きゅうり"),
lkupTbl_hensu:LookUp(Tbl_,商品="きゅうり")})
実行して変数の画面をみるとfilTbl_hensuはTableでlkupTbl_hensuはRecordになっていることがわかります。

ここで、先に作ったfilTblとlkupTblを変数に入れて確認してみましょう。
UpdateContext(
{filTbl_hensu_made:filTbl_hensu,
lkupTbl_hensu_made:lkupTbl_hensu})
を実行してみます。

中身は同じはずなのに変数に関数のLookUp(Tbl_,商品="きゅうり")を直接入れたものはレコードで他のものは全てテーブルとなっています。
ということでここまでの内容をまとめると
- 一度コレクションに入れたものはレコードであってもテーブル扱いになる
- テーブルとレコードは形が同じでもデータの種類が違う
ということになります。いくらFilter関数でデータを一つしか取り出さなかったとしても、Filter関数はテーブルを返します。一方でLookup関数は必ずレコードとして返してくれるということになります。
また、レコードを保存しようとした場合には変数に入れないといけないということになります。powerappsのローカルであるデータベースのコレクションに入れてしまうと、テーブル扱いになってしまうからです。
返されるデータの形ではなく、関数がデータをどのように返してくれるかということをしっかりと把握しておかないと操作が行き詰まる可能性がありますので注意してください。
- 1行のテーブルデータとレコードデータは違う
- 同じデータの形でも関数によってテーブルを返す場合とレコードを返すものがある
- コレクションに入れるとレコードでもテーブルに変換される
列名で取得できるもの
テーブル名.列名でそれぞれ取得できるものも違いますので気をつけましょう。
ボタンを作成しOnselect属性に次の関数を入力するとコレクションができます。
ClearCollect(Tbl_,{商品:"きゅうり",分類:"野菜",価格:100},{商品:"トマト",分類:"野菜",価格:200},{商品:"キャベツ",分類:"野菜",価格:300},{商品:"りんご",分類:"果物",価格:400},{商品:"バナナ",分類:"果物",価格:500})
その後、違うボタンのOnselect属性に
UpdateContext({rec_:LookUp(Tbl_,商品="きゅうり"),tbl_:Tbl_});UpdateContext({rec2_:rec_.商品,tbl2_:tbl_.商品})
を入力、実行することで
- rec_・・・レコード
- rec2_・・・レコード.列名で取得したもの
- tbl_・・・テーブル
- tbl2_・・・テーブル.列名で取得したもの
が入ります。変数の結果を見ると次のような状態になります。


ここからわかることは、レコード.列名で取得できるものはデータの中身、テーブル.列名で取得できるものはテーブルの列だけのテーブルデータということです。
この1列だけのテーブルはリストとしての機能を持っていますので、ドロップボックスやコンボボックスのItems属性に入れる時によく使われます。
- レコードから列名で指定したデータはデータの中身が取得される
- テーブルから列名で指定したデータはテーブル(リスト)で取得される。