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



6.2.3 顧客情報の削除
●顧客を利用しているテーブルが存在しないかどうかの調査
 上記の説明のように,顧客を削除するにあたっては,その顧客を参照しているレコードが存在しないことをまず確認しなければならない。そこで,顧客を参照しているレコードが存在するかどうかを調べるメソッドを実装してゆくことにする。

 Fig.6-42にも示したが,顧客を削除する際に調べなければならないのは,伝票情報テーブルと請求書情報テーブルの2つである。

○伝票情報テーブルに指定した顧客番号を参照している伝票が存在するかどうかを調べる
 まずは,指定した顧客番号を持つ顧客を参照しているレコードが伝票情報テーブルに存在するかどうかを確認するメソッドを実装する。ここでは,DataObj.Slipという名前のコンポーネントを新しく導入し,そこにメソッドを実装することにする。

 DataObj.Slipコンポーネントを追加するためには,DataObjプロジェクトを開き,Slipというクラスモジュールを追加する。そして,トランザクションの状態を[トランザクションが必要]に設定するため,MTSTransactionModeプロパティの値を[RequiresTransaction]に変更する(Fig.6-43)。

Fig.6-43 Slipクラスのプロパティ
fig6_43

 追加したSlipクラスには,List 6-27List 6-28に示すプログラムを記述する。

 List 6-27に示したIsExistsCustomerメソッドは,引数に顧客番号をとり,その顧客番号を使っている伝票が存在するならばTrueを,存在しないならばFalseを返す。Fig.6-42を見るとわかるように,伝票情報テーブルにおいて,顧客番号を使っているのはCUSTOMERIDフィールドである。そこで,23行目で“SELECT * FROM 伝票情報 WHERE CUSTOMERID=引数に指定された顧客番号 AND DELETEDFLAG=0”というSQL文を実行し,返されたADODB.RecordsetオブジェクトのEofプロパティを参照し,該当するレコードが存在しないことを調べている。


One Point!List 6-27の23行目では,DELETEDFLAGフィールドがFalseであることを確認するのに,“DELETEDFLAG=False”とは書かずに“DELETEDFLAG=0”と記述している点に注意してもらいたい。SQL Server(MSDE)の場合,Microsoft AccessでいうところのYes/No型は,長さ1のビット型に対応する。ADOコンポーネントを使って長さ1のビット型のフィールドにアクセスした場合,値0はFalseに,値1はTrueに,それぞれ対応する。しかし,SQL文の条件式として使う場合には,FalseTrueと比較することはできず,0や1という実際の値と比較しないとエラーになる。

 なお,List 6-28は,コンストラクタ文字列を取得し,それをデータベース接続文字列として使うためのものである(「●データベース接続文字列を動的に設定できるようにする」を参照)。

○請求書情報テーブルに指定した顧客番号を参照している請求書が存在するかどうかを調べる
 請求書情報テーブルについても同様に,指定した顧客番号の顧客を参照しているレコードが存在するかどうかを調べるメソッドを実装する。このメソッドは,DataObj.Billという名前のコンポーネントを新たに導入し,そこに実装することにしよう。

 DataObj.Billコンポーネントを加えるには,DataObjプロジェクトを開き,Billという名前のクラスモジュールを追加する。そして,BillクラスモジュールのMTSTransactionModeプロパティを[RequiresTransaction]に設定する(Fig.6-43を参照)。

 Billクラスモジュールには,List 6-29に示すIsExistsCustomerメソッドとList 6-30に示すコンストラクタ文字列の処理部を追加する。List 6-30の内容はList 6-28とまったく同じである。List 6-29IsExistsCutsomerメソッドは,引数に指定された顧客番号を使っているレコードが請求書テーブル内に存在するかどうかを調べるものである。Fig.6-42に示したとおり,請求書情報テーブルにおいても伝票情報テーブルと同様に,CUSTOMERIDフィールドが顧客情報テーブルを参照するフィールドとなる。そこで,23行目にあるように,“SELECT * FROM 請求書情報 WHERE CUSTOMERID=引数に指定された顧客番号 AND DELETEDFLAG=0”というSQL文を実行することによって,レコードの存在を調べている。

prevpg.gif Chapter 6 25/92 nextpg.gif