- はじめに
- 参考文献
- フォームコントロールの理解を深める
- フォームのエラーを取得する
- 最後に登録したレコードの情報を取得する
- 未保存のデータがあるかを確認する
- 更新内容を取得する
- 現在の入力内容でSubmit 可能かどうかを調べる
- おわりに
はじめに
今回はPower Apps のフォームコントロールの理解を深めるために公式docs などをみてフォームコントロールの理解を深めたいと思います。
基礎大事。
なんでこんなことをしようと思ったのかというと、この前こんなツイートしたところ...
今そのForm がNewForm かEditForm かの判別って出来たっけ
— コルネ (@koruneko32767) September 8, 2021
Akira さんから以下のような回答をいただきました。
そこ参照してもEnum しかとれないんですよね
— コルネ (@koruneko32767) September 8, 2021
現在どれが設定されているかはわからない
Form.Mode
これに対する返信私意味わからないこと言っていますね。
これの後の返信でやまさんからご指摘をもらいようやくなんかよくわからないこと言っていることに気が付きました。。。
あれ、ごめんなさい。普通にできますね。
— コルネ (@koruneko32767) September 8, 2021
数分前の私なに言ってたんだ
今回はその反省も兼ての基礎の見返しになります。
基礎大事。超大事。
参考文献
フォームコントロールの理解を深める
現在のフォーム状態を取得する
私がツイートしていた件ですね。
フォームコントロールは、
- Edit
- New
- View
の3種のモードを設定することができます。
現在のフォームがどのモードなのかは、対象フォームの Mode
で取得することが可能です。
これで取得されるデータ型は Enum
型ですので、 Value 関数で数値を取り出してあげましょう。
Value(Form1.Mode)
こうすることで、0, 1, 2のいずれかの数値が取り出せたかと思います。
これらの数値が現在のモードを表しています。
この数値は FormMode
という既定のEnum 型と対応しており、これらと比較することで現在のモードを判定することができます。
Switch( Value(Form1.Mode), FormMode.Edit, "FormMode.Edit", FormMode.New, "FormMode.New", FormMode.View, "FormMode.View" )
もちろん、これらは数値で判断していますので、
Switch( Value(Form1.Mode), 0, "FormMode.Edit", 1, "FormMode.New", 2, "FormMode.View" )
みたいにかくことも可能です。
ちなみにdocs のほうに載っていなかったのでこれらの内容と数値を記載しておくと
MODE | Value | 内容 |
---|---|---|
FormMode.Edit | 0 | フォームには、既存のレコードが設定され、ユーザーはフィールドの値を変更できます。 完了すると、ユーザーはレコードに変更を保存できます。 |
FormMode.New | 1 | フォームは既定の値で設定され、ユーザーはフィールド値を変更できます。 完了すると、ユーザーはレコードをデータ ソースに追加できます。 |
FormMode.View | 2 | フォームには既存のレコードが設定されますが、ユーザーはフィールドの値を変更できません。 |
となります。
フォームのエラーを取得する
SubmitForm 関数が失敗したときのエラーメッセージも取得することが可能です。
取得可能なエラーは2種類存在し
- Error
- ErrorKind
の2種があります。
Error
Error
はユーザフレンドリなエラーメッセージ、つまりユーザにわかりやすいエラーメッセージが表示されます。
このメッセージは必須項目エラーなどと同じようにユーザ(アプリ利用者)が使用している言語でエラーメッセージが返されます。
ただし、一部のメッセージはデータソースから直接送信され、ユーザが使用している言語とは異なる言語で表示される場合があるため注意が必要です。
ErrorKind
ErrorKind
はメッセージなどは出力せずエラーの種類を返します。
Mode
と同様にEnum 型で定義されており、 ErrorKind
という既定のEnum 型と比較することで種類を判別することが可能です。
こちらのdocs にErrorKind
の定義かいてはあるんですけど、Power Apps でこれ確認してみるとここに書かれているより多くの定義あるんですよね。
みるとこ間違えているのかな。。。
例によってこちらもValue が記載されていないので纏めます。
ErrorKind | Value | 内容 |
---|---|---|
ErrorKind.None | 0 | エラーはありません。 |
ErrorKind.Sync | 1 | データ ソースによってエラーが報告されました。 詳細については、メッセージの列を確認してください。 |
ErrorKind.MissingRequired | 2 | 必要な列の値がレコードにありません。 |
ErrorKind.CreatePermission | 3 | レコードを作成しようとしましたが、現在のユーザーにはレコードを作成するためのアクセス許可がありません。 |
ErrorKind.EditPermissions | 4 | (レコードを編集しようとしましたが、現在のユーザーにはレコードを編集するためのアクセス許可がありません。) |
ErrorKind.DeletePermissions | 5 | (レコードを削除しようとしましたが、現在のユーザーにはレコードを削除するためのアクセス許可がありません。) |
ErrorKind.Conflict | 6 | 同じレコードに対して別の変更が行われ、変更の競合という結果になりました。 Refresh 関数を使用して、レコードを再読み込みし、変更を再度試します。 |
ErrorKind.NotFound | 7 | レコードを編集または削除しようとしましたが、レコードが見つかりませんでした。 別のユーザーがレコードを変更した可能性があります。 |
ErrorKind.ConstraintViolated | 8 | (1 つ以上の制約に違反しています。) |
ErrorKind.GeneratedValue | 9 | データ ソースが自動的に生成する列を変更しようとしました。 |
ErrorKind.ReadOnlyValue | 10 | 読み取り専用の列を変更しようとしました。 |
ErrorKind.Validation | 11 | 他の種類の 1 つに適合しない、一般的な検証のイシューが検知されました。 |
ErrorKind.Unknown | 12 | エラーが発生しましたが、種類が不明です。 |
ErrorKind.Div0 | 13 | - |
ErrorKind.BadLanguageCode | 14 | - |
ErrorKind.BadRegex | 15 | - |
ErrorKind.InvalidFunctionUsage | 16 | - |
ErrorKind.FileNotFound | 17 | - |
ErrorKind.AnalysisError | 18 | - |
ErrorKind.ReadPermission | 19 | - |
ErrorKind.NotSupported | 20 | - |
ErrorKind.InsufficientMemory | 21 | - |
ErrorKind.QuotaExceeded | 22 | - |
ErrorKind.Network | 23 | - |
ErrorKind.Numeric | 24 | - |
"-"はdocs に記載されていなかったもの。
逆にdocs にはあったが、Power Apps 上見つからなかったのは以下。
ErrorKind | 内容 |
---|---|
ErrorKind.ConstraintViolation | 1 つ以上の制約に違反しています。 |
ErrorKind.DeletePermission | レコードを削除しようとしましたが、現在のユーザーにはレコードを削除するためのアクセス許可がありません。 |
ErrorKind.EditPermission | レコードを編集しようとしましたが、現在のユーザーにはレコードを編集するためのアクセス許可がありません。 |
これらはおそれくそれぞれ
- ErrorKind.ConstraintViolation -> ErrorKind.ConstraintViolated
- ErrorKind.DeletePermission -> ErrorKind.DeletePermissions
- ErrorKind.EditPermission -> ErrorKind.EditPermissions
に置き換わったのだと思われます。(docs が古い?)
なので上の表では () で記載しています。
一応コピペ用に Switch
式も載せておきます。
Switch( Value(Form1.ErrorKind), ErrorKind.None, "ErrorKind.None", ErrorKind.Sync, "ErrorKind.Sync", ErrorKind.MissingRequired, "ErrorKind.MissingRequired", ErrorKind.CreatePermission, "ErrorKind.CreatePermission", ErrorKind.EditPermissions, "ErrorKind.EditPermissions", ErrorKind.DeletePermissions, "ErrorKind.DeletePermissions", ErrorKind.Conflict, "ErrorKind.Conflict", ErrorKind.NotFound, "ErrorKind.NotFound", ErrorKind.ConstraintViolated, "ErrorKind.ConstraintViolated", ErrorKind.GeneratedValue, "ErrorKind.GeneratedValue", ErrorKind.ReadOnlyValue, "ErrorKind.ReadOnlyValue", ErrorKind.Validation, "ErrorKind.Validation", ErrorKind.Unknown, "ErrorKind.Unknown", ErrorKind.Div0, "ErrorKind.Div0", ErrorKind.BadLanguageCode, "ErrorKind.BadLanguageCode", ErrorKind.BadRegex, "ErrorKind.BadRegex", ErrorKind.InvalidFunctionUsage, "ErrorKind.InvalidFunctionUsage", ErrorKind.FileNotFound, "ErrorKind.FileNotFound", ErrorKind.AnalysisError, "ErrorKind.AnalysisError", ErrorKind.ReadPermission, "ErrorKind.ReadPermission", ErrorKind.NotSupported, "ErrorKind.NotSupported", ErrorKind.InsufficientMemory, "ErrorKind.InsufficientMemory", ErrorKind.QuotaExceeded, "ErrorKind.QuotaExceeded", ErrorKind.Network, "ErrorKind.Network", ErrorKind.Numeric, "ErrorKind.Numeric" )
最後に登録したレコードの情報を取得する
これはやまさんのQiita でも紹介されていますが、 LastSubmit
を利用すれば取得可能です。
例えばSharePoint リストのID 列などの自動で割り振られる結果を取得したい場合などに便利です。
SubmitForm に成功すると、 Form.OnSuccess
の式が実行されるので、ここで UpdateContext
などでID を取得するといいかもですね。
未保存のデータがあるかを確認する
編集フォーム内にユーザが未保存の変更が含まれているかを判断することも可能です。
Form1.Unsaved
で判断可能です。
未保存の変更が含まれている場合は true
を返します。
例えば未保存のデータがあるにも関わらずユーザがフォームの内容が変更されるような操作を行おうとしている場合や、未保存のデータがある場合にどこかの色などを変えてユーザが視覚的に未保存だということをわかりすくする。
なんて場合に使えますね。
更新内容を取得する
編集フォームでユーザが入力した(既存レコード編集の場合で対象項目を編集していない場合は既存の値)を取得することが可能です。
Form1.Updates
docs の説明だとSubmitForm をする場合は不要で、Patch 関数の利用の際に使う。
とかいてますね。
個人的にはこの他にも、 DataCardValue
などのどの項目か分かりにくい名称で入力内容を取得するよりもこっちで取得するようにしたほうが、可読性が上がり保守性も増すのでいいのではないかなぁと思います。
現在の入力内容でSubmit 可能かどうかを調べる
現在の入力内容でSubmit 可能かどうかを調べる方法もあります。
Form1.Valid
こちらは例えば、必須項目が未入力の場合などに false
を返すようです。
対象フォーム内で入力されたデータで対象データソースのルールにより、データの登録が失敗する場合は false
を返してくれるようなプロパティのようですね。
おわりに
いい機会なので調べてみたら案外知らなかったこととか知ることができました。
docs 今一度読み直そう。
基礎大事。