この特集のトップページへ
>
Chapter 6:ビジネスロジックの設計
6.5.2 承認依頼処理
●いつまでに在庫が揃うのかを調べる
では次に,伝票を受け付けられる最短の納入予定日を返すメソッドを実装する。この処理は,先にも説明したように,伝票に付随している明細のすべての製品が揃う日付を返せばよい。もちろん,その時点で存在する在庫で明細中のすべての製品をまかなえるならば,即日の注文が可能ということになる。その場合には,メソッドが呼び出された日付を返すことにする。その時点で存在する在庫でまかなえるかどうかを調べるには,個々の明細についてList 6-148で示したGetNowStockメソッドを使えばよい。
さて,在庫が足りないときには,いつ在庫が揃うのかを調べるために,個々の明細についてList 6-152に示したGetReadyDateメソッドを呼び出し,在庫の不足分(これは伝票の明細に示されている数量からGetNowStockメソッドを呼び出して得た,その時点で利用できる在庫数を減算した値である)が補充される日付を調べることになる。
以上のような処理を擬似的に書くと,次のようになるだろう。
Dim objDataStock As DataObj.Stock
Dim objDataProduct As DataObj.Product
Dim objDataSlipDetail As DataObj.SlipDetail
Dim objRec As ADODB.Recordset
Dim ReadyDate As Variant, tmpDate As Variant
Dim ProductID As Long, Number As Long
Dim NowStock As Long
Set objDataStock = CreateObject("DataObj.Stock")
Set objDataProduct = CreateObject("DataObj.Product")
Set objDataSlipDetail = CreateObject("DataObj.SlipDetail")
' 指定した伝票に付随する明細のレコードを取得
Set objRec = objDataSlipDetail.GetRecords(伝票番号)
ReadyDate = Date()
Do While Not objRec.EOF
ProductID = objRec.Fields("PRODUCTID").Value
Number = objRec.Fields("NUMBER").Value
NowStock = objDataProduct.GetNowStock(ProductID)
If NowStock < Number Then
' その時点の在庫では足りない
' いつまでならば揃うのか
tmpDate = objDataStock.GetReadyDate(ProductID, Number - NowStock)
If IsNull(tmpDate) Then
' 永遠に在庫が揃うことはない
ReadyDate = Null
Exit Do
End If
If ReadyDate < tmpDate Then
ReadyDate = tmpDate
End If
End If
objRec.MoveNext
Loop
' ここでReadyDate変数に納入予定日として受け付けられる
' 最短の日付が格納されている
この処理はほぼ正しいが,1つの伝票に対して複数の同じ製品を対象とする明細が付随していた場合には,Fig.6-87に示すように判定を誤ることがある。
Fig.6-87 1つの伝票に複数の同じ製品を対象とする明細が付随している場合

Fig.6-87のように判定を誤ることを防ぐためには,明細のうち同じ製品はひとまとめにして扱わねばならない。そこでまず,DataObj.SlipDetailコンポーネントにList 6-153に示すGetRecords_GroupProductというメソッドを実装する。
DataObj.SlipDetailコンポーネントのGetRecords_GroupProductメソッドは,List 6-130に示したGetRecordsメソッドと同じく,引数に指定された伝票に付随する明細情報を返す。GetRecordsメソッドと違う点は,(1)削除ずみのものは含まない,(2)同じ製品を指すものはその数量が合計され1つにまとめられる,という点である(24行目のSELETC文)。そのため,先に示したプログラムにおいてGetRecordsメソッドの代わりにGetRecords_GroupProductメソッドを使えばFig.6-87のような判定を誤ることがなくなる。
実際に,指定された伝票の納品予定日として受け付け可能な最短の日付を返すメソッドを,Business.SlipコンポーネントにGetReadyDate_Slipという名前で実装したものがList 6-154である。GetReadyDate_Slipメソッドは,引数に伝票番号をとる。そして,GetRecords_GroupProductメソッド(List 6-153)を使って明細を製品ごとに集計した明細レコードを取り出し,その明細ごとにGetReadyDateメソッド(List 6-152)を呼び出す。その結果,伝票に含まれる明細のうち最も遅く製品が揃う日付を戻り値として返す。
○個々の在庫を問い合わせるところで,いつまでに製品が揃うのかを調べたいのは,何も伝票を承認依頼するときだけではない。顧客から「この製品はいつまでに納品できますか」といった問い合わせに答えるために,伝票だけでなく個々の製品が指定された数だけ入庫する日付を取得する機能が必要となる。そこで,Business.ProductコンポーネントにList 6-155に示すGetReadyDate_Productメソッドを実装しておく。
Business.ProductコンポーネントのGetReadyDate_Productメソッドは,引数に製品番号と数量をとり,指定された製品が揃う日付を返すというものである。List 6-155を見るとわかるように,DataObj.ProductコンポーネントのGetNowStockメソッド(List 6-148)とDataObj.StockコンポーネントのGetReadyDateメソッド(List 6-152)を使って,指定された数量が揃う日付を求める処理を実現している。
| Chapter 6 71/92 |
