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



6.4.3 明細の処理
●明細の編集
 次に,明細情報を編集する方法について考える。「3.2.7 セキュリティと履歴」でも説明したように,明細情報では変更履歴を残すようにする。そのため,レコードの上書きは許さず,修正する場合にはそのレコードを削除ずみにしてから,新しいレコードを追加する(Fig.6-79)。

Fig.6-79 明細の修正
fig6_79

 つまり,Fig.6-79の方法をとる場合には,(1)明細を削除ずみにするメソッド,(2)明細を追加するメソッド,という2つのメソッドを実装すればよいということになる。すでに,(2)のメソッドはDataObj.SlipDetailコンポーネントのAddRecordメソッド(List 6-123)として実装ずみなので,ここでは(1)のメソッドのみを実装すればよい。

 明細を削除ずみとして扱うには,明細情報テーブルにおける該当するレコードのDELETEDFLAGフィールドの値をTrueに設定すればよい。このようなメソッドをDataObj.SlipDetailコンポーネントにSetDeletedという名前で実装すると,List 6-127のようになる。この内容は,すでに実装したDataObj.SlipInformationコンポーネントのSetDeletedメソッド(List 6-107)とほぼ同様である。ただし,DataObj.SlipDetailコンポーネントのSetDeletedメソッド(List 6-127)では,削除ずみにした明細と結び付いている伝票の伝票番号を戻り値として返すようにした。明細を削除ずみにするときには,それに結び付いている伝票の小計,消費税,合計の値も変更しなければならない。このとき,どの値を変更すべきかを知る必要がある。SetDeletedメソッドで伝票番号を返すようにしておけば,戻り値として取得した伝票番号に対してGetSubTotalメソッド(List 6-124)を呼び出すことで,変更された伝票の小計を求めることができる。同様に,DataObj.SlipコンポーネントのSetTotalメソッド(List 6-125)を呼び出すことで,伝票の小計,消費税,合計の値も更新することができる。

 次に,明細を編集するメソッドをビジネスコンポーネントに実装する。このメソッドの処理内容は,現在の明細をDataObj.SlipDetailコンポーネントのSetDeletedメソッド(List 6-127)で削除ずみにしたあと,AddRecordメソッド(List 6-123)を呼び出して新しいレコードを追加するというものである。このようなメソッドを,実際にBusiness.SlipコンポーネントにUpdateSlipDetailという名前で実装したものが,List 6-128である。List 6-128の処理は,Business.SlipコンポーネントのAddSlipDetailメソッド(List 6-126)とほぼ同様である。異なる部分は,DataObj.SlipDetailコンポーネントのSetDeletedメソッド(List 6-127)を呼び出すか否かという点だけである(よって,本来ならばサブルーチン化し,共通化できる箇所は共通化すべきである。しかし,わかりにくくなるのを避けるため,本連載ではあえて共通化はしない)。

 なお,List 6-128UpdateSlipDetailメソッドでは,処理手順の都合上,まず先に35行目で明細レコードを削除ずみにし,そのあとセキュリティの調査などをしている。このため,セキュリティ権限の如何にかかわらず,明細のレコードが削除ずみにされるように見えるかもしれない。しかし実際には,後続するセキュリティ処理などでErr.Raiseメソッドを呼び出し,実行時エラーを発生させることで,108行目以降のエラーハンドラ処理でObjectContextオブジェクトのSetAbortメソッドが呼び出される。そのため,レコードを削除ずみにした処理はロールバックされるため,必要なセキュリティ権限を備えていなければ,削除ずみに明細レコードはもとに戻る。

 また,ビジネスロジックには,明細を削除するためのメソッドも用意する必要がある。指定された明細を削除するメソッドは,Business.SlipコンポーネントにDeleteSlipDetailという名前で実装する(List 6-129)。DeleteSlipDetailメソッドは,List 6-127に示したDataObj.SlipDetailコンポーネントのSetDeletedメソッドを呼び出し,指定された明細情報を削除ずみにし,さらに伝票の小計,消費税,合計を再計算する。

prevpg.gif Chapter 6 60/92 nextpg.gif