AA4_SAMPLE はプロンプト一時変更プログラム ( 初期設定 )であり
コマンドの初期値をセットするプログラムである。
コマンドを作成するときにプロンプト一時変更プログラム(PMTOVRPGM)として
指定されるプログラムである。
条件によってコマンド・パラメータの初期値を変更したい場合がある。
そのようなときにパラメータの初期値をこのプログラムで
作ってしまうことができる。
コマンド・パラメータを変更する原理は簡単で
返信パラメータで FILE(xxxx のようにパラメータ文字列を作って
コマンドに戻してやればよいだけである。
[プロンプト一時変更プログラム ( 初期設定 ) AA4_SAMPLE ]
ソースはこちらから
0001.00 PGM PARM(&CMDNAME &STRING) 0002.00 /*------------------------------------------------------------------------*/ 0003.00 /* AA4_SAMPLE : プロンプト一時変更プログラム */ 0004.00 /* -- このプログラムはコマンドの初期値を設定します。 */ 0005.00 /* &STRING に長さとパラメータの初期値を戻します。 */ 0006.00 /* */ 0007.00 /* 2019/12/01 作成 */ 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(&DEV) TYPE(*CHAR) LEN(40) + 0036.00 VALUE(' ??DEV(') 0037.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0038.00 0039.00 /*( 環境の取得 )*/ 0040.00 RTVJOBA TYPE(&TYPE) 0041.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0042.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0043.00 ENDDO /* バッチ */ 0044.00 ELSE CMD(DO) /* 対話式 */ 0045.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0046.00 ENDDO /* 対話式 */ 0047.00 0048.00 /* ************************************************ */ 0049.00 /* 返信パラメータの作成 */ 0050.00 /* ************************************************ */ 0051.00 CHGVAR VAR(&DEV) VALUE(&DEV *TCAT &WTR *TCAT ')') 0052.00 /* ************************************************ */ 0053.00 /* 返信ストリングの作成 */ 0054.00 /* ************************************************ */ 0055.00 CHGVAR VAR(&STRING) VALUE(&BIN2) /* 長さ */ 0056.00 CHGVAR VAR(&STRING) VALUE(&STRING *TCAT &DEV) 0057.00 RETURN 0058.00 0059.00 ERROR: /*( エラーがあったときは CPF0011 を *ESCAPE で戻す )*/ 0060.00 RCVMSG RMV(*NO) MSG(&MSG) 0061.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0062.00 SNDPGMMSG MSGID(CPF0011) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 0063.00 ENDPGM
[解説]
パラメータ &CMDNAME はこのコマンドの名前が収められているだけのもの。
返信ストリング &STRING に変更したいパラメータの文字列を戻してやればよい。
ただし &STRING の先頭 2バイトはバイナリで後ろに続く文字列の長さを
入れる必要がある。
ここでは固定で 1024ばいととして後続に1024バイトの文字列が続くようにしている。
わかりやすくするために例を示す。
[売上明細表: URIAGE]
売上明細表 (URIAGE) 選択項目を入力して,実行キーを押してください。 売上年月日から . . . . . . . . 20200701 数値 まで . . . . . . . . 20200731 数値 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
[解説]
これは売上明細表を出力するためのコマンド・プロンプト画面である。
このコマンドを起動した日が 2020年7月27日(=小職の誕生日)であるので
7月1日~7月31日の期間が初期値としてセットされている。
8月に起動すればもちろん8月の日付として表示されるはずである。
このコマンドの初期値をセットしているのが URIINZ という名前のCLプログラムである。
最初にこのコマンド: URIAGE のソースを紹介すると
[コマンド: 売上明細表: 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(' まで ')
[コンパイル]
CRTCMD CMD(OBJLIB/URIAGE) PGM(OBJLIB/URIAGECL) SRCFILE(SRCLIB/QCMDSRC)
PMTOVRPGM(OBJLIB/URIINZ) AUT(*ALL)
として PMTOBRPGM に URIINZ を指定している。
[CLP : URIINZ プロンプト一時変更プログラム ]
ソースはこちらから
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
[解説]
今日の日付を
0052.00 RTVJOBA TYPE(&TYPE) DATE(&DATE)
で取得しておいて
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))
で年月日に分割して
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
によって返信ストリング &STRING に埋め込んで戻しているだけの簡単なものである。
エラーがあったときは IBM の取り決めによって
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)
のようにして CPF0011を戻すことになっている。