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



6.4.2 伝票情報の編集
●伝票追加情報テーブルの編集ならびに取得
 では次に,伝票追加情報テーブルを編集したり,このテーブルから情報を取得したりするメソッドを作ってゆく。

○伝票追加情報テーブルの更新
 まず,伝票追加情報テーブルのレコードを更新するメソッドから実装する。伝票追加情報テーブルは,Table 6-15に示したように,顧客の部署名,顧客の担当者名,納入予定日,発送先の住所や電話番号を記録するものである。このテーブルのなかでユーザーが直接書き換えることができないフィールドは,IDSLIPIDMADEDATEMADEUSERLASTDATELASTUSERDELETEDFLAGという7つである。

 しかし,「3.2.7 セキュリティと履歴」でも説明したように,伝票追加情報テーブルのレコードを更新するときには,それを上書きするのではなく,既存のレコードを削除ずみとして扱い,新しいレコードを追加して,それと伝票とを結び付ける。こうしておけば,伝票がどのように変更されたのかを履歴として正確に残すことができる(Fig.6-77)。

Fig.6-77 伝票追加情報テーブルのレコードの更新
fig6_77

 Fig.6-77のような処理を実装するには,(1)特定のレコードを削除ずみにするメソッド,(2)新しいレコードを追加するメソッド,という2つのメソッドを実装すればよい。このうち(2)のメソッドは,すでにList 6-92に示したとおり,DataObj.SlipInformationコンポーネントにAddRecordメソッドとして実装した。そのため,ここでは(1)のメソッドだけを実装すればよい。(1)のメソッドは,DataObj.SlipInformationコンポーネントにSetDeletedという名前で実装する(List 6-107)。SetDeletedメソッドの働きは,引数として受け取ったレコードID(IDフィールドの値)と一致するレコードを探し,そのレコードのDELETEDFLAGフィールドの値をTrueにするというものである。

○伝票追加情報テーブルの取得
 次に,伝票追加情報テーブル中から指定したレコードの情報を返すメソッドを実装する。このメソッドを,DataObj.SlipInformationコンポーネントにGetRecordという名前で実装すると,List 6-108のようになる。

 List 6-108では,レコードを特定するときに,伝票追加情報テーブルのIDフィールドと合致するものを探すのではなく,SLIPIDフィールド,すなわち指定された伝票番号と合致するものを探すように実装している点に注目してほしい。このように実装した理由は,外部からどの伝票にどの伝票追加情報が付随しているのかをあまり意識しないですむようにしたかったことにある。

 伝票追加情報テーブル中のレコードは,必ずいずれかの伝票と関連付けられている。そのため,伝票番号が決まれば,おのずと伝票追加情報テーブル中のレコードも決まってくる。ただし,伝票のレコードと伝票追加情報テーブルのレコードとは,1対1で対応するわけではない。Fig.6-77に示したように,伝票追加情報が更新されたときには1対多の対応になる。しかし,伝票のレコードと伝票追加情報テーブル中の削除ずみではないレコードとは,常に1対1で対応する。そこで,List 6-108の30行目では,“SELECT * FROM 伝票追加情報 WHERE SLIPID=引数に指定された伝票番号 AND DELETEDFLAG=0”というSQL文を実行することで,指定された伝票番号と結び付けられている伝票追加情報テーブルのレコード内容を返すようにした。また,GetRecordメソッドは,指定された伝票に結びつけられている伝票追加情報テーブル内のレコードのレコードID(IDフィールドの値)を戻り値として返すように実装している。

 以上の説明が示唆するように,伝票追加情報テーブルを取得するには,List 6-108で示したGetRecordメソッドだけでは不十分である。更新履歴を取得するため,ある伝票に結び付けられた伝票追加情報テーブル内の全レコードを返すメソッドが必要となる。そのようなメソッドをGetRecordsという名前でDataObj.SlipInformationコンポーネントに実装したものが,List 6-109である。List 6-109では,引数に指定された伝票番号に結び付けられている伝票追加情報テーブル中の全レコードを,ADODB.Recordsetオブジェクトとして返す。なお,細かいことではあるが,履歴は古いものから参照されることが多い。そのため22行目では,“ORDER BY MADEDATE”として,作成日時を保持するMADEDATEフィールドを古いものから順に並べるようにORDER BY句を付与している。

 このように,DataObj.SlipInformationコンポーネントにGetRecordメソッドとGetRecordsメソッドの2つを実装することにより,GetRecordメソッドを呼び出せばその時点で有効な伝票追加情報テーブルのレコード内容を,GetRecordsメソッドを呼び出せばすべての伝票追加情報テーブルのレコード(つまり履歴)を,それぞれ取得できるようになる。

prevpg.gif Chapter 6 57/92 nextpg.gif