---
title: ローコードプラグインを使って瞬時にビジネスプロセスフローのアクティブステージを関連テーブルに連携する
url: "https://www.geekfujiwara.com/tech/powerplatform/4877/"
author: ギークフジワラ
published: "2024-05-31T08:23:14+00:00"
updated: "2024-05-31T08:26:44+00:00"
categories: [Power Platform]
tags: [Dataverse, Microsoft, Power Automate, PowerApps, ローコードプラグイン]
description: "今回は商品のレンタルのステータスをビジネスプロセスフロー (BPF)で管理しているアプリがあったとします。 こんな時、たとえばBPFのアクティブステージ (現在有効なステージ。画面上で言うとRequest) の状態ごとに表示させる項目をビジ…"
---

# ローコードプラグインを使って瞬時にビジネスプロセスフローのアクティブステージを関連テーブルに連携する

今回は商品のレンタルのステータスをビジネスプロセスフロー (BPF)で管理しているアプリがあったとします。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-127-1024x568.png)

こんな時、たとえばBPFの==アクティブステー=={.red}ジ (現在有効なステージ。画面上で言うとRequest) の状態ごとに表示させる項目をビジネスルールで変更させたり、==画面表のロック (読み取り/編集可能) などを制御したいケース==ってあるかと思います。

たとえば、==アクティブステージ=={.red}がRequest、つ==まりレンタル申請された時では最低限の情報のみ表示==させ、==Rentalのステージになった時には承認結果を表示させたい==、などの時です。

ただこういった時、BPFが一体何なのかを親テーブル (ここではBPFが関連づけられているItem Rental Service テーブルとする)では確認することができません。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-128-1024x687.png)

そのため、ビジネスルールを親テーブルで設定しようとしても、親テーブルでは==アクティブステージ=={.red}の列を持っていないため==アクションを行うことができません=={.blue}。

今回はそのケースを解消する仕組みとして、==アクティブステージを即座に親テーブルに連携=={.blue}する機能を==ローコードプラグイン=={.green}で作成したいと思います。

## Power Automate での連携の課題

Power Automate でBPFが更新された時をトリガーに、親テーブルにアクティブステージを同期する方法もあります。

しかし、実際の運用としてPower Apps でBPFを変更してもコミットを待たないのでブラウザキャッシュが優先され、アクティブステージはリアルタイムで反映されません。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/38dfa9b1647d1e354beb88681ff1e32c-1024x576.png)

つまり、Power Automate による親テーブル連携が実施されたかな？と言うタイミングでPower Apps にてブラウザやデータの更新を手動で行う必要があります。これではせっかくアクティブステージによって==表示項目をコントロールしたりしたいのに、自動的に反映されず==ユーザービリティがよろしくないです。

この課==題を解消することができるのがプラグイン=={.blue}です。Dataverseにて実行されるためパフォーマンスも高いです。

[Microsoft Dataverse のローコード プラグインでアプリ開発を効率化する - Power Apps \| Microsoft Learn](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/low-code-plug-ins?tabs=instant)

今回はこのBPFのアクティブステージを親テーブルに連携する方法を通して、ローコードプラグインの利用方法をご紹介します。

## 用語の解説

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

ローコードプラグインは、Dataverse 内で特定のコマンド セットを実行する再利用可能なリアルタイム ワークフローであり、サーバー側で実行されます。

以前はワークフロー機能がありましたが非推奨機能となりました。そのため、プラグイン開発はC#のようなプロ開発の言語を学ぶ必要がありました。

このローコードプラグインはそのとっつきにくさを解消し、Power Fxで作成することができます。

Power Automate のクラウドフローのように、インスタント、自動化の両方が用意されています。

> [!TIP]
> スケジュール実行はありません。

| タイプ | トリガー | パラメーターのサポート | サポート対象 [スコープ](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/custom-api#select-a-binding-type) |
| --- | --- | --- | --- |
| 即時 | 手動で実行 | はい | グローバルとテーブル |
| 自動 | Dataverse テーブル イベント | いいえ | テーブル |

ローコードで作成するプラグインは、Dataverse アクセラレーターというモデル駆動型アプリにて行えます。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-130-1024x568.png)

アプリの外観はこちらのようなものです。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-129-1024x568.png)

> [!NOTE]
> このアプリは基本的には現在、自動的に全環境にインストールされています。

プラグインの実行と作成が分かれていますのでご注意ください。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/4-1024x576.png)

それでは早速プラグインをローコードで作成していきましょう。

## 前提条件

今回サンプルとして利用するアプリはこのようなビジネスプロセスフローで、以下のようなステージを持っています。

{.accent}
- Request
- Rental
- Closed

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-132-1024x568.png)

またBPFに関連づけられている親テーブルには以下のような選択肢列`Active Stage Option`を用意しておきます。

> [!TIP]
> それぞれステージと同じ名前の選択肢を持っています。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-134-1024x568.png)

この選択肢列を親テーブルのフォームに表示しておきます。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-135-1024x568.png)

## プラグインをローコードで作成

Dataverse アクセラレーターアプリを開きます。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-131-1024x568.png)

> [!NOTE]
> アプリを利用する際は、表示言語は英語を推奨します。日本語で利用すると現時点でDisplay Nameで撮ってくるところのPower Fxの動きが若干不安定と思います。

自動化プラグインを利用します。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-136-1024x568.png)

Display Name にはプラグインの名称をつけ、ビジネスプロセスフローのテーブルを指定します。

Updateされた時に起動するようにします。

Power Fx の式は複雑ですがこのようにしました。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-137-1024x568.png)

関数はWith 関数にて、BPFで更新されたアクティブステージの値が何かによってSwitch関数で切り替えられ、ActiveStageOption という変数に格納されるようにしています。

:::raw
<!-- wp:group {"className":"parent","css":".parent {\n\tposition: relative;\t\n}","scopedCSS":"#id-62ea580b-0406-4cfe-9f42-58a7d1c3c0fb .parent {\n\tposition: relative;\t\n}","js":"let btn = block.querySelector(\u0022.code-btn\u0022);\n\nbtn.addEventListener(\u0022click\u0022, () =\u003e {\n  let txt = block.querySelector(\u0022code\u0022).innerText;\n  navigator.clipboard.writeText(txt);\n\n  let copied = block.querySelector(\u0022.copied\u0022);\n  copied.style.display = \u0022block\u0022;\n  setTimeout(function () {\n    copied.style.display = \u0022none\u0022;\n  }, 1500);\n});","blockId":"id-62ea580b-0406-4cfe-9f42-58a7d1c3c0fb"} -->
<div class="wp-block-group parent"><!-- wp:paragraph {"css":"i {\n\tcursor: pointer;\n\tposition: absolute;\n\ttop: 2.5em;\n\tright: 1em;\n\tz-index:98;\n}\n\n.fa-copy {\n\tcolor:#777;\n}\n\n.copied{\n\tdisplay:none;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tz-index:99;\n\tbackground:#222;\n\tcolor:#fff;\n\tborder-radius: 5px;\n\tpadding:3px;\n}","scopedCSS":"#id-fab7264f-72ac-4b45-abc2-25f671f065af i {\n\tcursor: pointer;\n\tposition: absolute;\n\ttop: 2.5em;\n\tright: 1em;\n\tz-index:98;\n}\n\n#id-fab7264f-72ac-4b45-abc2-25f671f065af .fa-copy {\n\tcolor:#777;\n}\n\n#id-fab7264f-72ac-4b45-abc2-25f671f065af .copied{\n\tdisplay:none;\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tz-index:99;\n\tbackground:#222;\n\tcolor:#fff;\n\tborder-radius: 5px;\n\tpadding:3px;\n}","blockId":"id-fab7264f-72ac-4b45-abc2-25f671f065af"} -->
<p><i class="fas fa-copy code-btn"></i><span class="copied">コピーしました！</span></p>
<!-- /wp:paragraph -->

<!-- wp:sgb/codebox {"title":"Power Fx","source":"With({ \n    ItemRentalRecord: ThisRecord.\u0026lt;親テーブルの検索列\u003e \n    ActiveStageOption: Switch(ThisRecord.activestageid.stagename, \n          \u0022Request\u0022, \u0026lt;選択肢列名\u003e.\u0026lt;選択肢（Request）\u003e,\n          \u0022Rental\u0022,  \u0026lt;選択肢列名\u003e.\u0026lt;選択肢（Rental）\u003e,\n          \u0022Closed\u0022,  \u0026lt;選択肢列名\u003e.\u0026lt;選択肢（Closed）\u003e'\n          )\n},\nPatch([@\u0026lt;親テーブル名\u003e], ItemRentalRecord, {\u0026lt;選択肢列名\u003e:　ActiveStageOption}))","highlight":true,"className":"parent","css":"pre {\n    background: #3c3c3c;\n\tcolor:#ddd;\n\tfont-size: 0.9em;\n\tborder: none;\n}\n\ncode,\n.hljs-tag {\n\tcolor:#fff;\n}\n\n.pre_tag\u003espan {\n    background-color: #3c3c3c;\n}","scopedCSS":"#id-210d261f-144e-4171-a55d-dc3811b52a71 pre {\n    background: #3c3c3c;\n\tcolor:#ddd;\n\tfont-size: 0.9em;\n\tborder: none;\n}\n\n#id-210d261f-144e-4171-a55d-dc3811b52a71 code,\n#id-210d261f-144e-4171-a55d-dc3811b52a71 .hljs-tag {\n\tcolor:#fff;\n}\n\n#id-210d261f-144e-4171-a55d-dc3811b52a71 .pre_tag\u003espan {\n    background-color: #3c3c3c;\n}","blockId":"id-210d261f-144e-4171-a55d-dc3811b52a71"} -->
<div class="wp-block-sgb-codebox pre_tag parent"><span><i class="fa fa-code"></i>Power Fx</span><pre class="js-sng-highlight"><code>With({ 
    ItemRentalRecord: ThisRecord.&lt;親テーブルの検索列> 
    ActiveStageOption: Switch(ThisRecord.activestageid.stagename, 
          "Request", &lt;選択肢列名>.&lt;選択肢（Request）>,
          "Rental",  &lt;選択肢列名>.&lt;選択肢（Rental）>,
          "Closed",  &lt;選択肢列名>.&lt;選択肢（Closed）>'
          )
},
Patch(&#91;@&lt;親テーブル名>], ItemRentalRecord, {&lt;選択肢列名>:　ActiveStageOption}))</code></pre></div>
<!-- /wp:sgb/codebox --></div>
<!-- /wp:group -->
:::

> [!TIP]
> Advanced optionのところは特に何も指定せずそのままとします。もし処理前(Pre-operation)にしてしまうと、アクティブステージが更新される前に取得してしまうので、正しいアクティブステージがとれません。

![](https://www.geekfujiwara.com/wp-content/uploads/2024/05/image-138.png)

## 実行

ここで、テスト的に実行しましたが、モデル駆動型アプリの新しい外観では正しく反映されませんでした。そのため、古い外観で実行しました。この場合、うまく動きました。

> [!NOTE]
> ローコードプラグインはプレビュー機能なので、それなりに制限があります。

:::raw
<!-- wp:videopress/video {"title":"item-rental-service_-information_-001-power-appse381aee382b3e38394e383bc-1-mp4","description":"","id":4896,"guid":"xd583oJ9","src":"https://videos.files.wordpress.com/xd583oJ9/item-rental-service_-information_-001-power-appse381aee382b3e38394e383bc-1.mp4","cacheHtml":"\u003ciframe title=\u0022VideoPress Video Player\u0022 aria-label='VideoPress Video Player' width='600' height='338' src='https://videopress.com/embed/xd583oJ9?cover=1\u0026amp;preloadContent=metadata\u0026amp;useAverageColor=1\u0026amp;hd=0' frameborder='0' allowfullscreen data-resize-to-parent=\u0022true\u0022 allow='clipboard-write'\u003e\u003c/iframe\u003e\u003cscript src='https://v0.wordpress.com/js/next/videopress-iframe.js?m=1674852142'\u003e\u003c/script\u003e","videoRatio":56.33333333333333570180911920033395290374755859375,"privacySetting":2,"allowDownload":false,"rating":"G","isPrivate":false,"duration":23080} /-->
:::

アクティブステージが即時反映されていることがわかります。

以上ご参考になれば幸いです。
