最近のアクセス:
ビジネスコンポーネントの InsertOrUpdate メソッド

「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 の EventPanel オブジェクトの 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
: 主キーの [ Autonumber ] プロパティを True に設定した場合は、キーの重複が検出されることはない (常に新しい識別子が生成される) ため、常に挿入が実行されます。

使用可能バージョン

このメソッドは GeneXus 15 以降のバージョンで使用可能です。
Apple のオフラインアプリケーションについては GeneXus 15 Upgrade 2 以降で使用できます。

参考情報

ビジネスコンポーネントのエラー処理






サブページ
Created: 17/05/30 19:02 by Admin Last update: 23/05/09 01:09 by Admin
カテゴリ
Powered by GXwiki 3.0