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を戻すことになっている。
