コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Apps のフォームコントロールについて理解を深めてみる


スポンサードリンク

はじめに

今回はPower Apps のフォームコントロールの理解を深めるために公式docs などをみてフォームコントロールの理解を深めたいと思います。

基礎大事。

なんでこんなことをしようと思ったのかというと、この前こんなツイートしたところ...

Akira さんから以下のような回答をいただきました。

これに対する返信私意味わからないこと言っていますね。

これの後の返信でやまさんからご指摘をもらいようやくなんかよくわからないこと言っていることに気が付きました。。。

今回はその反省も兼ての基礎の見返しになります。

基礎大事。超大事。

参考文献

docs.microsoft.com

docs.microsoft.com

フォームコントロールの理解を深める

現在のフォーム状態を取得する

私がツイートしていた件ですね。

フォームコントロールは、

  • 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 でこれ確認してみるとここに書かれているより多くの定義あるんですよね。
みるとこ間違えているのかな。。。

docs.microsoft.com

例によってこちらも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 を利用すれば取得可能です。

qiita.com

例えばSharePoint リストのID 列などの自動で割り振られる結果を取得したい場合などに便利です。

SubmitForm に成功すると、 Form.OnSuccess の式が実行されるので、ここで UpdateContext などでID を取得するといいかもですね。

未保存のデータがあるかを確認する

編集フォーム内にユーザが未保存の変更が含まれているかを判断することも可能です。

Form1.Unsaved

で判断可能です。
未保存の変更が含まれている場合は true を返します。

例えば未保存のデータがあるにも関わらずユーザがフォームの内容が変更されるような操作を行おうとしている場合や、未保存のデータがある場合にどこかの色などを変えてユーザが視覚的に未保存だということをわかりすくする。
なんて場合に使えますね。

更新内容を取得する

編集フォームでユーザが入力した(既存レコード編集の場合で対象項目を編集していない場合は既存の値)を取得することが可能です。

Form1.Updates

docs の説明だとSubmitForm をする場合は不要で、Patch 関数の利用の際に使う。
とかいてますね。

個人的にはこの他にも、 DataCardValue などのどの項目か分かりにくい名称で入力内容を取得するよりもこっちで取得するようにしたほうが、可読性が上がり保守性も増すのでいいのではないかなぁと思います。

現在の入力内容でSubmit 可能かどうかを調べる

現在の入力内容でSubmit 可能かどうかを調べる方法もあります。

Form1.Valid

こちらは例えば、必須項目が未入力の場合などに false を返すようです。
対象フォーム内で入力されたデータで対象データソースのルールにより、データの登録が失敗する場合は false を返してくれるようなプロパティのようですね。

おわりに

いい機会なので調べてみたら案外知らなかったこととか知ることができました。

docs 今一度読み直そう。
基礎大事。


スポンサードリンク