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



6.5.2 承認依頼処理
●いつまでに在庫が揃うのかを調べる
 以上で,承認依頼する処理は実装したわけだが,もう1つ考えておきたいことがある。それは,いつまでに在庫が揃うのかを計算する処理である。たとえば,プレゼンテーション層からList 6-151RequestConsentメソッドを呼び出して伝票の状態を「承認依頼中」にしようとしたとき,在庫が足りなくてプレゼンテーション層にエラーが戻ったとしよう。このときユーザーは,在庫が足りなかったために伝票を承認依頼にできないということがわかる。よって,納品予定日を変更し,再度承認依頼するということになるだろう。しかし,いつになれば在庫が揃うのかを判断するのは難しい。在庫が揃うまでの日を調べるには,在庫情報テーブルの一覧を参照して入庫予定を追ってゆくか,適当に先延ばしした日付を納入予定日とし,闇雲にトライし続けるしか手はない。

 そのため,より使いやすいアプリケーションにするためには,「この伝票の内容ならば,いつまでに製品が揃う」という予定を表示する機能を実装するとよい。

 さて,「この伝票の内容ならば,いつまでに揃う」ということを判定するためには,どのような処理が必要なのだろうか。この処理は,いい換えれば「伝票の明細に記載されているすべての製品が在庫不足にならない日付を調査する」ということである。もう少し詳しくいうと,次の処理をするということになる。

  1. 伝票の個々の明細について在庫が足りるようになる日付を算出する
     伝票の個々の明細を取り出し,それぞれの製品について在庫が足りるようになる日付を算出する。

  2. 1.の結果,最も未来の日時を結果とする
     1.の処理を各明細ごとに実行し,結果として得られた日付群のうち,最も未来の日付を伝票の納入予定日として受け入れられる最短の日付とみなす。

○伝票の個々の明細について在庫が足りる日付を算出する
 まずは,上記の1.の処理,すなわち,伝票の個々の明細について在庫が足りるようになる日付を算出する処理について考える。

 そこでまず,DataObj.Stockコンポーネントに次のようなGetReadyDateメソッドを実装する。


Public Function GetReadyDate(ByVal ProductID As Long, _
                             ByVal Number As Long) As Variant
    ' 指定された製品が指定された数量だけ今後入庫する最短の日付を返す
    ' もし,将来的にその数量だけ入庫する予定がなければNullを返す
    ' 【引数】
    '   ProductID = 調査する製品の製品番号
    '   Number = 数量
    ' 【戻り値】
    ' 指定された数量が揃う日付。
    ' 永遠にその数量だけ入庫する予定がなければNull
End Function

 GetReadyDateメソッドは,引数に製品番号と数量を渡すと,在庫情報テーブルに格納されている入庫予定のレコードを集計し,入庫数の合計が指定された数量を超える日付を返すというものである(ただし,その時点の在庫数は加算せず,将来的に追加される数量だけを対象とする)。このGetReadyDateメソッドは次のようにして実装することができる(Fig.6-86)。

(1)指定された製品の入庫予定を示すレコードを在庫情報テーブルから日付順に取得する
 指定された製品の入庫予定を示すレコードを,日付順の若いものから順に在庫情報テーブルから取得する。この処理は,次のSELECT文を実行することで実現できる。

SELECT * FROM 在庫情報
 WHERE NUMBER > 0 AND CONFIRMEDFLAG = 0 
       AND DELETEDFLAG = 0
       AND PRODUCTID = 製品番号
 ORDER BY DATE
(2)取得したレコードを先頭から集計する
 1.に示したSELECT文を実行することによって得たレコードセット(ADODB.Recordsetオブジェクト)のNUMBERフィールドの値を,先頭から末尾に向かって順番に加算してゆく。そして,その結果がGetReadyDateメソッドの引数に与えられた数量を超えたならば,その日付が指定された数量が揃う日付となる。もし,レコードセットの末尾まで達しても数量を超えなければ,その時点では数量を満たすだけの入庫予定はないという意味になる。プログラムで擬似的に書けば,次のようになる。

Dim NumberTotal As Long
Dim ReadyDate As Variant
NumberTotal = 0
ReadyDate = Null
Do While Not objRec.Eof 
    NumberTotal = NumberTotal + objRec.Fields("NUMBER").Value
    If NumberTotal >= 引数に指定された数量 Then
        ' 指定された数量が揃った
        ' このときの日付が,指定された数量が揃う日付となる
        ReadyDate = objRec.Fields("DATE").Value
        Exit Do
    End If
    objRec.MoveNext
Loop
If IsNull(ReadyDate) Then
    ' その時点のところ指定された数量だけ揃う予定はない
End If

 実際に,以上の(1)と(2)の処理をするようDataObj.StockコンポーネントにGetReadyDateメソッドとして実装したものが,List 6-152である。

Fig.6-86 いつ製品が揃うかを調べる
fig6_86

prevpg.gif Chapter 6 70/92 nextpg.gif