Save、
Check、
Load、または
Delete の各メソッドを実行すると、GeneXus によって自動的に生成されたメッセージ (データ整合性コントロールや
主キーの値の一意性などによって GeneXus が発行するメッセージ) と、
Transaction オブジェクトで定義した独自の
Error ルールおよび
Msg ルールがトリガーされます。
これらのコントロールが自動的にトリガーされる場合でも、発行されるメッセージを取得して明示的に表示し、エンドユーザーが認識できるようにする必要があります。
それでは、発生したメッセージを再取得するにはどうすればよいでしょうか。
新しいナレッジベースの作成時に GeneXus によって自動的に定義される構造化データタイプである Messages を使用します:
このコレクション データ タイプを使用すると、ビジネスコンポーネントの実行時に発行されるメッセージにアクセスできます。
したがって、
ビジネスコンポーネントを使用するオブジェクトで、次の 2つの変数を定義します:
- &Messages: Messages データタイプの変数 (コレクション)
- &oneMessage: Messages.Message データタイプの変数 (コレクション内の 1つのエレメント)
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 変数を定義し、次の操作を行います:
- - &customer 変数に対して行う必要がある処理のコードを記述します。
- - &customer 変数に Save メソッドを適用します。
- - 発生した可能性があるエラーを処理します。次のコードは、コレクション変数で発生したエラーを取得して、ユーザーに通知する (またはその他の処理を行う) ためにコレクションを反復処理する方法を示しています:
&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 です。