Errors 関数

適用対象: キャンバス アプリ モデル駆動型アプリ

データ ソース への前の変更のエラー情報を提供します。

概要

エラーは、データ ソースのレコード が変更された場合に発生することがあります。 ネットワーク障害、不適切なアクセス許可、編集の競合など、多くの原因が考えられます。

PatchCollectRemoveRemoveIfUpdateUpdateIfSubmitForm など、データ ソース内のデータを変更する関数は、2 つの方法でエラーを報告します。

  • これらの各関数は、演算の結果としてエラー値を返します。 エラーは IsError で検出でき、通常どおり IfErrorApp.OnError で置換または抑制できます。 詳細については、エラー処理をご覧ください。
  • 演算の後、Errors 関数は以前の演算のエラーも返します。 これは、状態変数でエラーをキャプチャする必要なしに、フォーム画面にエラー メッセージを表示するのに役立つ可能性があります。

Validate 関数と DataSourceInfo 関数を使用すると、一部のエラーを発生前に回避することができます。 エラーの処理および回避方法についての推奨事項については、データ ソースの操作 を参照してください。

内容

Errors 関数は、次の を含むエラーのテーブル を返します。

  • 記録。 エラーが発生したデータ ソース内のレコード。 レコードの作成中にエラーが発生した場合、この列は空白になります。
  • カラム。 エラーが 1 つの列に原因があると考えられる場合に、エラーの原因となった列。 そうでない場合は、空白になります。
  • メッセージ。 エラーの説明。 このエラー文字列は、エンド ユーザーに対して表示できます。 このメッセージはデータ ソースによって生成される場合があり、長くなったり、ユーザーには意味を持たない生の列名を含んでいる可能性があることに注意してください。
  • エラー。 エラーを解決するために数式で使用できるエラー コード。
ErrorKind 内容
ErrorKind.Conflict 同じレコードに対して別の変更が行われ、変更の競合という結果になりました。 Refresh 関数を使用して、レコードを再読み込みし、変更を再度試します。
ErrorKind.ConstraintViolation 1 つ以上の制約に違反しています。
ErrorKind.CreatePermission レコードを作成しようとしましたが、現在のユーザーにはレコードを作成するためのアクセス許可がありません。
ErrorKind.DeletePermission レコードを削除しようとしましたが、現在のユーザーにはレコードを削除するためのアクセス許可がありません。
ErrorKind.EditPermission レコードを編集しようとしましたが、現在のユーザーにはレコードを編集するためのアクセス許可がありません。
ErrorKind.GeneratedValue データ ソースが自動的に生成する列を変更しようとしました。
ErrorKind.MissingRequired 必要な列の値がレコードにありません。
ErrorKind.None エラーはありません。
ErrorKind.NotFound レコードを編集または削除しようとしましたが、レコードが見つかりませんでした。 別のユーザーがレコードを変更した可能性があります。
ErrorKind.ReadOnlyValue 読み取り専用の列を変更しようとしました。
ErrorKind.Sync データ ソースによってエラーが報告されました。 詳細については、メッセージの列を確認してください。
ErrorKind.Unknown エラーが発生しましたが、種類が不明です。
ErrorKind.Validation 他の種類の 1 つに適合しない、一般的な検証のイシューが検知されました。

関数にレコード引数を提供すると、データ ソース全体または選択された行のみにエラーが返されます。

パッチ または別のデータ関数が 空白 たとえば、レコードを作成できなかった場合の値。 Errors空白を渡すと、そのような場合は適切なエラー情報が返されます。 同じデータ ソースのそれ以降のデータ関数の使用は、このエラー情報を消去します。

エラーがない場合、Errors が返すテーブルは になり、IsEmpty 関数でテストすることができます。

構文

エラーデータソース [、 記録 ])

  • DataSource – 必須。 エラーを返すデータ ソース。
  • 記録 – オプション。 エラーを返す特定のレコード。 この引数を指定しない場合、関数はデータ ソース全体のエラーを返します。

手順

この例では、IceCream データ ソースを使用して操作します。

アイス クリーム。

アプリを使用して、ユーザーはチョコレートのレコードをデータ入力フォームに読み込み、次に数量の値を 90 に変更します。 操作対象のレコードは、コンテキスト変数EditRecord に配置されています。

  • コンテキストの更新( { 編集レコード: LookUp( IceCream, Flavor = "Chocolate" ) } )

データ ソースでこの変更を行うには、次のように Patch 関数を使用します。

  • パッチ(IceCream、EditRecord、Gallery.Updates)

ここで、Quantity 関数のみが変更されたため、{Gallery.Updates} Quantity: 90 と評価されます。

残念ながら、Patch 関数が呼び出された直前に、他のユーザーがチョコレートの数量を 80 に変更しました。 Power Apps はこれを検出し、競合する変更の発生を許可しません。 次の数式でこの状況を確認できます。

  • IsEmpty( エラー( IceCream, EditRecord ) )

Errors 関数が次のテーブルを返したため、false が返されます。

レコード メッセージ エラー
{ Flavor: "Chocolate", Quantity: 100 } 空白 "別のユーザーが、変更しようとしているレコードを変更しました。 レコードを再読み込みしてから再度やり直してください。" ErrorKind.Conflict

このエラーをユーザーに表示するため、フォームにラベルを置くことができます。

  • エラーを表示するには、ラベルの Text プロパティを次の数式に設定します。
    Label.Text = First(Errors( IceCream, EditRecord )).Message

フォームにリロード ボタンを追加すると、ユーザーが効率的に競合を解決できるようにすることもできます。

  • 競合が発生した場合にのみボタンを表示するには、ボタンの Visible プロパティを次の数式に設定します。
    !IsEmpty( Lookup( Errors( IceCream, EditRecord ), Error = ErrorKind.Conflict ) )
  • ユーザーがボタンを選択して変更を元に戻すには、その OnSelect プロパティを次の数式に設定します。
    ReloadButton.OnSelect = 元に戻す( IceCream, EditRecord )