ローコード プラグインで Dataverse を強化する - Dataverse Accelerator の使い方

:::note warn
警告
本機能は現在プレビュー機能になります。
プレビュー機能は運用環境（本番環境）での使用を想定しておらず、機能が制限されている可能性があります。 
本記事は試用環境を用いて動作を確認しています。
:::


# 本記事の要約 (GPT)

Dataverse Accelerator は、Dataverse でローコード プラグインを作成・使用できる新しい機能です。ローコード プラグインは、Power Fx という言語でサーバー側のカスタム ビジネス ロジックを定義できます。ローコード プラグインには、手動で実行するインスタント プラグインと、Dataverse テーブル イベントに応じて自動で実行する自動プラグインの 2 種類があります。ローコード プラグインは、データの操作や検証にかかる時間を短縮し、Dataverse の機能を拡張する強力なツールです。この記事では、ローコード プラグインの作成方法や動作確認方法について説明しています。

# Dataverse Accelerator とは

Dataverse Accelerator は、Dataverse 環境でローコード プラグインを作成、使用できるようにするものです。
ローコードプラグインの 2 種類があり、それぞれ異なるトリガーとパラメーターを持ちます。

| 種類 | トリガー | パラメータのサポート | スコープ |
|:-----------|:------------|:------------|:------------|
| インスタント       | 手動で実行する        | はい         |グローバルとテーブル         |
| 自動   | Dataverse テーブル イベント      | いいえ       |テーブル        |


Dataverse Accelerator は、Dataverse 上のデータ操作のパフォーマンスを向上させたり、カスタムのビジネスロジックを実現したりするための強力なツールです。

## プラグインとは

ローコードプラグインということは、Dataverse にはローコードじゃないプラグインがあるということです。

> プラグインは、Microsoft Dataverse データ操作の処理中に発生した特定のイベントに応答して実行されるカスタム イベント ハンドラーです
https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/plug-ins

そもそもの Dataverse プラグインとは、.NET Framework で実装され、Dataverse イベント フレームワーク内の特定のイベント (ステップ) に登録し、Create、Retrieve、RetrieveMultiple、Update、Delete、Associate、Disassociate 発生すると、登録されたプラグインのコードが実行されます。

[イベントフレームワーク](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/event-framework)

つまりプラグインとは、データ処理動作を拡張または変更する手段ということになります。

## ビジネス ルールとプラグイン

ビジネス ルールによっては実装ができなかったり、複雑であったりすることから、プラグインでロジックを記述することを選択する場合があります。 1 つのシナリオとして、複雑な条件をプラグインで実装したり、ビジネスルール内ではアクセスが難しいデータにアクセスする場合に利用したりします。

## プラグイン以外の選択肢

実際プラグインを使わずとも、 Power Automate やワークフロー、計算フィールドなど、他にもデータ処理動作を拡張する手段はあります。

- ワークフローでは、複数のワークフローで使用できるコードで再使用可能な条件およびアクションを作成できる、カスタム ワークフロー拡張 (ワークフロー活動) を使用できます。
- 計算フィールドおよびロールアップ フィールドは、以前はワークフローを使用しなければ実行できなかった機能を提供します。
- ユーザー定義アクションは、ワークフローに似た種類のプロセスで、他のワークフローまたは Web サービス エンドポイントから呼び出せる再利用可能なメッセージを作成できます。
- Azure Service Bus 統合と Webhooks を使用して、多くのさまざまなリソースを使用してロジックを適用できる外部システムにデータを格納できます。
- Power Automate は、以前はプラグインを使用して実行されていた多くの機能を提供します。

## プラグインを利用する利点と考慮する点

- プラグインは、サーバー側で実行されるので、データの操作や検証にかかる時間を短縮できる
- プラグインは、C# で作成できるので、開発者は自分のスキルや知識に合わせてロジックを定義できる
- プラグインは、Dataverse の機能を拡張し、既存のビジネス ソリューションにないニーズに対応できる

ただし、高機能で高性能なため、高い開発スキルが求められます。不適切に作成されたプラグインはデータ処理の遅延のみでなく、環境全体のパフォーマンスに影響を与える可能性があります。
また、 Dataverse を利用する Power Apps などのローコードアプリケーションは、急速に変化するビジネスに対応することができるため、それに合わせたプラグインの修正も必要になる可能性が高いです。


# ローコードプラグインとは

そんな中、Power Fx でプラグインを開発することで、簡単にこれらの利点を利用することが可能になったものが、ローコードプラグインになります。
C#を必要とせず、Power Apps でもおなじみの Power Fx を利用することで、開発者以外もプラグインを開発することが可能になりました。

## 利用するための前提条件

[ローコード プラグインを作成するための前提条件](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/low-code-plug-ins?tabs=instant#prerequisites-for-creating-a-low-code-plug-in)

2023 年 10 月 1 日 以降に作成した環境に関しては既に Dataverse Accelerator が存在すると思います。それ以前に作成した環境に関しては管理画面からインストールし追加する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/b6ee3f47-54df-e7bf-85b5-e571703876fd.png)

起動すると以下のような画面になります。（既定で２つ作られています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/cbe2d4be-5177-34ba-ebe1-4b948198b854.png)

## 自動実行プラグインを作成 (Automated plug-in)

Create automated plug-in を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a5921d82-cfbe-aa87-6724-1cb5330d750c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/7e2e9b92-29bb-6eb3-018a-928097ecb6a7.png)



| パラメータ | 値 | 
|:-----------|:------------|
| DisplayName       | プラグインの表示名 日本語NG       | 
| Table   | 対象のテーブル     | 
| Run this plug-in When the row is      |どのタイミングでプラグインを実行するのか（作成時、更新時、削除時）      | 
| Expression   | ローコードプラグインで実行したい式を記載する      | 

詳細オプション（Advanced options）を開くとさらに設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e739ebcb-a1ab-eb75-ca40-16fc4c0969c4.png)


| パラメータ | 値 | 
|:-----------|:------------|
| When should this run      | レコードが実際に追加／編集／削除される前に処理を実行するかどうか      | 
| Solution   | ローコードプラグインを配置するソリューション     | 


試しに適用日が現在の日付より３日以降先の日付でない場合登録できないようなプラグインを作成します。（2023/12/6 であれば、2023/12/10 以降しか登録できないようにする）

テーブルは「LowCodePlug-inTable」というテーブルを用意し、適用日という日付のみの列を用意しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e0dae9fa-b452-0c90-77a7-8044a28b4432.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/ca14c3c3-0583-23b0-5507-f1d60e384caa.png)

選択したソリューションに追加されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/411ca280-8587-3f90-e002-2c5f6d034f6b.png)

こちらにも表示されています（Automated を選択していないと表示されません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/703d013b-0088-145f-55b0-da9979a20724.png)

### 動作確認

#### Dataverse のテーブル

Dataverse のテーブルからデータを登録してみましょう。

正しくエラーになっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/c15cda00-bb05-fb73-e00f-30116cce9a95.png)

先の日付は登録できることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/95f77479-e273-6ee2-3fb2-24c7bce9790f.png)

#### モデル駆動型アプリ

モデル駆動型アプリで動作を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/724b3959-e3e2-84ab-9d0f-66dc9c27174e.png)

エラーメッセージも表示され、データも正しく登録できています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/28f2755b-9acd-debf-c2b7-479f37ab0620.png)

#### キャンバスアプリ

キャンバスアプリでも確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/efe504ee-8919-85e1-7b2f-80397f014c78.png)

エラーにはなりますが、メッセージは表示されません。
監視上ではエラーメッセージは確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/9374eabf-6e82-d5c9-9a1a-a87f8037a4fe.png)

## 手動実行のプラグイン (Instant plug-in)

今度は手動で実行するプラグインを作成してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/8e5b6ac6-5429-57ee-9824-29a0b577ba4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/9cd8ec72-c06b-fefb-4d5b-d67ad52c9dde.png)


| パラメータ | 値 | 
|:-----------|:------------|
| DisplayName       | プラグインの表示名 日本語NG       | 
| Parameters  | 引数と戻り値の定義    | 
| Expression   | ローコードプラグインで実行したい式を記載する      | 




詳細オプション（Advanced options）を開くとさらに設定が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/188c26ff-af65-5ca2-d386-9db4d88e0311.png)



| パラメータ | 値 | 
|:-----------|:------------|
| Solutioin       | プラグインを配置するソリューション       | 
| Name  | プラグインの論理名 環境全体で一意である必要がある   | 
| Description   | プラグインの使用方法や機能に関する説明      | 
| Scope   | テーブルの行に関連付けする必要がるかどうか 必要が無ければグローバルを選択   | 

関連付けを行うと、引数に行のデータを渡す必要がありますが、その行のデータを ThisRecord で取得することが可能になります。
エンティティを選択すると、テーブルを選択する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/44a9a5bc-aea9-fa76-7d43-a8acd3b80696.png)

つまり汎用的なプラグインの場合は、グローバル、エンティティに関連付けをする必要がある場合はエンティティをスコープとして選択する形になります。

### 汎用的なグローバルプラグイン

試しに数値を３桁でカンマ区切りにするプラグインを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/66dea745-9b13-c0e2-4d6e-ab3f7c29fd00.png)

Test を選択して、入力してみると正しく動作していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/003c9b97-dd82-c16f-fcf2-a8f2d724cd92.png)



:::note alert
Value に直接数値を入力すると入力されていない扱いになるようで、入力後にスピンボタンで上下を選択してから、Run を選択してください
:::


保存後ソリューションに正しく保存されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/c06fa5fc-0703-7d96-d06f-28bf3e6d5cb1.png)



### 動作確認

#### キャンバスアプリ or カスタムページ

キャンバスアプリやカスタムページの場合、Environment というテーブルを追加する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e655b71b-42dc-c4d6-bb1f-64470c7e2adf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e7d9a8ee-6c98-4b14-1c07-9d158e1c9601.png)

このような形で呼び出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/e060fd90-7691-b1cb-b4be-62b7debfa14f.png)

利用する場合は変数に入れているのでこのような形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/b7394fc2-20cc-965d-654d-c069442bb5ce.png)


正しく動作していることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/1ed6e019-5472-8e59-3863-2d9fb441d1f1.png)


コードスニペットを利用することで、より簡単に使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/57c77d89-62f3-3958-a654-13631dab6838.png)


```
// コピーした式
Environment.new_split({NumValue:Value})
```

### PowerAutomate

今回はグローバルの手動実行プラグインなので、「バインドしてないアクションを実行しする」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/1c87e7a9-6625-bd35-23fd-7197eb4b4dc2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a3e1c0fe-2712-5d64-9839-d41c4bb3af7a.png)

正しく動作していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/ea67bdc2-c324-84b6-8803-a12ff1e7b9dd.png)


# まとめ

Dataverse のローコードプラグインは、今までできなかったことややりにくかったことを簡単に実装する手段になります。もちろんローコードプラグインを使う必要が無かったり、使わなくても実装ができることもたくさんありますが、それらを含めて機能を実装する上での選択肢にしてみてはいかがでしょうか？


# リンク
- [プラグイン](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/plug-ins)
- [イベントフレームワーク](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/event-framework)
- [プラグインの使用例](https://learn.microsoft.com/ja-jp/training/modules/extend-plug-ins/usage)
- [Power Platform Work](https://www.youtube.com/channel/UClAwgSz5vwnyJZNFA4g6p3w)

# 自己紹介

普段は YouTube Channel で Power Apps や Power Automate に関しての１分程度でまとめた動画を投稿しています。 600本以上の動画がありますので、ぜひキャンバスアプリを作成する際の参考にしてみてください。
[Power Platform Work](https://www.youtube.com/channel/UClAwgSz5vwnyJZNFA4g6p3w)