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=リスト」による検索方法はスマートで洗練されている。
是非社内の適用業務にも利用して頂きたい。
