これまでずっと欲しかった機能「ロールアップ列の再計算」の構築方法が分かったので、メモ。
Dataverseのロールアップ列
Dataverseのロールアップ列は、関連するテーブルのデータを集計する列のこと。
例えば、テーブル「Parent」とテーブル「Child」があって、ParentからChildに対して1:Nのリレーションがあるとき、

テーブル「Parent」にロールアップ列を追加して、

画像のように「Child」の列「Num」を合計を求めるよう設定してあげれば、

ロールアップ列(サンプルでは列名「Sum」)には関連するChildテーブルのNum列の合計値が入る。

ロールアップ列は即時更新ではない
とても便利なロールアップ列だけど、
この値は即時更新はされず、以下のタイミングでの更新となる
- UIから明示的に再計算を実行したとき
- 一定のタイミング

「一定のタイミング」の更新は間隔を短くすることもできるけど、確か1時間に1回が限度だった(はず)。
ということで、ほぼ即時に近い更新をしたい場合は、このロールアップ列は使いにくかった。
Power AutomateからDataverseのWebAPIを叩いて更新
Power Automate構築
事前準備:WebAPIの呼び出しURLの作成
今回使うWebAPIは以下の形式になっている。
【環境URL】/api/data/v9.2/CalculateRollupField(Target=@EntitySetName,FieldName=@FieldName)?@EntitySetName={'@odata.id':'【テーブルのセット名】(【対象レコードのGUID】)'}&@FieldName='【ロールアップ列の論理名】'
必要な値は以下の4つ。
- 環境URL
- 親テーブルのセット名
- 親レコードのGUID
- ロールアップ列の論理名
まず環境URLはPower Platform管理センターから取得して、

親テーブルのセット名はテーブルの[ツール]から取得できる。

最後にロールアップ列の論理名を取得して、

![]()
https://orgXXXXXXXX.crm7.dynamics.com/api/data/v9.2/CalculateRollupField(Target=@EntitySetName,FieldName=@FieldName)?@EntitySetName=
{‘@odata.id’:’cr861_parents(【対象レコードのGUID】)’}&@FieldName=’cr861_sum’
※orgXXXXXXは自分の環境のURLに変えてください。
GUIDはこれから作成するフロー内で設定する。
フロー構築
そしたらPower Automateを作成していく。
まずトリガーは子テーブル(Child)の「行が追加、変更、または削除された場合」を使用。

続いてアクションに「Entra ID(preauthorized)」の「HTTP要求を呼び出します」を選んで、

URLとURIにDataverseの環境URLを設定して、接続を作成する。

そしたら「GET」を選んで、先ほど作成したWebAPIの呼び出しURLを入力。ここでGUIDに「親テーブルの(値)」を設定。

これでフローは完成。
動作確認
動作確認のためChildのレコードのNum値を20に更新してみると、

フローが起動して、

再計算を押さなくても、無事にSum列が更新される。

これで無事にロールアップ列を明示的に再計算させることができるようになった。
とは言えひょっとしたらロールアップ列の計算は思った以上にリソースを食う可能性もあるので、必要最小限のとこのみで使用する方がよいかもしれない。
おまけ:HTTP要求アクションで「Base ResourceUri must be a base of the full url」が発生する場合
フロー実行時にエラー「Base ResourceUri must be a base of the full url」が出るときは、接続の作成が間違っている可能性がある(過去に自分で作成した別のリソースへの接続が生きていたり)。

このエラーが発生するときは[接続]タブへ移動して、該当の接続の[編集]をクリックし、

過去に作った別のリソース(画像はSharePoint)へのURLが入っていないかをチェック。

修正方法はこの接続を直してもいいし、Entra IDへの接続をもう一個作成してもよい。
関連記事
コメント