計算列が廃止予定になってしまうので、その代わりとなる計算式列(数式列)について詳しく調査した。
計算式列(数式列)
計算式列は最近追加されたDataverseの列のデータの種類で、数式を使用して列の値を計算することができる。


計算列に「廃止予定」とメッセージが出るようになったので、今後使用する機会が増えると思われるこの計算式列について詳しく調べてみた。


※「計算列」と「計算式列」がややこしいので、以降は「計算式列」を「数式列」と書きます。
使用可能な演算子
まず、数式列ではこれらの演算子が使用可能。
- +:加算
- -:減算
- *:乗算
- /:除算
- %:百分率
- in:文字列検索(大文字小文字を無視)
- exactin:文字列検索(大文字小文字を考慮)
- &:文字列結合
使用可能なデータ型
続いて数式列で使用可能なデータ型はこちら。
- テキスト
- 10進数
- 選択肢
- 日付と時刻
2024年2月時点で「通貨」「整数」「選択肢 (以前のオプション セット) 」は未サポートで、数式列で数値を扱うと必ず小数(10進数)になる。


使用可能な関数
数式列で使用可能な関数の代表例はこの辺り。
- 制御:If, Switch
- 変換:Text, Value
- 切上切捨:Round, RoundUp, RoundDown
- 日時:Now, UTCNow, UTCToday
- 日時計算:DateAdd, DateDiff
関数によってはPower Appsのキャンバスと若干仕様が違うものがあるので、以下解説。
Now()とUTCNow()の違い
数式列において、Now()は[ユーザー ローカル]の日時値、UTCNow()は[タイムゾーン非依存]の日時値として、別種類の日時データと扱われる。
そこで、(こんなことしないと思うけど)これら2つを同じ関数で使おうとすると、画像のようにエラーが発生する。


TextとValueは整数でのみ使用可能
2024年2月時点ではText関数とValue関数は整数値に対してのみ使用できるらしく、小数点あり数値や日時には使用できない。
* Text と Value の関数は整数でのみ機能し、小数点記号は含まれません。 小数点記号はロケールによって異なります。 数式列はロケールの知識がなくても評価されるため、小数点記号を適切に解釈または生成する方法はありません。
Microsoft公式より
Microsoft公式より
そこで画像のように日時型のデータをText関数に渡そうとすると、エラーが発生する。


Text関数の制限
またPower Appsのキャンバスで使う時とは違い、Text関数は第二引数(書式指定)が必須となっている。
こんな感じで数値のみを関数に渡すとエラーが発生するので、


第二引数(書式)を指定してあげる必要がある。


詳しい調査
これまでの基本的な数式列の使い方に加えて、細かな動作や操作も調べてみた。
他の列の値を参照
自分の列を参照して計算結果を出したいときは、列名を入力すればOK。
例えば自分の列「Num」を参照して計算したいときはこんな計算式になる。


親レコードの値を参照
親レコードの値を参照する場合は、親テーブルの名前を入力すればアクセスできる。
例えば親テーブル「Parent」の列「Num」を使用したいときはこんな計算式になる。
※親テーブルの名前が「Parent」のような予約語だったり、半角スペースを使っている場合は「”」で囲う。

※親テーブルの名前が「Parent」のような予約語だったり、半角スペースを使っている場合は「”」で囲う。

親の参照はどこまでいけるか?
親テーブルの参照が可能なので、どこまで親テーブルを遡って参照できるかが気になるところ。
今回検証用に以下4つのテーブルを作成して、上から順に親子リレーションを張ったものを用意。
- GrandParnt
- Parent
- Child
- GrandChild
結果、GrandChildテーブルからGrandParentまでの参照は可能だった。



Power Appsのキャンバス内のPower Fxだと親のプロパティまでしか参照できないことを考えると、この機能はかなり便利。


Nowはいつ時点のNowか?
Now関数を計算列で使用したとき、この列の値は「レコード作成時点のNow()」が使われるのか、「常にNow()が計算された結果」が使われるのかが気になったので、動作確認をしてみた。


結論は「常にNow()が計算された結果」が使われるようで、こんな感じで値を参照する時間によって列の値が変わる。




数式列を使用した「並べ替え」は可能か?
昔からある計算列の並べ替えには一部制限があったので、それに対し数式列ではどこまで並べ替えできるか?を色々試してみた。
まとめ
数式列は、計算列に比べてかなり高機能になった印象。
特に遠い親テーブルへの参照ができるようになったこと、並べ替えに(調べた限りでは)制限がなくなったことが個人的にはとてもありがたい。
コメント