最近のアクセス:
ビジネスコンポーネントのエラー処理

SaveCheckLoad、または Delete の各メソッドを実行すると、GeneXus によって自動的に生成されたメッセージ (データ整合性コントロールや主キーの値の一意性などによって GeneXus が発行するメッセージ) と、Transaction オブジェクトで定義した独自の Error ルールおよび Msg ルールがトリガーされます。
これらのコントロールが自動的にトリガーされる場合でも、発行されるメッセージを取得して明示的に表示し、エンドユーザーが認識できるようにする必要があります。
それでは、発生したメッセージを再取得するにはどうすればよいでしょうか。
新しいナレッジベースの作成時に GeneXus によって自動的に定義される構造化データタイプである Messages を使用します: 
イメージ:23254.png 
このコレクション データ タイプを使用すると、ビジネスコンポーネントの実行時に発行されるメッセージにアクセスできます。
したがって、ビジネスコンポーネントを使用するオブジェクトで、次の 2つの変数を定義します:
  • &Messages: Messages データタイプの変数 (コレクション)
  • &oneMessage: Messages.Message データタイプの変数 (コレクション内の 1つのエレメント)
イメージ:23255.png

Customer トランザクションをビジネスコンポーネントとして定義する ([ Business Component ] プロパティを True に設定する) とします:
Customer 
{ 
  CustomerId* ( [ Autonumber ]  プロパティ = True) 
  CustomerName 
  CustomerAddress 
  CustomerPhone 
  CustomerEmail 
  CustomerBirthDate 
  CustomerAddedDate 
  CountryId 
  CountryName 
}
Country トランザクション:
Country 
{ 
  CountryId* ( [ Autonumber ]  プロパティ = True) 
  CountryName 
}
Customer のルールは次のとおりです:
Default(CustomerAddedDate,&today);
error('顧客は 18 歳以上である必要があります') if CustomerBirthDate.Age()<18;
この場合、Customer トランザクションのビジネス コンポーネント データ タイプがナレッジベースに自動的に作成され、作成された新しいタイプの変数を任意のオブジェクトで定義できます。したがって、顧客タイプに基づいて、任意のオブジェクトで &customer 変数を定義し、次の操作を行います:
  1.  - &customer 変数に対して行う必要がある処理のコードを記述します。
  2. - &customer 変数に Save メソッドを適用します。
  3. - 発生した可能性があるエラーを処理します。次のコードは、コレクション変数で発生したエラーを取得して、ユーザーに通知する (またはその他の処理を行う) ためにコレクションを反復処理する方法を示しています:
 &customer.save()
If &customer.Fail() 
   &Messages = &customer.GetMessages()             //発生した可能性があるメッセージを取得します (メッセージを抽出し、&Messages コレクションにロードします)
   for &oneMessage in &Messages                    //コレクションを反復処理します 
      Do case
      Case &oneMessage.Id ='PrimaryKeyNotFound'    
           msg('顧客情報が存在しません')
      Case &oneMessage.Id ='ForeignKeyNotFound'  
           msg('国情報が存在しません') 
      Case &oneMessage.Id= 'RecordWasChanged'  
           msg('顧客情報が別のユーザーによって変更されました')         
      Case &oneMessage.Id ='DuplicatePrimaryKey'    
           msg('同じ識別子を持つ顧客が既に存在します')
      Otherwise
           msg(&oneMessage.Description) 
      Endcase       
   endfor
endif


GeneXus で定義される最も一般的なメッセージ:

Id タイプ 説明
PrimaryKeyNotFound MessageTypes.Error   指定されたキーを持つデータが見つかりませんでした
DuplicatePrimaryKey MessageTypes.Error レコードが既に存在します
ForeignKeyNotFound MessageTypes.Error 一致する '<テーブル名>' がありません
CandidateKeyNotFound MessageTypes.Error レコードを更新するには、最初にそのレコードを読み込む必要があります
CannotDeleteReferencedRecord MessageTypes.Error 削除操作が無効です (関連情報: '<テーブル名>' 内)
RecordIsLocked MessageTypes.Error 別のユーザーがレコードを使用しています
OutOfRange MessageTypes.Error 範囲外の '<項目属性名>' です
RecordWasChanged MessageTypes.Error   '<テーブル名>' が変更されています
 
:
 - OutOfRange: [ Value Range ] プロパティを設定している項目属性、または列挙型データタイプに基づいた項目属性に適用します。
 - オブジェクト名が構造化データタイプ (SDT) の「Messages」と競合する場合、ナレッジベースのバージョンを 9.0 に変換すると、オブジェクト名が変更されます。互換性に関するセクションを参照してください。


トランザクションルールでユーザーが定義する Error ルールと Msg ルール:

Error ルールMsg ルールを使用すると、Messages コレクション (SDT) にメッセージを含めることができます。Error ルールと Msg ルールを定義する場合、次の構文に従って Id にオプションのパラメーターを設定できます:
                    Msg('<メッセージ文>', Id); 
                    Error('<エラー文>', Id);

例: Error("顧客名は空白にすることはできません", CustomerNameCannotBeEmpty) if CustomerName.isempty();

CustomerNameCannotBeEmpty パラメーターは Messages SDT の [ Id ] プロパティとみなされます。
 

考慮事項

Id
- GeneXus の標準メッセージの場合、モデルで設定されている言語に関係なく、Id には必ず英語を使用します。
   -  Id を使用する場合、「1」、「2」、「3」、「Error1」、「Error2」などのコードを指定することもできますが、「CustomerNameCannotBeEmpty」などの、読んで内容が分かるテキストを Id として定義することをお勧めします。そのほうがコードが分かりやすくなります。例: "If &Customer.GetMessages().Item(1).Id=CustomerNameCannotBeEmpty" のほうが "If &Customer.GetMessages().Item(1).Id=1" よりも分かりやすいコードです。
タイプ
タイプは列挙型ドメインに基づいています。確認できる値は、MessageTypes.Warning  MessageTypes.Error です。 
 










サブページ
Created: 15/01/07 22:48 by Admin Last update: 23/01/26 23:36 by Admin
カテゴリ
Powered by GXwiki 3.0