「upsert」操作を実行します。追加を試行して、キーの重複エラーが発生して処理に失敗した場合、更新を実行します。
&VarBasedOnBC.
InsertOrUpdate()
入力値の説明:
&VarBasedOnBC
ビジネスコンポーネントに基づくスカラー変数またはコレクション変数です。
戻されるタイプ:
Boolean
1) 次の
トランザクションをビジネスコンポーネントとして定義する (
[ Business Component ] プロパティを True に設定する) とします:
Customer
{
CustomerId*
CustomerName
CustomerAddress
CustomerPhone
CustomerEmail
CustomerAddedDate
}
Customer トランザクションのビジネス コンポーネント データ タイプが
ナレッジベースに自動的に作成され、作成された新しいタイプの変数を任意のオブジェクトで定義できます。
したがって、次の
Procedure オブジェクトは、Customer タイプに基づく &Customer 変数を受け取ります。ソース内では
InsertOrUpdate メソッドが変数に適用され、顧客情報の挿入または (キーの重複により追加に失敗し、「レコードは既に存在しています」というエラーメッセージが表示される場合は) 顧客情報の更新が試行されます。
Procedure: InsertOrUpdateCustomer
Rules
parm(in:&Customer)
Source
&Customer.InsertOrUpdate()
if &Customer.success()
commit
else
rollback
endif
2) 次のトランザクションをビジネスコンポーネントとして定義する (
[ Business Component ] プロパティを True に設定) とします:
Product
{
ProductId*
ProductName
ProductStock
}
Product トランザクションのビジネス コンポーネント データ タイプがナレッジベースに自動的に作成され、作成された新しいタイプの変数を任意のオブジェクトで定義できます。
Product データタイプに基づいて &Products という変数を定義し、任意のオブジェクトでコレクションとして設定できます。
この例の目的は、(
Data Provider オブジェクトによって返された) 製品のコレクションを &Products 変数に割り当てて、&Products 変数に
InsertOrUpdate メソッドを適用することです。そのため、挿入がそれぞれ試行され、コレクションの特定の製品が既に存在する場合は、その製品が更新されます。
そのためには、以下に示すコードを対応するオブジェクトのセクション (Web Panel オブジェクトの Event、Panel オブジェクトの Event、Procedure オブジェクトの Source など) に記述します。
&Products=DPProducts()
if &Products.InsertOrUpdate()
commit
else
rollback
endif
DPProducts
Data Provider オブジェクトの定義は次のとおりです:
Data Provider: DPProducts
Properties: Output:Product / Collection:True
Source:
Product
{
ProductId = 100
ProductName = 'X Muscular Pain Medicine'
ProductStock = 1000
}
Product
{
ProductId = 101
ProductName = 'J Headache Medicine'
ProductStock = 1500
}
3) 次の 2 レベルトランザクションをビジネスコンポーネントとして考慮する (
[ Business Component ] プロパティを True に設定する) とします:
Country
{
CountryId*
CountryName
CountryFlag
CountryPopulation
City
{
CityId*
CityName
}
}
Country トランザクションのビジネス コンポーネント データ タイプがナレッジベースに自動的に作成され、作成された新しいタイプの変数を任意のオブジェクトで定義できます。
Country データタイプに基づいて &Countries という変数を定義し、任意のオブジェクトでコレクションとして設定できます。この変数には、(
Data Provider オブジェクトによって返される) 国のコレクションがロードされます。その後、
InsertOrUpdate メソッドが変数に適用されます。挿入がそれぞれ試行され、コレクションの特定の国が既に存在する場合は、その国が更新されます。
CountryId=1 のレコード (CountryName='Uruguay'、CountryPopulation=3300000) が既に格納されていて、CountryFlag には対応する画像が格納されており、関連する次の都市も格納されているとします。
1, 1, Montevideo
1, 2, Maldonado
1, 3, Colonia
次のように DPCountries データプロバイダーを定義します:
Data Provider: DPCountries
Properties: Output:Country / Collection:True
Source:
Country
{
CountryId = 1
CountryPopulation = 3445863
City
{
CityId = 4
CityName = 'Salto'
}
City
{
CityId = 5
CityName = 'Paysandu'
}
}
Country
{
CountryId = 2
CountryName = Argentina
CountryFlag = ArgentinaFlag.Link()
CountryPopulation = 43000000
City
{
CityId = 1
CityName = 'Buenos Aires'
}
City
{
CityId = 2
CityName = 'Rosario'
}
City
{
CityId = 3
CityName = 'Cordoba'
}
}
その後、以下に示すコードを対応するオブジェクトのセクション (
Web Panel の Event、
Panel オブジェクトの Event、
Procedure オブジェクトの Source など) に記述します。
&Countries=DPCountries()
&Countries.InsertOrUpdate()
if &Countries.success()
commit
else
rollback
endif
CountryId=1 については、挿入が試行されますが、CountryId=1 は既に存在します。そのため、CountryPopulation が更新され、それに関連して CityId=4 と CityId=5 が追加されます。また、CountryId=2 については、挿入が試行され、処理は成功します。
リスト内のビジネスコンポーネントにエラーがある場合、以降のビジネスコンポーネントは処理されますか?
はい。エラーが発生したかどうかに関係なく、リスト内のエレメントはすべて処理されます。その後、変更内容をコミットするかどうかを判断します。
どのビジネスコンポーネントでエラーが発生したかを確認したい場合は、リストをスキャンして各コンポーネントを確認する必要があります。たとえば、
InsertOrUpdate メソッドの適用後に次のコードを記述できます。
For &Product in &Products
if &Product.GetMessages().Count > 0
//msg(...)
endif
endfor
このメソッドは
GeneXus 15 以降のバージョンで使用可能です。
Apple のオフラインアプリケーションについては
GeneXus 15 Upgrade 2 以降で使用できます。
ビジネスコンポーネントのエラー処理