アプリケーションを作成する中で、ComboBoxの項目を選択することで、別ComboBoxのリスト(項目)を絞り込むような処理を実現したい場合があると思います。
本Tipsでは、Formウィジェットのヘルパープログラムを使用してComboBoxを絞り込む方法についてご紹介します。
ComboBoxの絞り込み
本Tipsでは日本の「地域(八地方区分)」ComboBoxを選択時に「都道府県」ComboBoxのリストを絞り込む機能を例として紹介致します。
使用するファイルは、地域マスタ(REGIONPF)と都道府県マスタ(PREFECPF)です。
地域マスタと都道府県マスタ
地域マスタDDS
A*==============================================================*
A* ファイル名 : REGIONPF *
A* ファイル記述 : REGIONPR *
A* 作成日 : 2022/09/29 *
A*==============================================================*
A UNIQUE
A R REGIONPR TEXT('地域マスタ')
A*
A RGRGCD 1A COLHDG('地域コード')
A RGRGNM 20O COLHDG('地域名')
A*
A K RGRGCD
都道府県マスタDDS
A*==============================================================*
A* ファイル名 : PREFECPF *
A* ファイル記述 : PREFECPR *
A* 作成日 : 2022/09/29 *
A*==============================================================*
A UNIQUE
A R PREFECPR TEXT('都道府県マスタ')
A*
A PRPFCD 2A COLHDG('都道府県コード')
A PRRGCD 1A COLHDG('地域コード')
A PRPFNM 20O COLHDG('都道府県名')
A*
A K PRPFCD
地域マスタ(REGIONPF)
地域コード(RGRGCD) | 地域名(RGRGNM) |
1 | 北海道地方 |
2 | 東北地方 |
3 | 関東地方 |
4 | 中部地方 |
5 | 近畿地方 |
6 | 中国地方 |
7 | 四国地方 |
8 | 九州地方 |
都道府県マスタ(PREFECPF)
都道府県マスタは47都道府県が定義されています。
都道府県コード(PRPFCD) | 地域コード(PRRGCD) | 都道府県名(PRPFNM) |
1 | 1 | 北海道 |
2 | 2 | 青森県 |
3 | 2 | 岩手県 |
4 | 2 | 宮城県 |
… | … | … |
45 | 8 | 宮崎県 |
46 | 8 | 鹿児島県 |
47 | 8 | 沖縄県 |
データソースの作成
データソースは地域マスタと都道府県マスタファイルの列をすべて追加したデータソースです。
それぞれ、地域マスタはデータソース名「TIPS2209_REGION_DS」、都道府県マスタはデータソース名「TIPS2209_PREF_DS」で作成しています。
Formウィジェットへのドロップダウン追加
Formウィジェット上にComboBoxを表示するには、Formウィジェットの編集画面でフィールドに「ドロップダウン」にデータソースを追加して設定を行います。
地域フィールドに、地域マスタのデータソース (TIPS2209_REGION_DS)、都道府県フィールドに都道府県マスタのデータソース (TIPS2209_PREF_DS)を追加しました。
Formウィジェットのヘルパープログラム
FormウィジェットのComboBoxを絞り込むにはヘルパープログラムを設定する必要があります。
ヘルパープログラムのテンプレートはVALENCEライブラリのQRPGLESRCファイル内、メンバー名EXNABFHLPです。テンプレートをコピーしてRPGプログラムを作成します。
プログラム例は、EXNABFHLPメンバーをコピーしてFLTCOMBOというソースファイルを作成後、Processサブルーチンの箇所に以下ロジックを記述しています。
01 p Process b
02 d pi
03 D LREGION S 1a
04 /free
05 if gField = 'F1_REG';
06 LREGION = vvIn_char('F1_REG');
07 if LREGION = *blanks;
08 ClearComboFilter('F1_PREF');
09 else;
10 FilterCombo('F1_PREF':'F1_PRRGCD': LREGION);
11 endif;
12 endif;
13 /end-free
14 p e
gField
gFiledフィールドには、Formウィジェットで操作したフィールド名が設定されます。
今回の場合は地域フィールド(F1_REG)が変更された際に都道府県を絞り込みますので、5行目のように「 if gField = ‘F1_REG’ 」と比較して、地域フィールドが選択された場合のみ処理を実行します。
FilterCombo
10行目に記述されている、FilterComboはComboBoxを絞り込むためのプロシージャです。
1つ目の引数:ComboBoxのフィールド名
2つ目の引数:絞り込む対象のComboBoxに使用されているデータソースのフィールド名
3つ目の引数:絞り込む値
を設定します。
LREGIONフィールドには、6行目のvvIn_charの処理で、地域コードを取得しています。
つまり、都道府県のComboBoxのデータソースは、地域ComboBoxで選択された地域の項目値で絞り込まれることになります。
ClearComboFilter
ヘルパープログラム内のClearComboFilterは、FilterComboによって設定されたフィルター条件を削除する際に使用します。
今回の例では、地域ComboBoxが「未選択」の場合に、FilterComboを解除してすべての都道府県が選択できるようになります。
Formウィジェットにヘルパープログラムを設定
Formウィジェットに作成した「ヘルパープログラム」を設定します。
Formウィジェット編集画面の左側メニューで「フィールド」項目を選択すると、右側画面の右上に「ヘルパープログラム」の設定画面が表示されます。
「ヘルパープログラム」にプログラム「FLTCOMBO」を指定します。
「呼び出すタイミング」は3つあります。
- At form createion:フォーム作成時
- At form creation and each time a field is changed:フォーム作成時とフィールド項目変更時
- At form creation and each time a field is changed or loses focus: フォーム作成時とフィールド項目変更時、フォーカスを失った際
デフォルトの「At form creation and each time a field is changed」を設定しました。
実行時の絞り込み
画面表示時、都道府県ComboBoxは全ての項目(47都道府県)が表示されます。
地域Comboboxで「項目」を選択した場合、
※例では「東北地方」を選択しました。
都道府県ComboBoxが地域ComboBoxの項目により絞り込まれます。