この特集のトップページへ
>
Chapter 7:プレゼンテーション層の構築
●製品一覧をコンボボックスに格納する
基本的にFig.7-74で示したFormEditStockフォームの処理は,顧客編集のときに使ったFormEditCustomerフォーム(Fig.7-23)や製品編集のときに使ったFormEditProductフォーム(Fig.7-69)とほぼ同じ処理になる。しかし,決定的な違いが1つある。それは,入荷する製品をユーザーが入力するのではなく,すでに登録してある製品から1つを選択させる,という入力方式の違いである。この違いを考慮して,Fig.7-74では製品名を入力する欄をテキストボックスではなくコンボボックスとした。このコンボボックスには,Fig.7-75のように登録された製品名の一覧が表示するようにし,ユーザーは表示される項目から選択して入力することになる。
Fig.7-75 製品の選択
在庫情報テーブル(Table 3-25)を参照するとわかるように,入庫情報においては,どの製品に対する入庫情報であるのかを製品番号で区別する。よって,コンボボックスではなく,ユーザーに製品番号を入力させてもかまわない。しかし,それではユーザーが製品番号を覚えていなければならないために,扱いにくいものとなってしまう。そこで,コンボボックスを使って製品一覧を表示し,そこから選択させるようにしたほうがよいと思われる。
ただし,数値で入力すればキーボードから手を離さずに操作できるというメリットがあるため,業務形態によっては,コンボボックスで選択するよりも,テキストボックスに数値を入力させるほうがよいという場合もある。そのため,ユーザーインタフェースとしてどちらが好ましいのかは,一概にいうことはできない。
さて,このような処理にするためには,当然,製品名のコンボボックス(COMBO_PRODUCT)に,その時点で登録されている製品一覧を格納するメソッドが必要となる。そこで,List 7-94に示すFillComboというプロシージャを実装する。
List 7-94のFillComboプロシージャは,Business.ProductコンポーネントのGetProductsメソッド(List 6-68)を使って製品の一覧を含むADODB.Recordsetオブジェクトを取得し,その内容をCOMBO_PRODUCTコンボボックスの項目に加えるという処理をするものである。
実際にその処理をしているのが,24〜35行目のWhile〜Wendループである。ここでは,取得したADODB.RecordsetオブジェクトのPRODUCTNAMEフィールド(製品名)の値をAddItemメソッドを使ってCOMBO_PRODUCTコンボボックスに加え(27行目),そのあとItemDataプロパティを使って,加えた項目のデータとしてIDフィールド(製品番号)の値を設定している。こうすることで,ユーザーがある製品を選択したときに,その製品に対応する製品番号が,次の書式で取得できるようになる。
製品番号 = _ COMBO_PRODUCT.ItemData( _ COMBO_PRODUCT.ListIndex)
なお,25行目にあるように,DELETEDFLAGフィールドの値を調べ,削除ずみとなっている製品についてはコンボボックスの項目に加えないようにしてある。
ところで,List 7-94には,COMBO_PRODUCTコンボボックスに製品一覧を追加したのち,特定の製品を選択状態にするという機能が搭載されている。具体的には,引数SetFocusIDで指定された製品番号を持つ項目を選択状態にする。
そのために29〜33行目では,製品番号を含むADODB.RecordsetオブジェクトのIDフィールド(製品番号)の値が,引数SetFocusIDで渡された値と合致するかどうかを調べている。そして,もし両者が合致していたならば,32行目にあるように,この項目のインデックス番号をSelIndex変数に保存しておく。全項目をCOMBO_PRODUCTコンボボックスに追加したら,32行目で保存しておいたインデックス番号をListIndexプロパティに代入する(39行目)。コンボボックスのListIndexプロパティは,その時点で選択されているインデックス番号を保持する変数である。ListIndexプロパティにインデックス番号を設定するということは,そのインデックス番号を持つ項目を選択状態にするということを意味する。
なお,ListIndexプロパティに-1を設定すると,どの項目も選択されていない状態となる。そこで,事前に22行目の処理においてSelIndex変数には-1を格納しておいた。もし29〜33行目の処理で,引数に指定された製品番号と一致する製品が見つからないとすると,SelIndex変数が-1のまま39行目の処理に移るので,その場合には何も選択されていない状態となる。
以上のことをまとめておこう。FillComboプロシージャは,「その時点で登録されている製品のすべてをCOMBO_PRODUCTコンボボックスに加えたのち,引数に指定された製品番号と一致する製品を選択状態にする」という機能を備えていることになる。実はこの時点では,わざわざ引数に指定された製品番号と一致する製品を選択状態にする機能を付加する必要はない。しかし,この処理は,のちに説明する「●入庫情報の編集」で必要になる。なぜなら,入庫情報を編集するためには,編集対象となる入庫情報に設定されている情報をFormEditStockフォームに表示しなければならないから,COMBO_PRODUCTコンボボックスには,編集対象となる入庫情報に設定されている製品をユーザーに表示する(つまり,その製品を選択状態として表示する)機能が必要となるためである。詳細は,「●入庫情報の編集」にて説明する。
83/134 |