この特集のトップページへ
Chapter 6:ビジネスロジックの設計

head2.gif 6.3.3 製品情報の削除
 次に,登録した製品の削除について考える。顧客の削除と同様に,製品の削除でも,レコードそのものを削除するのではなく,DELETEDFLAGフィールドをTrueにすることで,見かけ上は削除したように見せる。

●削除対象となる製品が参照されていないことの確認
 このサンプルにおけるデータベーステーブルは,Fig.6-61のように連携している。

Fig.6-61 テーブル間の連携
fig6_61

 Fig.6-61を見るとわかるように,製品情報テーブルは,在庫情報テーブルと明細情報テーブルから参照されている。よって,製品を削除するにあたっては,在庫情報テーブルならびに明細情報テーブル内に,削除対象となる当該製品を参照するレコードがないことを,事前に確認しなければならない。

 そこでまず,DataObj.StockコンポーネントとDataObj.SlipDetailコンポーネントという2つのデータオブジェクトを導入する。前者は在庫情報テーブルに対してデータベース操作をするコンポーネント,後者は明細情報テーブルに対してデータベース操作をするコンポーネントである。そして,DataObj.StockコンポーネントとDataObj.SlipDetailコンポーネントのそれぞれに,指定された製品番号を持つ製品を参照しているレコードの存在を確かめるメソッドを追加する。

 DataObj.StockコンポーネントとDataObj.SlipDetailコンポーネントを導入するには,DataObjプロジェクトを開き,StockというクラスモジュールとSlipDetailというクラスモジュールをそれぞれ追加すればよい。追加したそれぞれのクラスモジュールは,「トランザクションが必要」として構成するため,MTSTransactionModeプロパティを[RequiresTransaction]に設定しておく(Fig.6-62Fig.6-63)。

Fig.6-62 StockクラスモジュールのMTSTransactionModeプロパティ
fig6_62

Fig.6-63 SlipDetailクラスモジュールのMTSTransactionModeプロパティ
fig6_63

 StockクラスモジュールとSlipDetailクラスモジュールを追加したら,次にコンストラクタ文字列をデータベース文字列として使えるように処理を実装しておく。そのプログラムは,先に示したList 6-52と同様である。

 次に,StockクラスモジュールとSlipDetailクラスモジュールに対し,在庫情報テーブルと明細情報テーブルのそれぞれから,指定された製品番号の製品を参照していないことを確認するメソッドを追加する。Fig.6-61にも示したように,在庫情報テーブルも明細情報テーブルも,ともにPRODUCTIDフィールドの値を通じて製品情報テーブルを参照している。よって,指定された製品番号の製品を在庫情報テーブルと明細情報テーブルから参照していないということは,(1)在庫情報テーブル内に指定された製品番号とPRODUCTIDフィールドの値とが一致するレコードは存在しない,(2)明細情報テーブル内に指定された製品番号とPRODUCTIDフィールドの値とが一致するレコードは存在しない,ということを意味する。

 まずは,在庫情報テーブルのほうから説明する。在庫情報テーブルを処理するDataObj.Stockコンポーネントには,List 6-61に示すIsExistsProductメソッドを実装する。IsExistsProductメソッドは引数に製品番号をとり,指定された製品番号をPRODUCTIDフィールドの値として持つレコードが在庫情報テーブル内に存在するならばTrue,そうでなければFalseを返すものとする。

 次に,PRODUCTIDフィールドの値として,指定された製品番号を持つレコードが明細情報テーブルに存在するならばTrueを,そうでなければFalseを返すメソッドを実装する。この処理は,List 6-61とほぼ同じで,List 6-62のようになる。実際,List 6-61List 6-62の違いは,対象となるデータベースが異なるという点(22行目)のみである。

prevpg.gif Chapter 6 39/92 nextpg.gif