この特集のトップページへ
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 伝票の一覧を伝票情報テーブル,製品情報テーブル,伝票追加情報テーブルを合成して表現する
fig6_81

 ところで,List 6-133の35〜128行目は,WHERE句によって絞り込む条件を指定している部分である。このうち,75〜128行目にある伝票の状態による絞り込み部分は,やや複雑な処理をしている。この部分について補足しておこう。

 まず,伝票の状態についてまとめておく。伝票の状態は,List 6-105に示したSlipStatus列挙型によって示される。そして,伝票の状態は伝票情報テーブルのMADEBILLFLAGREQ_CONSENTFLAGCONSENTEDFLAGREJECTEDFLAGSENDFLAGACCOUNTINGFLAGという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-133GetRecordsメソッドの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演算を使うのは常套手段である。もちろん,論理式を使わなくても,逐一値を直接比較することで判定することも不可能ではない。だが,プログラムが冗長になりがちである。論理式はさまざまな場面で登場する便利な演算式であるため,もし論理式に詳しくない場合には,これを機会にきちんと学んでおくことをお勧めする。

prevpg.gif Chapter 6 63/92 nextpg.gif