
今回はPowerAppsで見落としがちな基本的な事項であるデータの種類について見ていきます。
PowerAppsに必須の知識PowerFX対応の学習本はこちら
PowerApps学習の本命・実際のアプリももらえる学習本
PowerApps学習方法一覧

データの種類とは
データには色々な種類があります。私たち人間は文字を見たときにそれがどういう意味なのかを無意識のうちに判断しますが、パソコンはデータの種類まで伝えてあげないと判断してくれないことが多々あります。
例えば、
彼はできるかを問われ、「はい」と答えた。
という文章があったとします。このときこれが小説の文章であったなら「はい」の意味は彼が発した言葉になります。しかし、彼の立場からすれば「はい」はできるかという問いに対するYESという意味で「はい」と答えています。相手を馬鹿にしているという部分を無視して考えれば「YES」という回答でも意味は通じるわけです。
人間であれば当たり前の判断ですが、パソコンからすればこの「はい」は文章としての「はい」なのかYESかNOとしての「はい」をしっかりと区別してあげないと混乱してしまいます。
要求されているデータの種類と違うデータを渡してもエラーが発生するだけです。データの種類をしっかりと理解して要求されているデータの種類に対して適切なデータの種類を選択しましょう。
データの種類と表現方法
データはパソコンに理解させるための概念です。裏を返していうとデータは人間には理解できない可能性のあるものであるということになります。
しかしながら、このアプリを使うのは人間です。そのためデータの中身を人間のわかりやすい形で表現させないといけないというところでギャップが生まれます。
これを解消してくれるのがText関数などデータを加工してくれる関数になります。このtext関数はデータの中身を取り出してそれをこちらが指定したようにデータの表現を変えてくれます。
データの内容が必ずしもこちらの表現したい内容とは同じということはなく、それらの値をこちらの指定したように表現したい場合は別途表現方法を指定しないといけないということは理解しておきましょう。

データの内容と表現を指定することは別と考えないといけないということだ。データの変換についてはこちらでまとめているぞ。
データの種類
ということでデータの種類を見ていきましょう。
データの種類についてはマイクロソフトで公式に解説されています。
公式で解説されているデータのを一覧にすると
- Boolean
- 色
- 通貨
- 日付
- DateTime
- GUID
- ハイパーリンク
- 画像
- メディア
- 番号
- オプション セット
- Record
- レコード参照
- Table
- テキスト
- 時刻
- 2 つのオプション
と合計17個になります。
かなりの数ですが実際のところ覚える必要があるのは
- Boolean
- 日付・時刻
- テキスト
- 番号・通貨
- Table
になります。他の項目はよっぽどのことがない限りは使わない、もしくは今回の項目に内包されていますのでこの5つを覚えておけば大抵のことはできます。
Boolean
ブーレーンと呼びます。日本語としては真偽値と言いますが真偽値とした方が意味がわかるかもしれません。
BooleanにはTrueかFalseのどちらかしか入りません。二つが同居することはなく必ずどちらかが指定されます。
「はい」か「いいえ」、「真」か「偽」、「YES]か「NO」、「0」か「1」というようにも表現可能ですが、パソコンでは「True」か「False」で表現されます。
基本的に、Booleanは比較の結果として使われることが多いです。比較とは=や<、>を使って左辺と右辺の値が同じかどうか、数字の場合は大きいか小さいかなどを比較した結果がBooleanとして返ってくることが多いです。
わかりやすい例がIf関数となります。次の例はエクセルにおけるIf関数のA1のデータが1かどうかとを検証しその結果をもとに結果を返しています。
If(A1=1,"はい","いいえ")
A1に1が入力されていれば真となり「はい」が表示され、1以外のものが入っていたら偽となり「いいえ」が表示されます。これはA1=1の部分で真偽判定が行われ、真の場合つまりTrueの場合は「はい」が表示され、偽の場合つまりFalseの場合は「いいえ」が表示されます。
PowerAppsにおいてもif関数なんかはよく使いますし、オブジェクト内のプロパティであるOnVisibleなんかでも使われます。
OnVisibleは項目を表示させるかさせないかを判断する属性になります。表示させる場合はTrue、表示させない場合はFalseを入れることで制御することができます。
テキスト
テキストは文字のデータになります。文字のデータを入力する際は””(2をShiftと押すことで入力できるダブルクォーテーション)で囲むことが原則となります。
数字を文字列として入力させたい場合は「"1"」のように””で囲います
逆に””で囲わないとパソコン数字とみなしてしまい場合によってはエラーを返してきます。
また文字列を””で囲わないと変数として認識してしまいますので注意が必要です。
例えばラベルのText属性には表現したい文字を””で囲って入力しますがこれは""で囲ってあげることで「文字列です」と宣言してることになります。ダブルクォーテーションがない場合は変数として考えてしまうためエラーを返してきます。


番号
番号とありますが数値のことです。
アプリ内で計算を行う場合はこの数値を使います。通貨もデータの種類としは数値と同じになります。データの種類としての数値を「,」や「¥」で表現したい場合はText関数で制御します。
数字は–1.79769 x 10308 から 1.79769 x 10308 までしか対応していませんが、通常の場合においてここまで大きなもしくは小さな数字を扱うことは稀なのであまり気にしないで大丈夫です。
むしろ問題は小数点を含む場合です。パソコンは2進数という数字の扱い方を採用しているため私たち人間が使う10進数とは違う挙動を行います。普通の整数(1、2、3・・・)であれば問題はないのですが小数点を含む数字(1.1、1,2など)になると誤差が生まれます。僅かな誤差も認めたくないのであれば整数で計算させて最後に10で割るなどした方が賢明かもしれません。
数字を文字列として入力させたい場合は""で囲いましょう。
日付・時刻
日付・時刻はそのままの意味で日付や時刻を表すデータの種類になります。日付は何年何月何日までの日にちを取得します、一方で時刻は何時何分何秒の時間を指定します。またこの両方を併せ持ったのがDateTimeというデータの種類になります。
正確に書くと日付も時刻もDateTimeも全て同じ種類のデータになります。その中から日付のエリアだけにデータが入っているものが日付、日付と時刻両方にデータが入っているものが時刻もしくはDateTimeとなっています。そのため、日付が求められているところで時刻のデータを渡してもエラーにはなりませんが、日付部分のデータが空なので1970年1月1日と表現されます(1970年1月1日を0日目として起点としているため)。
日付や時刻を表現するにはText関数に指定のものを入れることで表現できます。
Text( 日付もしくは時刻になっているデータ,表現方法 [,言語 ] )
下に例をあげておきます。
Today()は今日の日付を取得する関数、Now()は今日の日付と現在の時刻を取得する関数になります。マイクロソフトの公式で表現方法については詳しく説明されています。


テーブル
テーブルとはデータベースのことです。縦1列以上のデータベースは全てテーブルとなりますので1列しかないデータベースでもテーブルです。またレコードはこのデータベースの中の行(横1行)になります。横1行のみがレコードなので複数行の場合はテーブルになります。とはいってもPowerAppsが1行のデータをテーブルとしてみなしていればそれはレコードではなくテーブルとなります。必ずしも横1行のデータ=レコードというわけではないことを知っておかないとデータの受け渡しでエラーが発生することになりますので気をつけましょう。
縦1列の場合はカラムとなりますがリスト的な要素を持ち合わせていることもあります。
これまでに説明したテキストや数値などとは違い基本的にTableやレコードは空白も存在する表で中身はboolean、テキスト、数値、日付・時刻の集合体となります。(基本的にと書いたのには理由があります。詳細は後ほど)

例えばPowerApps内でボタンを設置しOnselect属性に
ClearCollect(Table,{商品:"A",在庫:1},{商品:"B",在庫:2})
と入力します。するとTableという名で以下のテーブルデータが作成されます。
商品 | 在庫 |
---|---|
A | 1 |
B | 2 |
この表全体をテーブルと言います。それぞれの中身はAや1といったテキストや数値で構成されています。
テーブルについてはこちらの記事でも詳しくまとめています。
レコード
レコードはテーブルの1行分のデータとなります。テーブルの中のレコードを取得したい場合はLookup関数などを使います。
例えば先ほどの変数の「Table」の中からA行のレコードを取り出したい場合は
UpdateContext({Record:LookUp(Table,商品="A")})
とすることで変数「Record」に商品Aに合致するレコード(商品Aの行)が格納されます。

これもテキストや数値の集合体になります。
ただしfilter関数でAだけを抽出した場合、見た目はレコードと一緒ですがテーブルとなります。
UpdateContext({FilTble:Filter(Table,商品="A")})

関数の戻り値がレコードかレーブルかで同じ内容であっても取得データの型が変わってしまうので気をつけましょう。
カラム
カラムはテーブルの縦一列のデータになります。一列のデータで、PowerApps上ではテーブル扱いですが、実際はリストのように使えます。
取得方法は「テーブル名.列名」で取得できます。
リストとして使えますので今回の例で書くとドロップボックスのItems属性に「Table.商品」と入力することでテーブルの列名の値を選ばせるといった使い方が可能です。
データ
テーブルの中身を取得するにはテーブルを一度レコードに変更して、そこから列名で取得することになります。
先ほどの例の中から在庫列の値を取り出す場合は
UpdateContext({Number:Record.在庫})
とすることで変数「Number」に1が入ります。
おまけ
ところで、テーブルやレコードは基本的にテキストなどの集合と書いたのは覚えていますか。実はテーブルやレコードの中にはテキストなどの他にもテーブルやレコードを収納することも可能です。テーブルの中にさらにテーブルがあって・・・ということで少しややこしいですが先にテーブルやレコードの基本を抑えてしまいましょう。