IBMのユーティリティ・コマンドで「リストはF4」というパラメータの説明を
見たことがあるかも知れない。
例えば STRPDM で「3. メンバーの処理」を選択すると
処理するメンバーの指定 選択項目を入力して,実行キーを押してください。 ファイル . . . . . . . . QPNLSRC 名前,リストは F4 ライブラリー . . . . . R610SRC *LIBL, *CURLIB, 名前 メンバー: 名前 . . . . . . . . . STRHTPSVR* *ALL, 名前, * 総称 * タイプ . . . . . . . . *ALL *ALL, タイプ, * 総称 *, *BLANK
のようにしてファイルの説明に「名前,リストは F4」と表示されていて
ファイル名にカーソルをセットしてF4キーを押すと例えば次のようにリスト表示が
される。
PDM を使用したファイルの選択 ライブラリー . : R610SRC 位置指定 . . . . . . . 開始文字 名前によるサブセット *ALL *ALL, 名前, * 総称 * オプションを入力して,実行キーを押してください。 1= 選択 OPT ファイル 属性 テキスト EVFEVENT PF-DTA H PF-SRC H240 PF-SRC NSMAP PF-SRC QAPWSRC PF-SRC QCBLLESRC PF-SRC QCBL5035 PF-SRC QCLLESRC PF-SRC QCLSRC PF-SRC QCLSRC2 PF-SRC
これはどのようにしてIBMは実現しているのだろうか?
これはコマンドの「プログラム選択(CHOICEPGM)」を利用している。
これを実現するコマンドを作ってみよう。
[サンプル・コマンド: PGM106 ]
商品マスター一覧表 (PGM106) 選択項目を入力して,実行キーを押してください。 品種コード . . . . . . . . . . から 9999 まで 商品コード . . . . . . . . . . から , リストは F4 9999999999 まで 出力 . . . . . . . . . . . . . *PDF *PRINT, *PDF
商品コードに「から , リストは F4」と説明されていることに注意して欲しい。
次にコマンドのソースを示す。
[サンプル・コマンド: PGM106 ]
0001.00 CMD PROMPT(' 商品マスター一覧表 ') 0002.00 PARM KWD(HNSFROM) TYPE(*CHAR) LEN(4) CHOICE(*PGM) + 0003.00 CHOICEPGM(QTROBJ/PGM106P) + 0004.00 PROMPT(' 品種コード ') 0005.00 PARM KWD(HNSEND) TYPE(*CHAR) LEN(4) DFT(9999) + 0006.00 CHOICE(*PGM) CHOICEPGM(QTROBJ/PGM106P) 0007.00 PARM KWD(SHFROM) TYPE(*CHAR) LEN(10) CHOICE(*PGM) + 0008.00 CHOICEPGM(QTROBJ/PGM106PE) + 0009.00 PROMPT(' 商品コード ') 0010.00 PARM KWD(SHEND) TYPE(*CHAR) LEN(10) + 0011.00 DFT(9999999999) CHOICE(*PGM) + 0012.00 CHOICEPGM(QTROBJ/PGM106P) 0013.00 PARM KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) + 0014.00 DFT(*PDF) VALUES(*PRINT *PDF) + 0015.00 PROMPT(' 出力 ')
プログラム選択として2つのプログラムが使われている。
PGM106P と PGM106PE である。
[ 選択プログラム : PGM106P ]
0001.00 PGM PARM(&CMDPRM1 &RTNVAR) 0002.00 DCL VAR(&CMDPRM1) TYPE(*CHAR) LEN(21) 0003.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(10) 0004.00 DCL VAR(&KWD) TYPE(*CHAR) LEN(10) 0005.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0006.00 DCL VAR(&RTNVAR) TYPE(*CHAR) LEN(2000) 0007.00 0008.00 CHGVAR VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10)) 0009.00 CHGVAR VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10)) 0010.00 CHGVAR VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1)) 0011.00 /*( テキスト )*/ 0012.00 IF COND(&TYPE *EQ 'C') THEN(DO) 0013.00 IF COND((&KWD *EQ 'HNSFROM ') *OR (&KWD *EQ + 0014.00 'SHFROM ') *OR (&KWD *EQ 'TKFROM ') + 0015.00 *OR (&KWD *EQ 'SRFROM ')) THEN(DO) 0016.00 CHGVAR VAR(&RTNVAR) VALUE(' から ') 0017.00 ENDDO 0018.00 ELSE CMD(DO) 0019.00 CHGVAR VAR(&RTNVAR) VALUE(' まで ') 0020.00 ENDDO 0021.00 RETURN 0022.00 ENDDO 0023.00 0024.00 ENDPGM
[解説]
このPGM106Pは簡単でパラメータは2つと決まっていて
0001.00 PGM PARM(&CMDPRM1 &RTNVAR) 0002.00 DCL VAR(&CMDPRM1) TYPE(*CHAR) LEN(21) : 0006.00 DCL VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)
として &CMDPARM1 にはコマンド名+ キー・ワード名 + 処理タイプが渡されるので
0008.00 CHGVAR VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10)) 0009.00 CHGVAR VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10)) 0010.00 CHGVAR VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))
によってコマンド名: &CMD, キー・ワード名: &KWD と 処理タイプ: &TYPE を
受取る。
そしてキー・ワード名が HNSFROM, SHFROM または SRFROMなどの
開始を示すフィールド名であれば文字列「から」を
0016.00 CHGVAR VAR(&RTNVAR) VALUE(' から ')
のようにして戻す。それ以外であれば
0019.00 CHGVAR VAR(&RTNVAR) VALUE(' まで ')
のようにして「まで」を戻す。
このようにして「から」「まで」をキー・ワードの後続に表示することができる。
次にリスト表示を行う選択プログラム: PGM106PE を紹介しよう。
[ 選択プログラム : PGM106PE ]
0001.00 PGM PARM(&CMDPRM1 &RTNVAR) 0002.00 DCL VAR(&CMDPRM1) TYPE(*CHAR) LEN(21) 0003.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(10) 0004.00 DCL VAR(&KWD) TYPE(*CHAR) LEN(10) 0005.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0006.00 DCL VAR(&RTNVAR) TYPE(*CHAR) LEN(2000) 0007.00 0008.00 CHGVAR VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10)) 0009.00 CHGVAR VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10)) 0010.00 CHGVAR VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1)) 0011.00 0012.00 SELECT 0013.00 /*( テキスト )*/ 0014.00 WHEN COND(&TYPE *EQ 'C') THEN(DO) 0015.00 IF COND((&KWD *EQ 'HNSFROM ') *OR (&KWD *EQ + 0016.00 'SHFROM ') *OR (&KWD *EQ 'TKFROM ') + 0017.00 *OR (&KWD *EQ 'SRFROM ')) THEN(DO) 0018.00 CHGVAR VAR(&RTNVAR) VALUE(' から , リストは F4') 0019.00 ENDDO 0020.00 ELSE CMD(DO) 0021.00 CHGVAR VAR(&RTNVAR) VALUE(' まで ') 0022.00 ENDDO 0023.00 RETURN 0024.00 ENDDO 0025.00 /*( リストは F4 )*/ 0026.00 WHEN COND(&TYPE *EQ 'P') THEN(DO) 0027.00 CALL PGM(QTROBJ/PGM106F) PARM(&RTNVAR) 0028.00 RETURN 0029.00 ENDDO 0030.00 ENDSELECT 0031.00 0032.00 ENDPGM
[解説]
PGM006E は CLPでも使用可能になった SELECT-WHEN を使って記述している。
SELECT WHEN : ENDSELECT
のような書き方であり ILE-RPGの SELECT- ENDSL と似ている。
さてエンド・ユーザーが「から , リストは F4」のキー・ワードにカーソルを合わせて
F4キーを押すと &TYPEには文字 P が入るのでこのとき次のILE-RPG : PGM006Fが
呼び出されて実行される。
[ ILE-RPG: PGM006F ]
0001.00 H DFTNAME(PGM106F) DATEDIT(*YMD/) 0002.00 F******** CHOICEPGM : 商品マスターを検索 *************************** 0003.00 FSHOHIN IF E K DISK 0004.00 F EXTFILE('QTRFIL/SHOHIN') 0005.00 F******************************************************************* 0006.00 D N S 4S 0 0007.00 D POS S 4S 0 INZ(3) 0008.00 0009.00 DRECL# DS 0010.00 D RECL 1 2B 0 INZ(10) 0011.00 0012.00 DTOTAL# DS 0013.00 D TOTAL 1 2B 0 INZ(0) 0014.00 C*-------------------------------------------------------------------------+ 0015.00 C *ENTRY PLIST | 0016.00 C PARM RTNVAR 2000 | 0017.00 C*-------------------------------------------------------------------------+ 0018.00 C *LOVAL SETLL SHOHIN 0019.00 C 1 DO *HIVAL N 0020.00 C SETOFF 50 0021.00 C READ SHOHIN 50 0022.00 C 50 LEAVE 0023.00 *( レコード長 10 バイトを更新 ) 0024.00 C EVAL %SUBST(RTNVAR:POS:2) = RECL# 0025.00 C EVAL POS += 2 0026.00 *( 商品コードを更新 ) 0027.00 C EVAL %SUBST(RTNVAR:POS:10) = SHCODE 0028.00 C EVAL POS += 10 0029.00 C ENDDO 0030.00 *( 合計数を書き込む ) 0031.00 C EVAL TOTAL = N -1 0032.00 C EVAL %SUBST(RTNVAR:1:2) = TOTAL# 0033.00 C SETON LR 0034.00 C RETURN
[解説]
商品マスター: SHOHINを読み取って RTNVAR という2000バイトの変数に入れているだけの
簡単なプログラムである。
ただし RTNVAR は
合計数 2バイト |
1番目 | 2番目 | ….. | N番目 | |||
長さ | レコード | 長さ | レコード | ….. | 長さ | レコード | |
2バイト | 2バイト | 2バイト | |||||
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
・ ・ ・ |
というように構成しなければならない。
エンド・ユーザーがF4キーを押すと次のように表示される。
パラメーターの値の指定 SHFROM 選択項目を入力して,実行キーを押してください。 タイプ . . . . . . . . . . . : 文字 商品コード . . . . . . . . . . NV-BS30S RX-DT75 NV-BS50S SC-CH150 NV-CF1 SC-CH505 NV-CF2 SC-CH655 NV-CF81 SC-CH950 NV-CF9 SF-SDCD NV-F850 TH-19VS30 NV-HK1 TH-21VS30 NV-H1T-S TH-25GF10 NV-SX10 TH-25GV10 NV-W1 TH-25VS30 RX-AZ1 TH-29GF10 RX-BZ1 TH-29GV10
[解説]
これは良くIBM iのユーティリティ・コマンドで見かけるコマンドの検索と同じである。
開発者のこのような検索機能のためにDSPFもSFLも開発する必要はない。
しかもコマンドで提供される機能なのでバグも発生しない。
この「F4=リスト」による検索方法はスマートで洗練されている。
是非社内の適用業務にも利用して頂きたい。