プロンプト一時変更プログラム(PMTOVRPGM)とはコマンドが表示される直前に
呼び出されてコマンド・パラメータの初期値をセットするプログラムのことである。
いわばコマンドの初期設定プログラムと言ったほうがわかりやすいかも知れない。
コマンドは呼び出される直前にそのときの環境や状態を読み取って動的に
パラメータの初期値を変化させたい場合がある。
このようなときにプロンプト一時変更プログラム(PMTOVRPGM)が使われる。
[売上明細表: URIAGE ]
売上明細表 (URIAGE) 選択項目を入力して,実行キーを押してください。 売上年月日から . . . . . . . . 数値 まで . . . . . . . . 数値 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
[解説]
この売上明細表を出力するには売上日の開始日と終了日を入力しなければならない。
初期値として開始日と終了日をセットするにはどうすればよいか?
[コマンド:URIAGE ]
0001.00 CMD PROMPT(' 売上明細表 ') +
0002.00 PMTOVRPGM(QUATTRO/URIINZ)
0003.00 PARM KWD(URFROM) TYPE(*DEC) LEN(8 0) +
0004.00 PROMPT(' 売上年月日から ')
0005.00 PARM KWD(URTO) TYPE(*DEC) LEN(8 0) +
0006.00 PROMPT(' まで ')
[解説]
このようにプロンプト一時変更プログラム(PMTOVRPGM)を指定する。
プロンプト一時変更プログラム(PMTOVRPGM)はコマンドのコンパイル時に
CRTCMD CMD(QUATTRO/URIAGE) PGM(QUATTRO/URIAGECL) SRCFILE(R610SRC/QCMDSRC)
PMTOVRPGM(QUATTRO/URIINZ) AUT(*ALL)
のように指定してもよいが再コンパイルのときにも毎回指定しなければならない。
それならば
0001.00 CMD PROMPT(' 売上明細表 ') + 0002.00 PMTOVRPGM(QUATTRO/URIINZ)
と指定しておけばコンパイルには何も指定する必要はない。
CRTCMD CMD(QUATTRO/URIAGE) PGM(QUATTRO/URIAGECL) SRCFILE(R610SRC/QCMDSRC) AUT(*ALL)
で十分である。
次にプロンプト一時変更プログラム(PMTOVRPGM)のCLPソースを紹介する。
[URIINZ:プロンプト一時変更プログラム(PMTOVRPGM)]
ソースはこちらから
0001.00 PGM PARM(&CMDNAME &STRING) 0002.00 /*------------------------------------------------------------------------*/ 0003.00 /* URIINZ : コマンド一時変更プログラム */ 0004.00 /* -- このプログラムはコマンドの初期値を設定します。 */ 0005.00 /* &STRING に長さとパラメータの初期値を戻します。 */ 0006.00 /* */ 0007.00 /* 2020/04/12 作成 */ 0008.00 /*------------------------------------------------------------------------*/ 0009.00 DCL VAR(&CMDNAME) TYPE(*CHAR) LEN(20) 0010.00 DCL VAR(&STRING) TYPE(*CHAR) LEN(5700) 0011.00 DCL VAR(&STRINGLEN) TYPE(*DEC) LEN(8 0) VALUE(1024) 0012.00 DCL VAR(&BIN2) TYPE(*CHAR) LEN(2) VALUE(X'0400') + 0013.00 /* 長さ 1024 バイト */ 0014.00 DCL VAR(&BIN4) TYPE(*CHAR) LEN(4) 0015.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0016.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0017.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0018.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0019.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0020.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0021.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0022.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0023.00 VALUE('*ESCAPE ') 0024.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0025.00 VALUE(X'000074') /* 2 進数 */ 0026.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0027.00 VALUE(X'00000000') 0028.00 /*--------------------------------------------------*/ 0029.00 /* 以下は装置の初期値パラメータ */ 0030.00 /*--------------------------------------------------*/ 0031.00 DCL VAR(&DEV_) TYPE(*CHAR) LEN(10) 0032.00 /*--------------------------------------------------*/ 0033.00 /* 以下は返信パラメータ */ 0034.00 /*--------------------------------------------------*/ 0035.00 DCL VAR(&URFROM) TYPE(*CHAR) LEN(40) + 0036.00 VALUE(' ??URFROM(') 0037.00 DCL VAR(&URTO) TYPE(*CHAR) LEN(40) + 0038.00 VALUE(' ??URTO(') 0039.00 /*--------------------------------------------------*/ 0040.00 /* 以下は作業用の変数 */ 0041.00 /*--------------------------------------------------*/ 0042.00 DCL VAR(&DATE) TYPE(*CHAR) LEN(6) 0043.00 DCL VAR(&YY) TYPE(*CHAR) LEN(2) 0044.00 DCL VAR(&MM) TYPE(*CHAR) LEN(2) 0045.00 DCL VAR(&DD) TYPE(*CHAR) LEN(2) 0046.00 DCL VAR(&CYY) TYPE(*CHAR) LEN(4) 0047.00 DCL VAR(&FROMYMD) TYPE(*CHAR) LEN(8) 0048.00 DCL VAR(&TOYMD) TYPE(*CHAR) LEN(8) 0049.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0050.00 0051.00 /*( 環境の取得 )*/ 0052.00 RTVJOBA TYPE(&TYPE) DATE(&DATE) 0053.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0054.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0055.00 ENDDO /* バッチ */ 0056.00 ELSE CMD(DO) /* 対話式 */ 0057.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0058.00 ENDDO /* 対話式 */ 0059.00 0060.00 /* ************************************************ */ 0061.00 /* 返信パラメータの作成 */ 0062.00 /* ************************************************ */ 0063.00 CHGVAR VAR(&YY) VALUE(%SST(&DATE 01 02)) 0064.00 CHGVAR VAR(&MM) VALUE(%SST(&DATE 03 02)) 0065.00 CHGVAR VAR(&DD) VALUE(%SST(&DATE 05 02)) 0066.00 CHGVAR VAR(&CYY) VALUE('20' *CAT &YY) 0067.00 /*( 開始日 )*/ 0068.00 CHGVAR VAR(&FROMYMD) VALUE(&CYY *CAT &MM *CAT + 0069.00 '01') 0070.00 CHGVAR VAR(&URFROM) VALUE(&URFROM *TCAT &FROMYMD + 0071.00 *TCAT ') ') 0072.00 /*( 終了日 )*/ 0073.00 SELECT 0074.00 WHEN COND(&MM = '01') THEN(DO) 0075.00 CHGVAR VAR(&DD) VALUE('31') 0076.00 ENDDO 0077.00 WHEN COND(&MM = '02') THEN(DO) 0078.00 CHGVAR VAR(&DD) VALUE('28') 0079.00 ENDDO 0080.00 WHEN COND(&MM = '03') THEN(DO) 0081.00 CHGVAR VAR(&DD) VALUE('31') 0082.00 ENDDO 0083.00 WHEN COND(&MM = '04') THEN(DO) 0084.00 CHGVAR VAR(&DD) VALUE('30') 0085.00 ENDDO 0086.00 WHEN COND(&MM = '05') THEN(DO) 0087.00 CHGVAR VAR(&DD) VALUE('31') 0088.00 ENDDO 0089.00 WHEN COND(&MM = '06') THEN(DO) 0090.00 CHGVAR VAR(&DD) VALUE('30') 0091.00 ENDDO 0092.00 WHEN COND(&MM = '07') THEN(DO) 0093.00 CHGVAR VAR(&DD) VALUE('31') 0094.00 ENDDO 0095.00 WHEN COND(&MM = '08') THEN(DO) 0096.00 CHGVAR VAR(&DD) VALUE('31') 0097.00 ENDDO 0098.00 WHEN COND(&MM = '09') THEN(DO) 0099.00 CHGVAR VAR(&DD) VALUE('30') 0100.00 ENDDO 0101.00 WHEN COND(&MM = '10') THEN(DO) 0102.00 CHGVAR VAR(&DD) VALUE('31') 0103.00 ENDDO 0104.00 WHEN COND(&MM = '11') THEN(DO) 0105.00 CHGVAR VAR(&DD) VALUE('30') 0106.00 ENDDO 0107.00 WHEN COND(&MM = '12') THEN(DO) 0108.00 CHGVAR VAR(&DD) VALUE('31') 0109.00 ENDDO 0110.00 ENDSELECT 0111.00 CHGVAR VAR(&TOYMD) VALUE(&CYY *CAT &MM *CAT &DD) 0112.00 CHGVAR VAR(&URTO) VALUE(&URTO *TCAT &TOYMD *TCAT ')') 0113.00 /* ************************************************ */ 0114.00 /* 返信ストリングの作成 */ 0115.00 /* ************************************************ */ 0116.00 CHGVAR VAR(&STRING) VALUE(&BIN2) /* 長さ */ 0117.00 CHGVAR VAR(&STRING) VALUE(&STRING *TCAT &URFROM) 0118.00 CHGVAR VAR(&STRING) VALUE(&STRING *TCAT &URTO) 0119.00 RETURN 0120.00 0121.00 ERROR: /*( エラーがあったときは CPF0011 を *ESCAPE で戻す )*/ 0122.00 RCVMSG RMV(*NO) MSG(&MSG) 0123.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0124.00 SNDPGMMSG MSGID(CPF0011) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 0125.00 ENDPGM
[解説]
プロンプト一時変更プログラムが受取るパラメータは常に一定であって
0001.00 PGM PARM(&CMDNAME &STRING) : 0009.00 DCL VAR(&CMDNAME) TYPE(*CHAR) LEN(20) 0010.00 DCL VAR(&STRING) TYPE(*CHAR) LEN(5700)
である。
この &STRING が戻すパラメータであるがこの中に
??URFROM(20200401) ??URTO(20200430)
のように値を入れて戻せばよい。
この結果は次のような画面になる。
売上明細表 (URIAGE) 選択項目を入力して,実行キーを押してください。 売上年月日から . . . . . . . . 20200401 数値 まで . . . . . . . . 20200430 数値 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
…このようにプロンプト一時変更プログラム(PMTOVRPGM)はコマンドの初期値を
自由に設定することができる。