【Power Apps】複雑かつ大量のバリデーションチェックが必要なときのおすすめ実装

以下の記事でPower Appsでのバリデーションチェックの実装方法の比較や考え方などを紹介しました。

https://powerplatformnikki.com/validationcheck

今回はこちらの記事で紹介しきれなかった**複雑かつ大量のバリデーションチェックが必要な時におすすめの実装方法**を紹介します。
個人的にはPower Appsでバリデーションチェックを実装することは非推奨ですが、どうしても実装したい！/しなければならない！という方の参考になれば幸いです。

この記事は [Microsoft Power Apps Advent Calendar 2024](https://qiita.com/advent-calendar/2024/powerapps) シリーズ1 12月11日 担当分の記事です。

## 比較まとめ(再掲)

前回の記事の再掲です。

### ユーザー視点での実装パターンごとのメリット・デメリット

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/ee41cda3-b7b3-2442-9e48-2cc3cb6a5fbd.png)

上記の表のメリット・デメリットより、**1の実装パターンは入力項目が多いフォーム**に、**2の実装パターンは入力項目のエラー条件が複雑な場合**に適していると考えられます。
3のボタン非活性を利用する場合は、2の方法を併用しないとユーザーはエラー理由を知ることができないので注意です。

### Power Appsでのバリデーションチェックの実装パターン比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/7a17764c-c586-7b6a-bde2-7f4b517d1fde.png)

複雑な条件(＝工数がかかる)順に実装パターンの強みと弱みを比較しました。

## Errorプロパティを利用したリアルタイムチェック

### 特徴

- **ユーザーが入力中に即座にバリデーションチェックを行う方法**です。
- 正しく入力するまでエラーが表示され続け、エラーが表示されている状態で保存ボタンをクリックするとさらにエラー通知がされます。
- 多くのフィールドに対してバリデーションチェックを行う場合には有効ですが、それなりに工数がかかります。

### ロジック概要

カードのRequiredプロパティがtrueのとき、Updateプロパティが空白だとエラーになる仕様を活用してエラーチェックを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/ffb80ee0-3994-3755-48e9-224616519be7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2cabc56d-7458-e8c7-71a3-68c5e941c2c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/e827eb37-8d4e-11b1-bfec-791f48c9fb9e.png)

バリデーションチェックの数式をチェック対象のカードに書くので、Power Appsで起こりがちな数式の参照・非参照の分散を避けることができます。

### 実装方法

#### データカード内コントロールのプロパティ設定

まずバリデーションチェックを行いたいカードのロックを解除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/b5144f81-7965-3c25-aa1a-05d097301f78.png)

次にErrorMessageラベルのTextプロパティをバリデーションチェックを行いたい数式に変更します。
今回はIsMatch関数を使用して特定の入力形式になっているかどうかを正規表現でチェックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/77a482e9-cb73-e4c7-a847-186fe3885ed8.png)

ErrorMessageラベルのVisibleプロパティの数式を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/f637d9b5-59f9-6b13-f81d-c2fb25bc5243.png)

#### データカードのプロパティ設定

カードに移り、Requiredプロパティを以下に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/7bfbfa97-0de3-0662-6e28-84c67e8ce17b.png)

続けてUpdateプロパティを以下に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/2411c05a-8b36-d28d-1e3a-c7ab7760eab8.png)
```
If(
    !Self.Required,
    DataCardValue.Value
)
```

ここまでをバリデーションチェックを行うカードすべてに適用します。

#### 名前付き計算式を活用したエラーメッセージの表示

次に名前付き計算式(App.Formulas)を用いてエラーが発生しているカードの場所を特定しやすくしつつ、エラーメッセージを通知できるようにします。

Table関数を使用し、エラーが発生しているカードの表示名とエラーメッセージをテーブルにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/a1cd6350-aeef-f427-d0d7-86738a0fd198.png)

```
_errors =
    Table(
        {displayName:タイトル_DataCard1.DisplayName, msg:ErrorMessage1.Text},
        {displayName:価格_DataCard1.DisplayName, msg:ErrorMessage2.Text},
        {displayName:発売日_DataCard1.DisplayName, msg:ErrorMessage4.Text}
    );
```

フォームのOnFailureプロパティに以下の数式を設定することで、保存エラー時にエラー発生箇所のメッセージを通知することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/a437516e-10ab-f9d2-ea35-6265799d88ad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618051/b4ea9825-5471-fb7c-a5d0-888b3e64b76f.png)

### 元記事

https://powerplatformnikki.com/complexvalidation/