この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
●明細の新規作成と編集
明細の表示まで実装できたところで,伝票の新規作成ならびに編集処理を実装してゆく。 ○アクティブセルの移動に合わせてカレント行を移動する
伝票を新規作成する場合はともかくとして,編集する場合には,当然ながらFLXGrid_SlipDetail階層フレキシブルグリッドでアクティブセルとなっている行が編集の対象となる明細である。つまり,FLXGrid_SlipDetail階層フレキシブルグリッド上で,どのセルがアクティブセルになったのかを判定し,ADODB.Recordsetオブジェクトにおけるどのレコードを編集対象とすればよいのかを調べる必要がある。
すでに解説したとおり,List 7-148のRefreshDataプロシージャでは,Business.SlipコンポーネントのGetSlipDetailsメソッド(List 6-131)を呼び出して取得した明細情報(ADODB.Recordsetオブジェクト)は,グローバル変数g_objRecに保存するようにした。そこで,ユーザーがFLXGrid_SlipDetail階層フレキシブルグリッド上でマウスをクリックしたりカーソルキーを押したりしてアクティブセルが変更されたときに,グローバル変数g_objRecが保持するADODB.Recordsetオブジェクトのカレント行を,アクティブセルが指している行と一致させるように変更するという処理を実装する。
階層フレキシブルグリッドコントロールは,アクティブセルが変更されたときに,SelChangeというイベントを発生させる。このとき,colプロパティとrowプロパティを参照することで,アクティブセルとなる列番号と行番号とを,それぞれ取得することができる。ここでは,SelChangeイベントの処理をList 7-153のように実装する。
List 7-153では,カレント行を合わせるために,ADODB.RecordsetオブジェクトのFindメソッドを用いている。まず,4行目においてMoveFirstメソッドを呼び出し,カレント行を先頭に移動する。そして続く5行目で,Findメソッドを呼び出すことにより,特定の条件を満たす行を検索し,それをカレント行としている。
5行目にあるように,Findメソッドの検索条件は,“"ID=" & FLXGrid_SlipDetail.RowData(FLXGrid_SlipDetail.row)”となっている。まず,括弧内のFLXGrid_SlipDetail.rowという部分は,FLXGrid_SlipDetail階層フレキシブルグリッドにおいてアクティブセルとなっているセルの行番号である。そして,RowDataプロパティの値を取得している。すでにList 7-148で示したRefreshDataプロシージャの48行目では,RowData(行番号)のプロパティに,その行に対応する明細番号を格納するようにしてある。つまり,5行目の検索式は,“ID=アクティブセルとなっている行の明細番号”となる。これにより,アクティブセルによって示される行が,グローバル変数g_objRec上でカレント行になるように設定されたことになる。
List 7-153の処理を実装することにより,ユーザーがFLXGrid_SlipDetail階層フレキシブルグリッドでアクティブセルを移動すると,それに応じてグローバル変数g_objRecのカレント行も移動するようになる。つまり,明細を編集するときには,グローバル変数g_objRecが指すADODB.Recordsetオブジェクトのカレント行を対象とすればよいということになる。
ところで,グローバル変数g_objRecが指すカレント行の状態によって,FormSlipDetailフォーム(Fig.7-92)に配置した各ボタンの状態を変更する必要があるだろう。たとえば,グローバル変数g_objRecが指すカレント行が何もない場合(EOFもしくはBOFである場合)には,[編集]ボタン(BTN_EDITボタン)や[削除]ボタン(BTN_DELETEボタン)を淡色表示にし,無効にすべきである。そこで,グローバル変数g_objRecのMoveCompleteイベントを処理するよう,List 7-154の処理を実装する。
List 7-154では,2つの処理をしている。1つは,カレント行が空であるとき,および伝票が作成中か却下中でないとき,[編集]ボタンと[削除]ボタンを淡色表示にしていることである。もう1つは,すでに削除ずみとなっている明細(取り消し線が表示されている明細)を二重に削除しないよう,カレント行が削除ずみとなっている明細を指していた場合には,[削除]ボタンを淡色表示にするという処理である。
ところで,ユーザーがFLXGrid_SlipDetail階層フレキシブルグリッドで明細以外の行(たとえば,小計や消費税,合計などを表示している行)をアクティブセルとした場合にどうなるのか,気になる人もいるだろう。小計や消費税,合計などを設定しているのは,RefreshDataプロシージャ(List 7-148)の62〜66行目である。これらの行の追加処理においては,RowData(行番号)のプロパティを設定していないため,RowData(行番号)のプロパティを参照すると,値0を取得することになる。そのため,List 7-153の処理において,明細番号が0であるレコードをカレント行とする処理が実行されるが,明細情報テーブルで「明細番号は1以上の値である」と定義してあるから,そのようなレコードは見つからない。つまり,List 7-153の5行目にあるFindメソッドは失敗し,カレント行がEOFになる。このときList 7-154の処理によって,[編集]ボタンと[削除]ボタンはともに淡色表示となるから,小計や消費税,合計といった行がアクティブセルになっても,誤ってその行が編集対象となってしまうということはない。
○明細情報を編集するためのフォーム
では次に,明細情報を新規登録したり編集したりするためのフォームを実装する。今回はFig.7-98に示すFormEditSlipDetailという名前のフォームを利用する。FormEditSlipDetailフォームは,MDI子ウィンドウではなく,通常のフォームとして実装する。このフォームは,FormSlipDetailフォーム(Fig.7-92)の[新規]ボタン(BTN_NEWボタン)や[編集]ボタン(BTN_EDITボタン)が押されたときに,モーダルウィンドウとして表示する。
Fig.7-98 FormEditSlipDetailフォームの構成

| 113/134 |
