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

6.3.5 在庫の処理
●入庫予定の施行

○ビジネスロジックの構築
 では,List 6-72List 6-73List 6-75List 6-76で実装したデータオブジェクトの各メソッドを組み合わせて,施行ずみにするビジネスロジックのメソッドを実装してゆく。

 施行ずみにするには,次に示す一連の処理を実行すればよい。

  1. List 6-73に示したIsDueメソッドを呼び出してまだ施行ずみでないことを確認する
  2. List 6-72SetConfirmedFlagメソッドを呼び出し,在庫情報テーブル内の入庫を示すレコードを施行ずみにする
  3. List 6-75に示したGetRecordメソッドで在庫に追加される製品の製品番号と数量を取得する
  4. List 6-76で示したAddStockメソッドに,取得した製品番号と数量を引数として渡し,在庫数を増やす

 そのようなプログラムをBusiness.ProductコンポーネントにSetDueメソッドとして実装したものが,List 6-77である。

 SetDueメソッド内では,ロールによるセキュリティの判定をしていない。施行ずみに設定できるユーザーを製品管理部に属するユーザーに限定するためには,メソッドの呼び出しを,Productsロール,ProductsAdminロール,AllAdminロールに制限する必要がある。この制限は,プログラム側ではなく,[コンポーネントサービス]管理ツールで設定するものとする。

 さて,本来ならば,施行ずみとした入庫予定を施行まえに戻すという処理は,在庫数が合わなくなるおそれがあるために実装したくないところである。しかし,誤操作などによって,施行ずみにしたものを取り消したいこともある。そこで,施行ずみにしたものを戻すメソッドも実装しておく。

 施行ずみにしたものを戻すためには,施行ずみにしたのとは逆の手順を踏めばよい。つまり,次のような一連の操作を実施する(ただし,これらの一連の処理はトランザクションとして扱うことになるので,その実行順序を問うわけではない。SetDueメソッドの処理を正確に逆順にたどって実行しなければならないという意味ではない)。

  1. List 6-75GetRecordメソッドを呼び出して,入庫予定レコードの該当製品の製品番号と入庫数量を取得する
  2. 1.で取得した数量を負にしたものをList 6-76AddStockメソッドに渡し,在庫数を減らす
  3. List 6-72SetComfirmedFlagメソッドの第2引数にFalseを渡し,施行まえの状態に戻す

 以上の処理をCancelDueメソッドとして実装したものが,List 6-78である。

 なお,このサンプルでは,CancelDueメソッドを呼び出すユーザーを,ProductsAdminロールまたはAllAdminロールに属するユーザーのみに制限する。この制限は,プログラム側に実装するのではなく,[コンポーネントサービス]管理ツールで運用者に設定させる。

 List 6-78CancelDueメソッドの呼び出しは,若干の注意を要する。CancelDueメソッド内の処理では,一度在庫数として加えたものを減らすわけだから,この処理によって一時的に在庫数が負になることがあり得る。たとえば,入庫予定の施行を施行まえの状態に戻すよりもまえに,出庫レコードが処理されて在庫が減らされた場合がそれに相当する。しかし,そのような事態が発生しても,製品情報テーブルのSTOCKフィールドの値が負にならないように,「3.4.4 制約の設定」で制約を設けている。そのため,ADOコンポーネントによる実行時エラーが発生する。よって,入庫予定を施行まえの状態に戻したとしても,失敗して在庫数が合わなくなるなどの大事に至ることはない。そもそも,普通は出庫時にモノがないために在庫不足に気づくはずであり,この問題が顕著に表面化することはないと思われる。しかし,より完成度が高いアプリケーションを構築する場合には,在庫が負になるような取り消しがあった段階で,出庫レコードを順にたどって出庫レコードを先に削除し,出庫された分だけ在庫を取り戻す(STOCKフィールドの値を増やす)といった処理が必要となるケースもあるだろう。

prevpg.gif Chapter 6 45/92 nextpg.gif