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



6.2.2 顧客情報の編集
●データオブジェクトの構築
 では,List 6-14に示したUpdateCustomerメソッドとGetCustomerメソッドをBusiness.Customerコンポーネントに実装してゆく。

○レコードの取得と設定のためのメソッド
 今回のサンプルでは,データオブジェクトという概念を導入しているので,Business.Customerコンポーネントから直接顧客情報テーブルにアクセスせず,いったんデータオブジェクトであるDataObj.Customerコンポーネントを経由する。そこで,Business.CustomerコンポーネントにGetCustomerメソッドとUpdateCustomerメソッドを追加するまえに,DataObj.Customerコンポーネントに顧客情報テーブルのレコードを取得するメソッドと設定するメソッドを追加する。ここでは,レコードを取得するメソッドをGetRecord,設定するメソッドをUpdateRecordという名前で実装することにする。実装例は,List 6-16List 6-17のようになる。

 なお,List 6-17UpdateRecordメソッドでは,請求書の締め日(BILLDAYフィールド)は設定しないようにした。締め日を設定するメソッドはList 6-18のように別途用意する。締め日は,営業部ではなく経理部が設定するのが一般的である。COM+のロールによるセキュリティはメソッド単位で設定されるため,もし請求書の締め日をUpdateRecordメソッドで設定してしまうと,「営業部は請求書の締め日を設定できないが,経理部は請求書の締め日を設定できる」というセキュリティを実装するのが困難になる。ただし,あくまでも困難になるだけであり,不可能というわけではない。具体的には,ObjectContextオブジェクトのIsCallerInRoleメソッドを使って,呼び出したユーザーが営業部に属するのか経理部に属するのかを調べるような仕組みを組み込めばよい。

 List 6-16List 6-17List 6-18は,DataObj.Customerコンポーネントに実装するものである。したがって,これらのプログラムはDataObjプロジェクト内のCustomerクラスに記述することになる。

 List 6-17List 6-18では,既存のレコードの値を変更するために書き込み可能なADODB.Recordsetオブジェクトを利用している。そうではなく,ADODB.ConnectionオブジェクトのExecuteメソッドを使って,SQLのUPDATE文を実行するようにしてもよい(「Appendix A ADOコンポーネントによるデータベースアクセス」および「AppendixB SQLの基本文法」を参照)。

 List 6-16List 6-17List 6-18における引数の型は,データベーステーブルの定義におけるフィールドの型と合わせたLong型やString型などではなく,Variant型とした。その理由は,(1)Long型やString型などではNull値を渡すことができない,(2)ByRef渡しの変数でVariant型以外を使うと,VBScriptから呼び出すことができない,という2つの問題があるためである(「COLUMN ByRef渡しの場合の型」を参照)。

 ところで,List 6-16List 6-17List 6-18では,エラーコードErrorcode.Err_NotFoundErrcode.Err_BILLDAYという2つの定数を新たに利用している。これらの定数は,List 6-3で示したErrorcode列挙型に追加しておく(List 6-19)。

prevpg.gif Chapter 6 18/92 nextpg.gif