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

head2.gif 6.6.6 請求書作成の取り消し
 最後に,作成した請求書を削除する処理を実装する。本来,作成した請求書は削除すべきではないが,誤って集計期間を間違えて請求書を作成してしまった場合などには,この機能が必要となる。

●請求書を削除する手順
 請求書を削除する場合には,単純に請求書情報テーブル内のレコードを削除すればよいというわけではない。なぜなら,請求書は伝票と結び付けられているからである。つまり,請求書を削除するのに先だって,あらかじめ請求書に結び付けられている伝票の状態を「請求書作成まえの状態(経理処理ずみと同義)」に戻す必要がある。

 請求書を削除するにあたっては,次のような一連の処理が必要となる。

1. 請求書に結び付けられている伝票の一覧を取得する
 まず,削除対象となる請求書に結び付けられている伝票の一覧を取得する。そのために,GetRecordsByBillIDというメソッドをDataObj.Slipコンポーネントに実装する(List 6-193)。GetRecordsByBillIDメソッドは,引数に指定した請求書番号を持つ請求書に結び付けられている――いい換えれば,BILLIDフィールドの値が引数に指定された請求書番号と合致する――伝票の一覧を,ADODB.Recordsetオブジェクトとして返す。このADODB.Recordsetオブジェクトが保持するフィールドの種類と順序は,List 6-170に示したGetRecordsメソッドと同じように合わせた(21行目)。
 ところで,指定された請求書番号に付随する伝票を参照する機能は,プレゼンテーション層からも使えると便利である。そのような機能を提供しておけば,ユーザーが請求書を選択したときに,それに付随する伝票の一覧を取得できるようになる。そこでBusiness.BillコンポーネントにGetBillSlipsというメソッドを実装しておく(List 6-194)。GetBillSlipsメソッドは,引数に請求書番号をとり,その請求書に付随する伝票の一覧を返す。内部的には,List 6-193で示したDataObj.SlipコンポーネントのGetRecordsByBillIDメソッドを呼び出しているだけなので,特に説明は必要ないだろう。
 なお,List 6-194GetBillSlipsメソッドではロールを判定していない。その代わりに,AccountingAccountingAdminAllAdminのいずれかのロールに属するユーザーしかこのメソッドを利用できないように,[コンポーネントサービス]管理ツールで制限する。
 
2. 伝票と請求書との結び付きを解除する
 1. で取得した伝票すべてについて,請求書との結び付きを解除する。伝票と請求書は,伝票のBILLIDフィールドで結び付けられている。結び付きを解除するには,BILLIDフィールドの値をNullに変更すればよい。そのためには,List 6-173で示したDataObj.SlipコンポーネントのSetBillIDメソッドを利用する。
 
3. 伝票を請求書作成まえに戻す
 1. で取得した伝票すべてを「請求書作成まえ(経理処理ずみ)」の状態に変更する。それには,List 6-147に示したDataObj.SlipコンポーネントのSet_MADEBILLFLAGメソッドを用いればよい。
 
4. 請求書を削除する
 伝票を削除したら,請求書を削除する。ただし,このサンプルでは請求書を削除するときにレコードそのものを削除するのではなく,1回目の削除ではDELETEDFLAGフィールドの値をTrueにし,削除ずみというマークを付けるだけとする。そして,2回目に削除しようとしたときに,請求書のレコードそのものを実際に削除するようにする。
 そこで,DataObj.BillコンポーネントにDELETEDFLAGフィールドを設定するためのSetDeletedFlagメソッド(List 6-195)と,請求書のレコードそのものを削除するDeleteRecordメソッド(List 6-196)を,それぞれ実装する。
●請求書を削除するためのビジネスロジックのメソッド
 以上でデータオブジェクトに必要なメソッドは実装したので,請求書を削除するためのメソッドをビジネスロジック側に実装する。ここでは,このメソッドをDeleteBillという名前でBusiness.Billコンポーネントに実装した(List 6-197)。

 DeleteBillメソッドは,引数に指定された請求書番号と合致する請求書を削除する機能を備える。27〜56行目にあるように,1回目に削除しようとしたときにはSetDeletedFlagメソッド(List 6-195)を呼び出して請求書を削除ずみにし,2回目に削除しようとしたときにはDeleteRecordメソッド(List 6-196)を呼び出してレコードそのものを削除するように実装してある。また,60行目にあるように,請求書がすでに送付ずみであったり入金確認ずみであったりした場合には,削除できないようにした。

 なお,List 6-197では,ロールによるセキュリティを判定していない。請求書を削除するという操作は責任の重い作業なので,経理部の管理者であるAccountingAdminロールか,すべての管理者であるAllAdminロールに属するユーザーにのみ利用許可を与えることにする。この設定は,[コンポーネントサービス]管理ツールで課すものとする。

 ところで,削除ずみとした請求書を復活させるメソッドも用意したいところである。しかし,いったん削除した請求書を復活させるのは,やや困難である。その理由は,一度請求書の状態を削除ずみにすると,請求書と伝票との結び付きが切れてしまうからである。結び付きが切れた状態で請求書を作成すると,その伝票は新たに作られた請求書のなかに含まれてしまうだろう。その状態のまま削除ずみとした請求書を復活させた場合には,伝票が別の請求書に含まれているにもかかわらず,請求書に記載されている小計額,消費税額,合計額は変わらずに復活することになる。よって,二重請求となる可能性が否定できない(Fig.6-103)。

 以上の理由から,削除ずみとした請求書を復活させるメソッドは用意しないことにする。


One Point! 今回は請求書を削除する処理において,請求書を丸々1枚削除する機能しか実装していない。しかし,実務においては,請求書全体を削除するのではなく,請求書を作ったのちに,特定の伝票だけ請求対象から外したいこともあるかもしれない。たとえば,取引先の都合などにより,ある伝票を翌月の請求に回したい場合などである。その場合には,請求書から指定した伝票を取り除くという機能が必要となる。実際にその処理をするのは難しくはない。具体的には,(1)取り除きたい伝票のBILLIDフィールドの値をNullに設定する,(2)取り除きたい伝票を請求書作成まえ(経理処理ずみ)の状態に戻す,(3)請求書に記載されている小計額,消費税額,合計額から,取り除きたい伝票に記載されている小計額,消費税額,合計額をそれぞれ減算する,という一連の処理を実行するようなメソッドを実装すればよい。その実装例をここで示してもよいのだが,そのような機能を実装した場合には,さらに特定の伝票を特定の請求書のなかに含める機能や,複数の請求書をまとめて1枚にする機能もほしくなる。再現のない機能拡張の欲求に応えていては先に進まないので,ここでは読者に対する宿題とさせていただき,本稿中での説明は割愛する。
Fig.6-103 削除ずみとした請求書を復活させるときの問題点
fig6_103

prevpg.gif Chapter 6 88/92 nextpg.gif