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

6.5.2 承認依頼処理
●在庫の確認
 さて,次に在庫の確認について考える。在庫の確認処理については,すでに「3.2.6 在庫の処理」で説明したが,ここで簡単にまとめておく。

 このサンプルでは,在庫を確認するために製品情報テーブルと在庫情報テーブルという2つのテーブルを使う。

製品情報テーブル
 製品情報テーブルのSTOCKフィールドにはその時点の在庫数が,BACKORDERフィールドには在庫のうちすでにほかの伝票で予約されている(発送待ちである)数が,それぞれ格納されている。よって,その時点で利用できる在庫数の実数は,「STOCKフィールドに格納されている値−BACKORDERフィールドに格納されている値」である(「3.2.6 在庫の管理」を参照)。
 
在庫情報テーブル
 在庫情報テーブルには,入庫予定と出庫予定のレコードが格納される(「6.3.5 在庫の処理」を参照)。レコードが入庫予定のときにはSlipIDフィールドの値がNullに設定されかつNUMBERフィールドには入庫する製品の数量が格納され,出庫予定のときにはSlipIDフィールドにその出庫予定のもととなった伝票の伝票番号が設定されかつNUMBERフィールドには出庫数を負にした数が格納される。よって,入庫予定と出庫予定のどちらであるのかは,(1)SlipIDフィールドの値がNullであるかどうか,または,(2)NUMBERフィールドの値が負であるかどうか,のいずれかで判定することができる。また,これらの入出庫レコードのうち,施行されたものについてはCONFIRMEDFLAGフィールドの値がTrue(値としては1)に設定され,未施行のものについてはCONFIRMEDFLAGフィールドの値がFalse(値としては0)に設定される(「●入庫予定の施行」を参照)。そして,PRODUCTIDフィールドには入出庫の対象となる製品の製品番号が格納される。

 よって,入庫予定を示すレコードのうち,CONFIRMEDFLAGフィールドの値がFalseである製品の数量の総和を求めることによって,「その時点ではまだ未入庫だが,後日入庫して在庫として利用できる」という製品の数量を調べることができる(出庫予定はすでに製品情報テーブルのBACKORDERフィールドの値に計上されているので,除外する)。

 一方,伝票レコードに付随している伝票追加情報レコードのDELIVERDATEフィールドには,納入予定日が格納されている。伝票に付随する明細に記載されている特定の製品がその納入予定日までに発送可能かどうかは,次のいずれかの条件を満たすときである。

  1. 現在利用できるの在庫数が出庫量を上回る
     製品情報テーブル内の該当製品を示すレコードの「STOCKフィールドに格納されている値−BACKORDERフィールドに格納されている値」が伝票の明細に記載されている数量よりも多ければ,出庫することができる。

  2. 納入予定日までに入庫があり出庫量を上回る
     1.を満たさなくても,「次のSQL文を実行して得られたSUM(NUMBER)+1.の総和」が,伝票明細に記載されている数量よりも多ければ,出庫することができる。

SELECT SUM(NUMBER) FROM 在庫情報
  WHERE CONFIRMEDFLAG = 0 AND NUMBER > 0
        AND PRODUCTID=製品番号 AND DATE <= 納入予定日
        AND DELETEDFLAG = 0

One Point! 上記のSQL文において,「DATE <= 納入予定日」の比較に時間を含む場合には注意する。たとえば,納入予定日が「2000年5月8日」だとしよう。このとき,式は「DATE<='2000-05-08'」となる。ところが,この式は時間拡張されるため,「2000年5月8日午前0時0分0秒」という意味になる。よって,この式では,入庫レコードのうちDATEフィールドが「2000年5月8日午前9時00分」とか「2000年5月8日午後1時00分」といったレコードは集計の対象とならない。入庫レコードのDATEフィールドと伝票の納入予定日(伝票追加情報テーブル内のDELIVERDATEフィールド)がともに日付のみしか扱わず,時間を扱わないのであればかまわないが,そうではなく時間も扱うのであれば,日付を記載しただけではその日の午前0時0分0秒を指すという点には十分注意してほしい。場合によっては,(1)1日追加した値を使い,「<=」演算子の代わりに「<」演算子を使う(「DATE <= '2000-05-08'」の代わりに「DATE < '2000-05-09'」とする),(2)強制的に「23:59:59」を付与する(「DATE <='2000-05-08'」の代わりに「DATE <= '2000-05-08 23:59:59'」,といった処理が必要になることもある。

 この2つの条件を調べるためのメソッドを実装してゆく。

○その時点で利用できる在庫数を確認するためのメソッド
 まずは,その時点の在庫数を確認するメソッドを実装することにしよう。すでに「6.3.2 製品情報の編集」で実装したDataObj.ProductコンポーネントのGetRecordメソッド(List 6-56)を使うことで,STOCKフィールドの値とBACKORDERフィールドの値を取得することができるため,あえてこのメソッドを実装する必要はない。GetRecordメソッドを呼び出して取得したSTOCKフィールドの値から,BACKORDERフィールドの値を減算したものが,その時点で利用できる在庫数となる。

 とはいえ,GetRecordメソッド(List 6-56)の引数に指定できるものは,STOCKフィールドとBACKORDERフィールドだけではない。製品名(PRODUCTNAME)や製品名のよみがな(YOMIGANA),製品価格(PRICE),摘要(MEMO),作成者や更新者のアカウント名(MADEUSERLASTUSER),作成日や更新日(MADEDATELASTDATE)といった付随した情報も多く,このメソッドは少々扱いづらい。

 そこで,List 6-148に示すGetNowStockというメソッドをDataObj.Productコンポーネントに実装しておく。List 6-148を見るとわかるように,このメソッドは引数に製品番号をとり,内部でList 6-56に示したGetRecordメソッドを呼び出し,その製品番号を持つ製品の情報を取得,STOCKフィールドの値からBACKORDERフィールドの値を減算したものを戻り値として返す。

 このGetNowStockメソッドを呼び出すことで,その時点で利用できる在庫数を調べることができる。つまり,伝票の明細に示されている数量よりもGetNowStockメソッドを呼び出したときの戻り値のほうが等しいか大きければ,その伝票を受け付けられると判断できる。

○指定された日付までにいくつの入庫されるかを計算するメソッド
 次に,指定された日付までにいくつ入庫されるかを計算するメソッドを実装する。そのためには,先にも示したように,次のようなSELECT文を実行した結果を得られればよいということになる。

SELECT SUM(NUMBER) FROM 在庫情報
  WHERE CONFIRMEDFLAG = 0 AND NUMBER > 0
        AND PRODUCTID=製品番号 AND DATE <= 納入予定日 
        AND DELETEDFLAG = 0

 実際にDataObj.StockコンポーネントにGetWillStockという名前のメソッドとして実装したものが,List 6-149である。List 6-149では,引数に製品番号と日付をとり,在庫情報テーブル中の未施行である入庫予定を示すレコードのうち指定された日付よりも等しいか小さいものの入庫数を集計し,その結果を戻り値として返す。これにより,「List 6-148に示したGetNowStockメソッドの戻り値(現在利用できる在庫数)+List 6-149に示したGetWillStockメソッドの戻り値(将来的に指定された日時までに入庫する予定数)」が伝票の明細に示されている数量よりも等しいか大きければ,その伝票を受け付けられると判断できる。

prevpg.gif Chapter 6 68/92 nextpg.gif