この特集のトップページへ
>
Chapter 6:ビジネスロジックの設計
6.4.4 伝票情報一覧の取得
●伝票情報一覧を返すデータオブジェクトのメソッド
では,DataObj.Slipコンポーネントに伝票一覧を返すメソッドを実装してゆこう。たとえば,GetRecordsという名前のメソッドとして実装する場合,上記の絞り込み条件を指定する引数を用意し,次のようなメソッドとして実装すればよい。
Public Function GetRecords( _ ByVal start_MADEDATE As Variant, _ ByVal end_MADEDATE As Variant, _ ByVal start_DELIVERDATE As Variant, _ ByVal end_DELIVERDATE As Variant, _ ByVal IncludeOtherMade As Boolean, _ ByVal filterSlip As FILTER_SLIP, _ ByVal IncludeDeleted As Boolean) As ADODB.Recordset ' 指定された条件に合致する伝票の一覧を返す ' 【引数】 ' start_MADEDATE ' 起票日による絞り込みの開始日(この日を含む)。 ' Nullのときには絞り込みなし。 ' end_MADEDATE ' 起票日による絞り込みの終了日(この日を含む)。 ' Nullのときには絞り込みなし。 ' start_DELIVERDATE ' 納入予定日による絞り込みの開始日(この日を含む)。 ' Nullのときには絞り込みなし。 ' end_DELIVERDATE ' 納入予定日による絞り込みの終了日(この日を含む)。 ' Nullのときには絞り込みなし。 ' IncludeOtherMade ' 他人が起票した伝票も含むかどうかのフラグ。 ' Trueのときには含み,Falseのときには含まない。 ' filterSlip ' 伝票の状態による絞り込み。FILTER_SLIP列挙型の組み合わせ ' FILTER_SLIP_ALLのときにはすべての伝票 ' IncludeDeleted ' 削除ずみを含むかどうかのフラグ。 ' Trueで含む。Falseで含まない
実際にこのメソッドを実装したものが,List 6-133である。List 6-133では,条件と合致する伝票レコードをADODB.Recordsetオブジェクトとして返すようにした。なお,List 6-133の39行目と46行目で使用しているErrorcode.MADEDATE定数は,List 6-93で示したErrorcode列挙型に対し,List 6-134のように追加しておく。
Table 6-14に示した伝票情報テーブルを参照するとわかるように,伝票情報テーブルの内容をそのまま戻したのでは,ユーザーに一覧表示するときにややわかりにくい。なぜなら,対象となる顧客の顧客名ではなく,顧客番号しか含まれていないためである。そこで,顧客情報テーブルと結び付けた結果を返し,顧客番号だけでなく顧客名も返すように実装する。また,伝票には伝票追加情報テーブル内のレコードが1つ付随する。このレコードには,納入予定日,顧客の担当者名,部署名などが格納されているわけだが,これも一覧に含めてしまったほうがよいだろう。そこで,DataObj.SlipコンポーネントのGetRecordsメソッド(List 6-133)では,伝票情報テーブル,製品情報テーブル,伝票追加情報テーブルの3つを合成し,Fig.6-81に示す結果を返すようにしている。そのため,実行すべきSELECT文は,かなり長いものになっている(33行目)。
Fig.6-81 伝票の一覧を伝票情報テーブル,製品情報テーブル,伝票追加情報テーブルを合成して表現する
ところで,List 6-133の35〜128行目は,WHERE句によって絞り込む条件を指定している部分である。このうち,75〜128行目にある伝票の状態による絞り込み部分は,やや複雑な処理をしている。この部分について補足しておこう。
まず,伝票の状態についてまとめておく。伝票の状態は,List 6-105に示したSlipStatus列挙型によって示される。そして,伝票の状態は伝票情報テーブルのMADEBILLFLAG,REQ_CONSENTFLAG,CONSENTEDFLAG,REJECTEDFLAG,SENDFLAG,ACCOUNTINGFLAGという6つのフィールドの値で決定される。これらの関係を表にすると,Table 6-17のようになる。
Table 6-17 伝票の状態と伝票のレコードのフィールド値との関係
SlipStatus列挙型 | MADEBILLFLAG | REQ_CONSENTFLAG | CONSENTEDFLAG |
---|---|---|---|
Creating | 0 | 0 | 0 |
Rejected | - | - | - |
RequestingConsent | - | 1 | - |
Consented | - | - | 1 |
Send | - | - | - |
Finish | 1 | - | - |
SlipStatus列挙型 | REJECTEDFLAG | SENDFLAG | ACCOUNTINGFLAG |
---|---|---|---|
Creating | 0 | 0 | 0 |
Rejected | 1 | - | - |
RequestingConsent | - | - | - |
Consented | - | - | - |
Send | - | 1 | - |
Finish | - | - | - |
ここでは例として,List 6-133のGetRecordsメソッドのfilterSlip引数に“FILTER_SLIP_CONSENTED Or FILTER_SLIP_SEND”と指定されたときにどのような動作をするのかを見ていこう。この値は,承認ずみまたは発送ずみの伝票に絞り込むという指定である。
まず,76行目のIf文によって,filterSlip引数がFILTER_SLIP_ALLかどうかを調べる。このとき,FILTER_SLIP_ALLではないため,77行目の処理に進む。77行目では,strQuery変数に“ AND (”という文字列を加える。strQuery引数には,すでに“SELECT 〜 FROM 〜 WHERE 〜”というSELECT文が格納されているので,結果としてstrQuery変数の値は“SELECT 〜 FROM WHERE 〜 AND (”となる。
次に,79行目からのIf文の羅列に進むことになる。filterSlip引数にFILTER_SLIP_CONSENTED Or FILTER_SLIP_SENDが指定されていた場合には,100行目にある“If filterSlip And FILTERSLIP_CONSENTED Then”という条件式を満たすため,101行目の処理に入る。この結果,103行目において,strQuery変数には“伝票情報.CONSENTEDFLAG=1”という文字列が付与される。したがって,strQuery変数は,“SELECT 〜 FROM 〜 WHERE 〜 AND (伝票情報.CONSENTEDFLAG=1”となる。また,104行目ではOrStr変数に“ Or ”という文字列を代入している。
次に条件を満たすのは,107行目にある“If filterSlip And FILTER_SLIP_SEND”の部分である。この条件によって,108行目の処理に入る。109行目でstrQuery変数にOrStr変数の内容を付与し,さらに110行目で“伝票情報.SENDFLAG=1”という文字列を付与している。この結果,strQuery変数の値は“SELECT 〜 FROM 〜 WHERE 〜 AND (伝票情報.CONSENTEDFLAG=1 Or 伝票情報.SENDFLAG=1”となる。
そのあとのIf文の条件式は満たさず,127行目の処理により,最後にstrQuery変数に“)”が付与される。その結果,最終的なstrQuery変数の値は“SELECT 〜 FROM 〜 WHERE 〜 AND (伝票情報.CONSENTEDFLAG=1 Or 伝票情報.SENDFLAG=1)”となる。Table 6-17と比較してもわかるように,この式は承認ずみまたは発送ずみという条件を示す式である。この式が136行目で実行され,結果のレコードが戻り値として返される。
76〜128行目の部分は,ANDを使った論理式を使っているため,少々わかりにくくなってしまった。しかし,組み合わせたいくつかの値を判定するためにAND演算を使うのは常套手段である。もちろん,論理式を使わなくても,逐一値を直接比較することで判定することも不可能ではない。だが,プログラムが冗長になりがちである。論理式はさまざまな場面で登場する便利な演算式であるため,もし論理式に詳しくない場合には,これを機会にきちんと学んでおくことをお勧めする。
Chapter 6 63/92 |