PowerApps 入力チェックについての考察

平成最後のエントリーは、PowerAppsのFormコントロールにおける入力チェック（Validation）について、調べてみた結果です。

# 業務アプリ等でよくあるコト
入力フォームにおいて、必須入力チェックなどのエラーメッセージについて非常に細かな文言指定をしてくださる方がいます。例えば「入力必須の項目で未入力の場合は“入力必須です。正しく入力してください”としろ」など。
残念ながら、PowerApps のキャンバスアプリでこんな注文を賜った日にはめんどくさくてやってられないのです。本日は、そういうご要望をいただく前に気を付けて封殺してください、という結論になります。

さて、それはなぜか？詳細は以降で。

# Formコントロールの入力チェック順序
まず、SubmitFormされた際の入力チェック等が発動する順番について把握しましょう。

■[Edit form and Display form controls in PowerApps(※英語)](https://docs.microsoft.com/en-us/powerapps/maker/canvas-apps/controls/control-form-detail)

> When the SubmitForm function runs, it first validates the data that user wants to submit. If a required field doesn't contain a value or another value doesn't conform to some other constraint, the ErrorKind properties are set, and the OnFailure formula runs.

上記URLの日本語はこちら。

■[PowerApps の [Edit form (フォームの編集)] コントロールと [Display form (フォームの表示)] コントロール](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/controls/control-form-detail)

> SubmitForm 関数が実行されると、まず、ユーザーが送信しようとしているデータが検証されます。 必須のフィールドに値が含まれていないか、別の値がその他の制約に準拠していない場合、ErrorKind プロパティが設定され、OnFailure 式が実行されます。

SubmitForm（フォームを確定＝データ更新）したタイミングで、必須項目のチェックがまず実行されるよ、って感じですね。そして、失敗するとErrorKind プロパティが設定され、OnFailure 式が実行される。結果「Form名.Error」にエラー情報が詰め込まれる、というイメージ。

■大まかな流れ
　SubmitForm
　　↓
　必須チェック
　　↓
　その他制約等チェック
　　↓
　　エラーの場合 → ErrorでOnFailure発動
　　問題ない場合 → データソースが更新されてOnSuccess発動

# Formコントロールでエラー表示される概要
PowerAppsのアプリを１つでも作成したコトがある方であれば、必須項目に値を入力せずSubmitした際に「エントリが必要か、エントリに無効な値があります。訂正して、もう一度お試しください。」というエラーが該当のコントロール直下に表示された経験があると思います。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/7e326535-e1aa-c484-77eb-46fe64a43c5f.png)

これはDataCardの配下に自動で生成される「ErrorMessage」ラベルが自動で処理しているようです。画面で確認すると、Labelコントロールの[Text]プロパティには"Parent.Error"が設定されています。この"Parent"とは親のコントロール、つまりDataCardコントロールで、その[DataField]プロパティに指定されたデータソースの項目が該当します。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/0de5b641-38c9-49cf-f762-d40122c0b1fa.png)

なお、ここはFormコントロールを設定した際にPowerApps側が全自動で作成してくれるので、我々が何かする必要はありません。また、下手に操作すると正しく動作しなくなる可能性があります。そんな箇所なので、変更する場合は慎重に実施ください。

# Errorプロパティを操ればよいのか？
FormコントロールのErrorプロパティへ、独自の値を設定すればPowerApps側でヨロシクやってくれそうにみえます。残念ながら、Errorプロパティへ登録することは現状できません。開発者からは読み取り専用になっているようです。

# 独自エラーを実装する方法
標準で提供されている仕組みに対して、独自のエラーメッセージなどを実装することはできない、というのが現状の結論になります。では、冒頭のような要望があった場合、どういった対象が可能でしょうか。

## 独自エラー実装案１
SubmitFormを実行する前に、自前でチェック処理を実装するのが、１つ目の案になります。つまり、SubmitFormが発動するタイミングではエラーがすべて解除された状態になるよう、すべての入力チェックを実装する方法です。

英語ですが、下記のサイトが参考になると思います。

[A Few Best Practices in Data Validation](https://powerapps.microsoft.com/ja-jp/blog/validation/)

この案１で対応することで、入力チェックを柔軟に変更することができるため、ユーザーに優しいメッセージなどを設定することが可能になります。そのかわり、入力項目やチェック対象が多いと、それだけ実装に時間を要することになります。また、変更が発生した場合は非常にめんどくさいコトになります。

## 独自エラー実装案２
DataCardコントロール毎にチェック処理の結果が判定できる点を利用して、Parent.Error のメッセージを置き換えてしまう方法が案２になります。下記のように、ErrorMessageコントロールのTextプロパティを強制的に置き換えてしまえば任意のエラーメッセージを表示することが可能になります。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/75be9567-aa97-4664-08e7-6ff1534f463f.png)

```Label.Text
 If(IsBlank(Parent.Error),"","なんかエラーだよ")
```

この案２は柔軟なメッセージ対応が大変です。例えば、必須チェックに、型チェック（数値じゃないとダメ等）、etc・・・、入力項目に対するチェックが１つとは限りません。その場合、Errorプロパティの結果を判定して処理を分岐させる必要がありますが、すべてを把握するのはシンドイですよね。

# 個人的な結論
「どうしても・・」という場合でなければ、

　***エラーチェックはデフォルトのまま推奨！！***

です。
PowerAppsのデフォルトエラーメッセージはちょっとアレかもしれません。が、意図は通じるんだし。そこを改造するコトに時間使うのもったいにゃー。

# まとめ
- Formコントロール SubmitForm時の入力チェックは順番がある
    - 必須チェックが一番最初に実施される
- Formコントロール.Error は読み取り専用
- 独自エラー対応はめんどくさい
    - 案１：SubmitForm前に全て自前で処理する
    - 案２：SubmitForm後にErrorを置き換える努力をする
        - どっちもたいへん(/_;)


結論、エラーチェックはデフォルトのまま推奨です。
そんなトコに時間つかうのはもったいない。
我々にはやるべきコトがほかにある！

と、いうコトで、Formコントロールに対するエラーチェックやエラーメッセージ文句を言ってくる方が発生しないよう立ち振る舞うか、その方に是非ともご対応いただいて”いかに大変か？”を実感していただくと良いかな、と考えておる次第ですｗ


それでは、皆さま。令和になっても、素晴らしい Power Platform Life を！