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

head2.gif 6.3.2 製品情報の編集
 次に,製品情報の編集処理を実装してゆく。この処理内容は,顧客情報を編集する場合と基本的に変わらない。「6.2.2 顧客情報の編集」でも説明したように,顧客情報を編集する方法には,(1)各フィールドごとにそれぞれ変更するメソッドを用意する方法,(2)レコード全体を変更するメソッドを用意する方法,という2つがある。顧客情報の編集では(2)の方法をとったので,同じ理由で製品情報の編集でも(2)の方法を採用する。

●データオブジェクトの実装
 さっそく,データオブジェクトであるDataObj.Productコンポーネントに,製品情報を編集するためのメソッドを追加する。

 まずは,既存の情報を取得するGetRecordというメソッドを実装する。GetRecordメソッドは,情報を取得したい製品の製品番号(製品情報テーブルのIDフィールドの値)を第1引数に渡すと,該当する製品の「製品名」「製品名よみがな」「価格」「在庫数」「摘要」「製品の予約数」「作成者のアカウント名」「作成日時」「最終更新者のアカウント名」「最終更新日時」が第2引数以降で指定された変数に格納されて戻るというものである。

 GetRecordメソッドの処理内容は,すでにList 6-16で作ったDataObj.CustomerコンポーネントのGetRecordメソッドの処理内容とほとんど同じである。その実装は,List 6-56のようになる。

 次に,製品情報を更新するUpdateRecordメソッドを実装する。UpdateRecordメソッドでは,更新したい製品の製品番号(製品情報テーブルのIDフィールドの値)を第1引数に,その製品の「製品名」「製品名よみがな」「製品価格」「摘要」を順に第2引数以降で渡す。すると,第1引数で指定された製品の情報が,第2引数以降で指定された値で変更される。このようなプログラムは,List 6-57のようになる。。

 製品の情報としては,「製品名」「製品名よみがな」「製品価格」「摘要」以外にも,「在庫数」と「在庫の予約数」が存在する。しかし,この2つの情報は,UpdateRecordメソッドからは変更させないことにする。なぜなら,もしこのメソッドからこれらの情報を直接変更できるようにしてしまうと,伝票による出庫数と製品の在庫数に不整合が生じるような値を設定されてしまうおそれがあるからである。在庫と在庫の予約数については,「6.3.5 在庫の処理」で別途説明する。

 なお,List 6-57の44〜61行目を見るとわかるように,情報が更新されたフィールドについては,DataObj.Historyコンポーネントを実体化してAddHistoryメソッドを呼び出し,更新前後の情報をそれぞれ履歴テーブルに加えている。この処理については,「○履歴の処理」で説明ずみである。

 以上で,既存の製品情報を取得する処理と更新する処理は実装できた。それに加えて,ある製品番号を備えた製品が製品情報テーブル中に存在するかどうかを調べるIsDeletedというメソッドも実装しておく。このメソッドは,顧客管理処理で作成したDataObj.CustomerコンポーネントのIsDeletedメソッド(List 6-23)と似たものであり,引数に指定した製品番号に相当する製品が「存在するか」「削除されているか」「存在しないか」という状態を返す。状態は,指定された製品番号をIDフィールドの値とするレコードが製品情報テーブル中に存在するかどうか,およびDELETEDFLAGフィールドの値がTrueであるかFalseであるかによって判定する。プログラムは,List 6-58のようになる。

●ビジネスロジックの実装
 データオブジェクトの実装が一通り終わったところで,ビジネスロジックを実装してゆく。ビジネスロジックには,(1)指定された製品番号を持つ製品情報を返すGetProductメソッド,(2)指定された製品番号を持つ製品情報を更新するUpdateProductメソッド,の2つを実装する。

 まず,GetProductメソッドである。これは単に,先に作成したDataObj.ProductコンポーネントのGetRecordメソッド(List 6-56)を呼び出すだけである。その実装は,List 6-59のようになる。

 List 6-59の29〜41行目では,あらかじめDataObj.ProductコンポーネントのIsDeletedメソッド(List 6-58)を呼び出して,その製品情報が削除ずみでないことを確認している。もし削除ずみであった場合には,ObjectContextオブジェクトのIsCallerInRoleメソッドを呼び出して,呼び出したユーザーが属するロールを調べる。そして,ProductsAdminロールまたはAllAdminロールに属していない場合にはエラー扱いとし,削除ずみの製品情報を参照できないようにしている。

 次に,UpdateProductメソッドを実装する。UpdateProductメソッドは,すでに作成したDataObj.ProductコンポーネントのUpdateRecordメソッド(List 6-57)を呼び出すというものである。そのようなプログラムは,List 6-60のようになる。

 List 6-60に示したUpdateProductメソッドでは,DataObj.ProductコンポーネントのIsDeletedList 6-58)メソッドを事前に呼び出して削除ずみでないことを確認し,もし削除ずみであったら更新できないようにしている。

prevpg.gif Chapter 6 38/92 nextpg.gif