この特集のトップページへ
>
Chapter 6:ビジネスロジックの設計
6.6.4 請求書の参照
●請求書に付随する明細を取得する
さて,請求書は,単に請求書情報テーブルの情報だけを取得できればよいというわけではない。請求書情報テーブルには,合算額しか記載されないわけだが,請求書を参照したり印刷したりする際には,明細も必要になってくる。そこで,請求書番号が指定されたときに,その請求書に付随する明細情報を返すメソッドを実装しておく必要がある。
本節の冒頭でも説明したが,請求書情報テーブルと伝票情報テーブルは伝票情報テーブルのBILLIDフィールドの値で結び付けられており,さらに伝票情報テーブルは明細情報テーブルと明細情報テーブルのSLIPIDフィールドの値で結び付けられている(Fig.6-102)。
Fig.6-102 請求書情報テーブル,伝票情報テーブル,明細情報テーブルの結び付き

Fig.6-102を参照するとわかるように,次のSELECT文を実行することによって,請求書に付随する明細情報テーブルの全レコードを取得することができる。
SELECT 明細情報.* FROM 伝票情報, 明細情報
WHERE 伝票情報.BILLID = 請求書番号
AND 伝票情報.ID = 明細情報.SLIPID
AND DELETEDFLAG=0
実際にDataObj.SlipDetailメソッドにGetRecordsByBillIDという名前のメソッドとして実装したものがList 6-181である。List 6-181のGetRecordsByBillIDメソッドは引数に指定された請求書番号の請求書に結び付けられている明細情報テーブルのレコードをADODB.Recordsetオブジェクトとして返す。ただし,List 6-181の19行目にあるSELECT文を参照するとわかるように,返す形式は上述したSELECT文に示したフィールド順ではなく,List 6-130で実装したDataObj.SlipDetailコンポーネントのGetRecordsメソッドが返すADODB.Recordsetオブジェクトのフィールド順序と合わせ,製品名なども一緒に返すようにしてある(「●明細の一覧取得」を参照)。
次にBusiness.Billコンポーネントに,指定された請求書に付随する明細情報を返すメソッドを実装する。ここでは,このメソッドをGetBillDetailsという名前で実装した(List 6-182)。GetBillDetailsメソッドは,先に実装したList 6-181のGetRecordsByBillIDメソッドの呼び出しを中継するだけである。
なお,GetBillDetailsメソッドはプログラム内でセキュリティを調査していない。セキュリティの設定は,Accountingロール,AccountingAdminロール,AllAdminロールに属するユーザーしかこのメソッドを実行できないように[コンポーネントサービス]管理ツールで設定するものとする。これにより,経理部に属するユーザーまたは管理者以外はこのメソッドを利用できないようになる。
●請求書の一覧取得ところで,請求書の処理としては,1枚ごとに請求書の情報を返すだけでなく,一覧としてユーザーに表示する機能も必要である。そこで,請求書の一覧を返すメソッドを実装する。
請求書も伝票と同様に,そのすべてを返していたのでは,使い続ければ使い続けるほど膨大なデータ量となってしまう。検索性能を低下させないためにも,絞り込みの機能が必要となるだろう。
請求書を絞り込む場合には,次のような絞り込み条件が考えられる。
- 顧客による絞り込み
- 請求書の対象となる顧客に対して絞り込みをかける。具体的には,請求書情報テーブルのCUSTOMERIDフィールドの値が特定の顧客番号である請求書のみに絞り込む。
- 請求書の状態による絞り込み
- 請求書の状態によって絞り込む。請求書の状態には,「請求書作成ずみ」「請求書発送ずみ」「入金ずみ」そして「削除ずみ」の4つの状態がある。これらの状態によって絞り込みをする。
- 請求書の作成日時による絞り込み
- 請求書が作成された日時によって絞り込む。具体的には請求書情報テーブルのMADEDATEフィールドの値が特定の期間内であるかどうかによって絞り込む。
- 入金確認日による絞り込み
- 請求書の入金確認日によって絞り込む。具体的には請求書情報テーブルのSUBMITDATEフィールドの値が特定の期間内であるかどうかによって絞り込む。
これら以外にも,特定の金額以上の請求書だけに絞り込むような機能も考えられるが,今回は割愛する。
さて,上記の絞り込みを実現するために,次のような形のGetRecordsメソッドをDataObj.Billコンポーネントに実装する。
Public Function GetRecords(ByVal CustomerID As Variant, _
ByVal Status As FILTER_BILL, _
ByVal start_MADEDATE As Variant, _
ByVal end_MADEDATE As Variant, _
ByVal start_SUBMITDATE As Variant, _
ByVal end_SUBMITDATE As Variant) _
As ADODB.Recordset
' 指定された条件に合致する請求書の一覧を返す
' 【引数】
' CustomerID
' 顧客による絞り込みをするときの顧客番号。
' Nullが指定されたときには顧客による絞り込みなし。
' Status
' 請求書の情報による絞り込み。FILTER_BILL列挙型の組み合わせ。
' FILTER_BILL_ALLのときにはすべての請求書。
' start_MADEDATE
' 請求書作成日による絞り込みの開始日(この日を含む)。
' Nullのときには絞り込みなし。
' end_MADEDATE
' 請求書作成日による絞り込みの終了日(この日を含む)。
' Nullのときには絞り込みなし。
' start_SUBMITDATE
' 入金確認日による絞り込みの開始日(この日を含む)。
' Nullのときには絞り込みなし。
' end_SUBMITDATE
' 入金管理日による絞り込みの終了日(この日を含む)。
' Nullのときには絞り込みなし。
第2引数に指定するFILTER_BILL列挙型は,List 6-183に示すようにDataObj.Billコンポーネント内に記述する。請求書の状態による絞り込みは,List 6-183で示したFILTER_BILL列挙型の組み合わせ(和)により,第2引数に指定する。たとえば,「入金確認ずみ」かつ「削除ずみ」の請求書を指定する場合には,“FILTER_BILL_PAID Or FILTER_BILL_DELETED”を指定する。また,すべての請求書を含みたいのであれば,“FILTER_BILL_ALL”を指定する。
実際に,上述したGetRecordsメソッドをDataObj.Billコンポーネントに実装したものが,List 6-184である。List 6-184の処理は,List 6-133(修正してList 6-170になった)に示したDataObj.SlipコンポーネントのGetRecordsメソッドと酷似している。処理内容の詳細は「6.4.4 伝票情報一覧の取得」を参照してほしい。なお,List 6-184の67行目と74行目にあるErrorcode.Err_SUBMITDATEは,Errorcode列挙型(List 6-134)にList 6-185のように加えるものとする。
次に,このDataObj.BillコンポーネントのGetRecordsメソッド(List 6-184)をプレゼンテーション層から利用できるようにするため,ビジネスロジックであるBusiness.BillコンポーネントにGetBillsというメソッドを追加する(List 6-186)。List 6-186は,内部でList 6-184に示したDataObj.BillコンポーネントのGetRecordsメソッドを呼び出し,条件に合致する請求書の一覧をADODB.Recordsetオブジェクトとして返す。
なお,List 6-186では,41〜48行目において,呼び出したユーザーがAccountingロールに属さない場合にはエラー扱いに,AccountingAdminロールまたはAllAdminロールに属さない場合には強制的に削除ずみのレコードを省くように,処理をしている。
| Chapter 6 86/92 |
