次の方法で共有


Errors 関数

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

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

概要

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

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

  • これらの各関数は、操作の結果としてエラー値を返します。 Errors 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 は、データ ソース全体に対して、または関数に Record 引数を指定して選択した行に対してのみ返すことができます。

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

エラーがない場合、 Errors 返されるテーブルは になり、 IsEmpty 関数を使用してテストできます。

構文

Errors( DataSource [, Record ] )

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

手順

この例では、Power Apps が競合の検出を試みるデータ ソースである IceCream データ ソースを使用します。

アイス クリーム。

Power Apps では、Dataverse テーブルに対する変更の競合を検出しようとはしません。

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

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

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

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

Quantity プロパティのみが変更されているため、Gallery.Updates{ Quantity: 90 } に評価されます。

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

  • IsEmpty( Errors( IceCream, EditRecord ) )

Errors関数が次の表を返したため、false を返します。

レコード メッセージ エラー
{ フレーバー: "チョコレート", 数量: 100 } 空白 "別のユーザーが、変更しようとしているレコードを変更しました。 レコードを再読み込みして、もう一度やり直してください。 ErrorKind.Conflict

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

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

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

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