キャンバスアプリvsモデル駆動アプリ -こんな時どっちを使う?-

こんにちは。PowerPlatform 勉強中の高橋です。
今回はキャンバスアプリとモデル駆動アプリ、それぞれの特徴についてまとめました。
「PowerAppsで作りたいアプリがあるけど、どっちで作るほうが良いのか？」
悩んでいる方は是非ご活用ください。




# 目次
- PowerAppsとは
- 本題に入る前に作成したいアプリのパターンを確認する
- 最初に考慮すべきこと
    - Dataverseは使う予定か
    - オーダーメイドのUIが必要か
    - 大量のデータを処理する必要があるか
- ロジックを実装したい場合考慮すべきこと
    - キャンバスアプリに置けるロジック
    - モデル駆動アプリに置けるロジック
    - PowerAutomateを使う
    - Dataverseを使う
- モデル駆動アプリにキャンバスアプリを組み込む
- まとめ
- 参考資料


# PowerAppsとは
PowerAppsでは2種類のアプリを作成できます。
### モデル駆動アプリの特徴
フォーム、ビュー、チャート、ダッシュボードなどのようなコンポーネントをテーブルへ追加することで構築できるアプリケーションです。単純なアプリから複雑なアプリまで、幅広く構築できます。

### キャンバスアプリの特徴
C#などの従来のプログラミング言語でコードを書くことなくアプリの設計・構築できるアプリケーションです。PowerPointのスライドを設計する場合と同じように、要素をキャンバスにドラッグアンドドロップして、アプリを設計します。

# 本題に入る前に作成したいアプリのパターンを確認する
[PowerAppsのパターン](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/overview)には、既にいくつかのシナリオが用意されています。
以下にその一部を抜粋してみました！作成したいアプリに類似するものがあれば参考にしてみてください。

#### [承認アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/approval-pattern)
- 出張申請
- 残業申請
- タイムカード管理 etc.
#### [資産管理アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/asset-management-pattern)
- 在庫管理
- 販売注文管理 etc.
#### [計算/変換アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/calculator-pattern)
- コスト見積もり
- 販売目標の計算
- 言語翻訳 etc.
#### [お知らせアプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/communication-pattern)
- 全社コミュニケーション
- 企業ニュース管理
- 製品カタログ etc.
#### [検査サプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/inspection-pattern)
- 日常業務の現場検査
- インシデントのレポート
- 品質管理チェックリスト etc.
#### [プロジェクト管理アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/project-management-pattern)
- プロジェクトの計画、追跡、レビュー etc.
#### [イベント管理アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/more-patterns#event-management)
- イベントの登録、出席
- イベントのセッションスケジュール etc.
#### [ワークフロー管理アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/more-patterns#lifecycle-or-workflow-management)
- メールルーター
- 従業員の昇進評価
- 経理報告のプロセス管理 etc.
#### [スケジュール管理アプリ](https://learn.microsoft.com/ja-jp/power-apps/guidance/patterns/more-patterns#scheduling)
-  会議室の予約
-  車の予約
-  顧客の来店スケジュール etc.

# 最初に考慮すべきこと

### 1. Dataverseを使う予定か
Dataverseを使わない場合は、問答無用でキャンバスアプリを使うことになります。
モデル駆動アプリはDataverseが無いと作れません。

### 2. オーダーメイドのUIが必要か
「シンプルで直観的に操作できる画面にしたい」「独自性の高いアプリを作りたい」など、見た目にこだわりがある場合はキャンバスアプリが適しています。こだわりがない場合はモデル駆動アプリを選びましょう。
モデル駆動アプリはデータの一覧画面と詳細画面を勝手に作成してくれるので、アプリをすばやく作成できます。


### 3. 大量のデータを処理する必要があるか
大量の作業を処理し情報をすばやく処理するには、モデル駆動型アプリが最適です。
キャンバスアプリでは、500件以上のデータにアクセスしようとするとアプリの動作に時間がかかったり、警告文が表示される危険性があります。
詳しくは[キャンバス アプリでの委任について](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview)をご確認ください。


# ロジックを配置する場所の決定
基本的には、複雑な計算ロジックの実装はモデル駆動アプリのほうが適しています。
しかし別の方法を使うと、キャンバスアプリやモデル駆動アプリ以外の場所にロジックを配置することができます。
具体的にどんなロジックを配置できるのか、それぞれ見ていきましょう。

### キャンバスアプリに置けるロジック
キャンバスアプリでロジックを実装するには[PowerFx](https://learn.microsoft.com/ja-jp/power-platform/power-fx/overview)と呼ばれる数式を使います。Excelの関数バーと似たような設定方法です。
以下のようなロジックを組みたい場合は、キャンバスアプリで実装するとよいでしょう。
- 変更した内容をすぐに画面上に表示したい
- 単純なロジックたけで使用できる(数十行もの複雑な数式書かずに済む)
- 特定のデータコネクタに限定できる
- 複雑なロジックを使用してデータを変換しない
- 一度に複数のレコードを処理しない (ForAll関数の使用を避けられる)

くどいようですが、キャンバスアプリはUIのカスタマイズを得意とする一方、複雑なデータ処理は苦手としています。
キャンバスアプリの編集画面ではロジックを組みすぎるとパフォーマンスの警告が出てしまうこともあるので注意しましょう。

### モデル駆動アプリに置けるロジック
モデル駆動アプリでは、キャンバスアプリよりも様々なことが実装できます。
以下の場合は、モデル駆動アプリが適しているでしょう。
- ロジックをデバイス上で実行する必要がある
- ロジックには複数のエンティティ (テーブル) が必要である
- すぐに使える機能では利用できない高度なロジックが必要である

モデル駆動アプリは様々なことができると書きましたが、中には専門的知識がないと実装できないところもあります。

#### 全ての開発者向け
以下の4つはローコード・ノーコードで実装できるので、全ての方が使用可能です。
- [ビジネスプロセスフロー](https://learn.microsoft.com/ja-jp/power-automate/business-process-flows-overview)を使ってデータ入力の一貫性を担保したい
- [ワークフロー](https://learn.microsoft.com/ja-jp/power-automate/workflow-processes)を使ってリアルタイムに処理を実行したい
- [操作(アクション)](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/actions)を使ってメッセージをカスタマイズしたい
- [ビジネスルール](https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/data-platform-create-business-rule)を使って画面を変化させたい

個人的にはビジネスプロセスフローとビジネスルールをお勧めします。

ビジネスルールは以下のロジックを設定できます。
- 列の値を設定する
- 列の値をクリアする
- 列の要件レベルを設定する
- 列を表示/非表示にする▲
- 列を有効化/無効化する▲
- データを検証し、エラーメッセージを表示する
- レコメンデーションを表示する▲

▲がついているロジックはキャンバスアプリでは機能しませんので注意してください。


#### プロ開発者向け
以下のようなロジックは専門的な知識を要します。
- [クライアント側スクリプト](https://learn.microsoft.com/ja-jp/power-apps/developer/model-driven-apps/client-scripting)を使って、ビジネスルールではできないバリデーションチェックを実装したい
- [API](https://learn.microsoft.com/ja-jp/power-apps/developer/model-driven-apps/clientapi/reference)を使って追加された顧客情報を検出したい
- [Webリソースでのコード](https://learn.microsoft.com/ja-jp/power-apps/developer/model-driven-apps/web-resources)を使用して、ビジネスルールではできないような値を列に設定したい

実測したいロジックが明確になったら、ローコード・ノーコードで実装できるか確認しましょう。それでも上のロジックが必要な場合、プロの開発者に相談することをお勧めします。


### PowerAutomateを使う
以下の場合は、PowerAutomateのフローを使って実装することを検討してみてください。

- 複数のコネクタを使ってロジックを実装したい
- 承認プロセスを作成したい
- 別の形式で作成されたデータを扱いたい
- デバイス側の処理能力への依存を減らしたい

PowerAutomateの強みは、様々なコネクタが用意されている点と大量のデータ操作を捌ける点だと感じています。
キャンバスアプリにロジックを置けない場合はPowerAutomateを使うことで、弱点を回避できます。

### Dataverseを使う
Dataverseにロジックを設定すると、データが特定の方法で使用されるようになるだけでなく、アプリのパフォーマンスの向上が見込めます。
以下の場合はDataverseにロジックを置くことを検討してみてください。

- 特定の列を必須項目にしたい
- 親デーブルのプライマリ列を子テーブルのフォームに表示したい
- 子テーブルの売り上げの累計を親テーブルの一覧に表示したい

Dataverse にロジックを適用する方法はいくつかあります。 ローコードを使用して、計算列、ロールアップ列などを設定できます。
詳細は[数式列](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/calculated-rollup-attributes)をご参照ください。
プロの開発者は、プラグインを作成するか、ワークフローの拡張機能を開発することにより、コードを使用するビジネスロジックを適用できます。

# モデル駆動アプリにキャンバスアプリを埋め込む
モデル駆動アプリ内に埋め込みのキャンバスアプリを使うことで、次の利点が見込めます。
- オリジナルの画面を挿入できる
- 様々なソースから収集したデータをDataverseのデータのすぐ隣に表示することができる

「モデル駆動アプリのホーム画面だけはリッチに仕上げたい」「Sharepointに置いてあるエクセルのデータも活用したい」など、どちらのアプリか決めきれない場合は[埋め込みキャンバスアプリ](https://learn.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/embed-canvas-app-in-form)を検討してみてください。

# まとめ
今回はキャンバスアプリとモデル駆動アプリの利用についてまとめました。
- キャンバスアプリ
    - UIを自由にデザインできる
    - 様々なデータソースを活用できる
    - 画面を作るのに比較的時間がかかる
    - 複雑なロジックを置くのには向いていない
- モデル駆動アプリ
    - 画面を自動で作ってくれる
    - 大量のデータを活用できる
    - キャンバスアプリを埋め込むことができる
    - 標準機能を拡張できるが専門的知識を要する
    - 画面のデザインは固定される
    - Dataverseありきのアプリ
- その他の知識
    - PowerAutomate
        - デバイス側のロジックを移行できる
        - コネクタを使うことで外部データを活用できる
    - Dataverse
        - デバイス側のロジックを移行できる
        - データの一貫性が保たれる
        - ローコードでロジックを配置できる
        - 標準機能を拡張できるが専門的知識を要する

[こちらの記事](https://qiita.com/szn-t/items/22e5e223fe56bf7e0c48)ではキャンバスアプリやモデル駆動アプリを使って業務改善する方法について記載しています。
こちらも併せて読んでみてください。


# 参考資料
- [モデル駆動型アプリの概要](https://learn.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/model-driven-app-overview)
- [キャンバス アプリとは](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/getting-started)
- [キャンバス アプリでの委任](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/delegation-overview)
- [作成するアプリのタイプを決定](https://learn.microsoft.com/ja-jp/power-apps/guidance/planning/app-type)
- [ロジックを配置する場所の決定](https://learn.microsoft.com/ja-jp/power-apps/guidance/planning/logic)
- [モデル駆動アプリのコンポーネント](https://learn.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/model-driven-app-components)
- [数式列、計算列、ロールアップ列](https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/calculated-rollup-attributes)
- [モデル駆動型フォームにキャンバス アプリを埋め込む](https://learn.microsoft.com/ja-jp/power-apps/maker/model-driven-apps/embed-canvas-app-in-form)