任意のオブジェクトからデータベースを更新する際に、「Silent」モード (フォームを表示しない) でトランザクションを実行できるようにします。
オブジェクト: Transactionジェネレーター: .NET、
.NET Framework、
Android、
Apple、
Java
ビジネスコンポーネントを使用する主なメリットは、任意の GeneXus オブジェクトからデータベースを更新できること、および
トランザクションが実行されたときに実行されるのと同じコントロールを実行できることです。
このプロパティの既定値は False です。
トランザクションの [ Business Component ] プロパティを True に設定すると、トランザクションと同じ名前の新しいデータタイプが
ナレッジベースに作成され、この新しいデータタイプに基づく変数を任意のオブジェクトで定義できます。
たとえば、Customer トランザクションをビジネスコンポーネントとして定義する ( [ Business Component ] プロパティを True に設定する) とします。
このプロパティを True に設定すると、Customer という名前のビジネス コンポーネント データタイプがナレッジベースに自動的に作成されます。そうすると、下の
Web パネルの例に示すように、任意のオブジェクトに新しいデータタイプに基づく変数を定義できます。
ビジネス コンポーネント データ タイプに基づく変数 (この例では &customer) には、トランザクションの項目属性に対応する一連の
プロパティが与えられます (これにより、値を割り当てることができます)。
また、ビジネスコンポーネントの変数に一連の
メソッドを適用できます (データベースで挿入や更新などの操作を実行するため)。
重要: ビジネスコンポーネントの変数のプロパティに値を割り当て、メソッドを実行してデータベースを更新した後、データベースに対するすべての操作が一連の
論理作業単位 (LUW) を構成すると考えられる範囲について、
Commit コマンドをコードに明示的に記述する必要があります。
このプロパティは設計時にのみ適用されます。
上記の Customer トランザクションに次のルールが含まれているとします:
CustomerId 項目属性で
[ Autonumber ] プロパティが [ True ] に設定されているものとします。
次のコード (&Customer 変数が定義されている Web パネルのイベントセクション内) では、
&Customer 変数のプロパティ (つまり、Customer 項目属性) に値を割り当てた後、変数に Save メソッドを適用し、最後に Commit コマンドを実行することで、顧客を挿入します:
Event 'Insert customer'
&Customer=new() //ここでは new 演算子を省略できますが、複数の顧客が挿入される場合は、new 演算子を使用する必要があります
&Customer.CustomerName = 'John'
&Customer.CustomerLastName = 'Smith'
&Customer.CustomerAddress = '165 Ocean Drive'
&Customer.CustomerEmail = 'jsmith@hotmail.com'
&Customer.Save()
if &Customer.Success()
commit
else
msg(&Customer.GetMessages().ToJson())
endif
EndEvent
上記のコードについて説明します。
Save メソッドの実行時:
- Customer トランザクションのルールで定義されている既定のルールがトリガーされ、CustomerAddedDate 項目属性が割り当てられます。
- CustomerId 項目属性は自動ナンバリングされます。
- CustomerPhone が割り当てられていないので、テーブル内の項目属性に値は含まれません (空になります)。
- トランザクションに外部キーとして CountryId 項目属性や CityId 項目属性があり、対応するテーブルに存在しない値をこれらの項目属性に間違って割り当てた場合、Save メソッドで記録しようとしても失敗します。
- モードが更新に変更され、レコードはメモリー内にインスタンスを維持します。
- データベースにアクセスするためのメソッドを適用した後は、必ず
エラー処理を行うことをお勧めします。
GeneXus 15 以降では、Save メソッドの代わりに
Insert メソッドを使用して同じ顧客情報の挿入を解決することもできます:
Event 'Insert customer'
&Customer=new() //ここでは new 演算子を省略できますが、複数の顧客が挿入される場合は、new 演算子を使用する必要があります
&Customer.CustomerName = 'John'
&Customer.CustomerLastName = 'Smith'
&Customer.CustomerAddress = '165 Ocean Drive'
&Customer.CustomerEmail = 'jsmith@hotmail.com'
if &Customer.Insert()
commit
else
msg(&Customer.GetMessages().ToJson())
endif
EndEvent
プロパティに値を設定したときに、それに対応する変更を適用するには、すべての
Transaction オブジェクトをリビルドしてください。