プロンプト選択プログラム(CHOICEPGM)とはコマンドで良く見かける、
名前、リストはF4キー
というようにリスト選択機能を提供するプログラムである。
自分でIBMユーティリティのようにリスト選択機能を作りたいと
思ったことはないだろうか?
あるいは次のようにパラメータの後ろに「から」「まで」の文字列を
表示することができる。
[仕入先マスター一覧表: PGM104 ]
仕入先マスター一覧表 (PGM104) 選択項目を入力して,実行キーを押してください。 仕入先コード . . . . . . . . . から 9999 まで 出力 . . . . . . . . . . . . . *PRINT *, *PRINT 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
[解説]
仕入先コード から
9999 まで と表示するだけでエンド・ユーザーにとって
操作がわかりやすいものとなる。
[コマンド: PGM104 ]
ソースはこちらから
0001.00 CMD PROMPT(' 仕入先マスター一覧表 ') 0002.00 PARM KWD(SRFROM) TYPE(*CHAR) LEN(4) CHOICE(*PGM) + 0003.00 CHOICEPGM(QTROBJ/PGM106P) + 0004.00 PROMPT(' 仕入先コード ') 0005.00 PARM KWD(SREND) TYPE(*CHAR) LEN(4) DFT(9999) + 0006.00 CHOICE(*PGM) CHOICEPGM(QTROBJ/PGM106P) 0007.00 PARM KWD(OUTPUT) TYPE(*CHAR) LEN(8) RSTD(*YES) + 0008.00 DFT(*PRINT) VALUES(* *PRINT) PROMPT(' 出力 ')
[プロンプト選択プログラム : 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
[解説]
プロンプト選択プログラムのパラメータは
コマンド・パラメータ &CMDPRM と &RTNVAR の2つであり
&CMDPRM = コマンド名(10桁) + キー・ワード(10桁) + タイプ(1桁)
である。
タイプ が C とは後続する文字列が要求された場合であるので
このときに「から」「まで」をキー・ワードに応じて入れてやればよい。
このような プロンプト選択プログラムのテンプレートが次に示す AA6_SAMPELである。
[プロンプト選択プログラム : AA7_SAMPLE ]
ソースはこちらから
0001.00 PGM PARM(&RCVCMD &SNDPRM) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* AA7_SAMPLE: プロンプト選択プログラム (CHOICEPGM) */ 0004.00 /* */ 0005.00 /* 2020/03/19 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&RCVCMD) TYPE(*CHAR) LEN(21) 0008.00 DCL VAR(&CMD) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&KWD) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&ACT) TYPE(*CHAR) LEN(1) 0011.00 DCL VAR(&SNDPRM) TYPE(*CHAR) LEN(2000) 0012.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0013.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0014.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0015.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0017.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0018.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0019.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4) /* 2 進数 */ 0020.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) 0021.00 DCL VAR(&PRMHED) TYPE(*CHAR) LEN(30) 0022.00 DCL VAR(&TOTAL) TYPE(*CHAR) LEN(2) 0023.00 DCL VAR(&PRM1992) TYPE(*CHAR) LEN(1992) 0024.00 DCL VAR(&LEN) TYPE(*DEC) LEN(8 0) 0025.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00') 0026.00 DCL VAR(&COUNT) TYPE(*DEC) LEN(8 0) 0027.00 DCL VAR(&RECORD) TYPE(*CHAR) LEN(34) 0028.00 DCL VAR(&RECLEN) TYPE(*CHAR) LEN(2) 0029.00 DCL VAR(&KBN) TYPE(*CHAR) LEN(1) 0030.00 DCL VAR(&OBJOBJLIB) TYPE(*CHAR) LEN(20) + 0031.00 VALUE('オブジェクト/ライブラリー') 0032.00 DCL VAR(&STRPOS) TYPE(*CHAR) LEN(4) + 0033.00 VALUE(X'0000007D') /* 2 進数開始位置 : + 0034.00 125 */ 0035.00 DCL VAR(&LENDTA) TYPE(*CHAR) LEN(4) + 0036.00 VALUE(X'00000010') /* 2 進数受取長さ : 16 */ 0037.00 DCL VAR(&RCVVAR) TYPE(*CHAR) LEN(16) + 0038.00 VALUE(X'0000000000000000') 0039.00 DCL VAR(&OFFSET) TYPE(*CHAR) LEN(4) /* + 0040.00 2 進数 オフセット */ 0041.00 DCL VAR(&NOENTR) TYPE(*CHAR) LEN(4) /* + 0042.00 2 進数項目数 */ 0043.00 DCL VAR(&LSTSIZ) TYPE(*CHAR) LEN(4) /* + 0044.00 2 進数リストサイズ */ 0045.00 DCL VAR(&ADDLEN) TYPE(*DEC) LEN(8 0) /* WORK */ 0046.00 DCL VAR(&NOENT) TYPE(*DEC) LEN(8 0) /* WORK */ 0047.00 DCL VAR(&N) TYPE(*DEC) LEN(8 0) VALUE(1) /* WORK */ 0048.00 DCL VAR(&RCVDTA) TYPE(*CHAR) LEN(1024) /* + 0049.00 受取データ */ 0050.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0) 0051.00 DCL VAR(&FLD8) TYPE(*CHAR) LEN(8) 0052.00 DCL VAR(&DEV) TYPE(*CHAR) LEN(10) 0053.00 DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) 0054.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0055.00 0056.00 CHGVAR VAR(&CMD) VALUE(%SST(&RCVCMD 01 10)) 0057.00 CHGVAR VAR(&KWD) VALUE(%SST(&RCVCMD 11 10)) 0058.00 CHGVAR VAR(&ACT) VALUE(%SST(&RCVCMD 21 1)) 0059.00 IF COND(&ACT *EQ &NULL) THEN(DO) 0060.00 CHGVAR VAR(&SNDPRM) VALUE('F4=PROMOT') 0061.00 RETURN 0062.00 ENDDO 0063.00 IF COND(&ACT *EQ 'C') THEN(DO) 0064.00 CHGVAR VAR(&SNDPRM) VALUE(' 名前,リストは F4') 0065.00 RETURN 0066.00 ENDC: ENDDO 0067.00 /* ************************************************ */ 0068.00 /* ライターの検索 */ 0069.00 /* ************************************************ */ 0070.00 CHGVAR VAR(&COUNT) VALUE(0) 0071.00 /*( ユーザー・スペースの作成 )*/ 0072.00 CALL PGM(QUSCRTUS) PARM('QUSLOBJ QTEMP ' + 0073.00 'PF ' 1000 ' ' '*ALL ' + 0074.00 'QUSLOBJD 用ユーザー空間 ' '*YES ' + 0075.00 &APIERR) 0076.00 MONMSG CPF9870 0077.00 /*( QUSLOBJ : オブジェクト・リストAPI )*/ 0078.00 CHGVAR VAR(&OBJOBJLIB) VALUE('*ALL QSYS ') 0079.00 CALL PGM(QUSLOBJ) PARM('QUSLOBJ QTEMP ' + 0080.00 'OBJL0200' &OBJOBJLIB '*DEVD ' &APIERR) 0081.00 /*( リストAPIで作成されたユーザー空間の検索 )*/ 0082.00 /*( リストデータセクションのオフセットを検索 )*/ 0083.00 CALL PGM(QUSRTVUS) PARM('QUSLOBJ QTEMP ' + 0084.00 &STRPOS &LENDTA &RCVVAR) 0085.00 CHGVAR VAR(&OFFSET) VALUE(%SST(&RCVVAR 1 4)) 0086.00 CHGVAR VAR(&NOENTR) VALUE(%SST(&RCVVAR 9 4)) 0087.00 CHGVAR VAR(&LSTSIZ) VALUE(%SST(&RCVVAR 13 4)) 0088.00 0089.00 /*( RCVVAR によって OFFSET,LSTSIZ を受取った )*/ 0090.00 CHGVAR VAR(&STRPOS) VALUE(&OFFSET) 0091.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0092.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + 1) 0093.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0094.00 CHGVAR VAR(&LENDTA) VALUE(&LSTSIZ) 0095.00 CHGVAR VAR(&ADDLEN) VALUE(%BIN(&LENDTA)) 0096.00 CHGVAR VAR(&NOENT) VALUE(%BIN(&NOENTR)) 0097.00 CHGVAR VAR(&COUNT) VALUE(0) 0098.00 CHGVAR VAR(&LEN) VALUE(0) 0099.00 CHGVAR VAR(%BIN(&RECLEN)) VALUE(10) 0100.00 READ: 0101.00 CALL PGM(QUSRTVUS) PARM('QUSLOBJ QTEMP ' + 0102.00 &STRPOS &LENDTA &RCVDTA) 0103.00 /*( 処理の開始 )*/ 0104.00 CHGVAR VAR(&DEV) VALUE(%SST(&RCVDTA 01 10)) 0105.00 CHGVAR VAR(&OBJATR) VALUE(%SST(&RCVDTA 32 10)) 0106.00 IF COND(%SST(&OBJATR 1 3) *EQ 'PRT') THEN(DO) 0107.00 CHGVAR VAR(&COUNT) VALUE(&COUNT + 1) 0108.00 CHGVAR VAR(&RECORD) VALUE(&RECLEN *CAT &DEV) 0109.00 IF COND(&COUNT *EQ 1) THEN(DO) /* 最初 */ 0110.00 CHGVAR VAR(&PRM1992) VALUE(&RECORD) 0111.00 ENDDO /* 最初 */ 0112.00 ELSE CMD(DO) /* 2 番目以降 */ 0113.00 CHGVAR VAR(&PRM1992) VALUE(%SST(&PRM1992 1 &LEN) + 0114.00 *CAT &RECORD) 0115.00 ENDDO /* 2 番目以降 */ 0116.00 CHGVAR VAR(&LEN) VALUE(&LEN + 12) 0117.00 ENDDO 0118.00 /*( 処理の終了 )*/ 0119.00 IF COND(&N < &NOENT) THEN(DO) 0120.00 CHGVAR VAR(&N) VALUE(&N + 1) 0121.00 CHGVAR VAR(&DEC08) VALUE(%BIN(&STRPOS)) 0122.00 CHGVAR VAR(&DEC08) VALUE(&DEC08 + &ADDLEN) 0123.00 CHGVAR VAR(%BIN(&STRPOS)) VALUE(&DEC08) 0124.00 GOTO READ 0125.00 ENDDO 0126.00 REDEND: 0127.00 /*( 合計を記述する )*/ 0128.00 CHGVAR VAR(%BIN(&TOTAL)) VALUE(&COUNT) 0129.00 CHGVAR VAR(&SNDPRM) VALUE(&TOTAL *CAT &PRM1992) 0130.00 RETURN 0131.00 0132.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0133.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0134.00 MSGFLIB(&MSGFLIB) 0135.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0136.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0137.00 MSGTYPE(*ESCAPE) 0138.00 ENDDO 0139.00 ELSE CMD(DO) 0140.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0141.00 MSGDTA(&MSGDTA) TOMSGQ(*TOPGMQ) + 0142.00 MSGTYPE(*ESCAPE) 0143.00 ENDDO 0144.00 DSPJOBLOG JOB(*) OUTPUT(*PRINT) 0145.00 ENDPGM: ENDPGM