すべてのCLPのテンプレートとなるサンプル・ソース AA1_SAMPLE を
以前に公開したがこれはその続きのなるCLPテンプレートのソースであり
AA1_SAMPLE は APIを呼び出して実行する用途に適しているのに対して
今回の AA2_SAMPLE はプログラムを呼び出すパターンである。
プログラムを呼び出して処理するだけなら CALL 命令だけで
済みそうに思えるのだが特別な処理を工夫しているので
その部分を注意してご覧頂きたい。
[AA2_SAMPLE:テンプレート・サンプルCLP]
ソースはこちらから
0001.00 PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* AA2_SAMPLE : テンプレート・サンプル CLP (PGM CALL) */
0004.00 /* */
0005.00 /* 2019/03/18 作成 */
0006.00 /*-------------------------------------------------------------------*/
0007.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0008.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
0009.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
0010.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
0011.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132)
0012.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0013.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)
0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0015.00 VALUE('*ESCAPE ')
0016.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1)
0017.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) +
0018.00 VALUE(X'00000000')
0019.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0020.00
0021.00 /*( 環境の取得 )*/
0022.00 RTVJOBA TYPE(&TYPE)
0023.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0024.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ')
0025.00 ENDDO /* バッチ */
0026.00 ELSE CMD(DO) /* 対話式 */
0027.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ')
0028.00 ENDDO /* 対話式 */
0029.00
0030.00 /*( 入力パラメータの検査 )*/
0031.00
0032.00 /*( プログラムの実行 )*/
0033.00 CALL PGM(MYPGM) PARM(&ERR &MSG)
0034.00 IF COND(&ERR *EQ ' ') THEN(DO)
0035.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0036.00 ENDDO
0037.00 IF COND(&MSG *NE ' ') THEN(DO)
0038.00 GOTO SNDMSG
0039.00 ENDDO
0040.00 RETURN
0041.00
0042.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +
0043.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +
0044.00 MSGFLIB(&MSGFLIB)
0045.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO)
0046.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0047.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)
0048.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0049.00 ENDDO
0050.00 ELSE CMD(DO)
0051.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
0052.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +
0053.00 MSGTYPE(&MSGTYPE)
0054.00 MONMSG MSGID(CPF2400) EXEC(RETURN)
0055.00 ENDDO
0056.00 ENDPGM
[解説]
特徴的であるのは
0032.00 /*( プログラムの実行 )*/
0033.00 CALL PGM(MYPGM) PARM(&ERR &MSG)
0034.00 IF COND(&ERR *EQ ' ') THEN(DO)
0035.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
0036.00 ENDDO
0037.00 IF COND(&MSG *NE ' ') THEN(DO)
0038.00 GOTO SNDMSG
0039.00 ENDDO
の部分でありプログラムはパラメータとして &ERR と &MSG を返すようにできている。
プログラム MYPGM でエラーがあった場合は &ERR に文字「E」を入れて
&MSG にエラーメッセージを戻すようにしている。
「完了しました」とような報告だけのメッセージの場合は
&MSG にはメッセージが入るが &ERR はブランクである。
このときメッセージ・タイプは初期で
0014.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +
0015.00 VALUE('*ESCAPE ')
としてエスケープ・メッセージとして定義されているので
0035.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ')
で変更してから
0037.00 IF COND(&MSG *NE ' ') THEN(DO) 0038.00 GOTO SNDMSG 0039.00 ENDDO
によってメッセージを出力するようにしている。
