コマンドの妥当性検査プログラムというのはコマンドでユーザーが入力した値が
正しいかどうかの妥当性検査を行うプログラムである。
最初に妥当性検査プログラムの使用例を示すと妥当性検査プログラムの
有用性を臨沂して頂けると思う。
印刷の出力 (OUTPUT) 選択項目を入力して,実行キーを押してください。 担当者コード . . . . . . . . . 名前,リストは F4 出力オプション . . . . . . . . *PRINT *PRINT, *OUTFILE 終り F3= 終了 F4=プロンプト F5= 最新表示 F12= 取り消し F13= この画面の使用法 F24= キーの続き
[解説]
これは印刷の出力を指示する画面をコマンドで作成した例である。
このコマンドで入力する「担当者コード」が正しいかどうかを
妥当性検査プログラムでチッェクするものとする。
[コマンド: OUTPUT]
ソースはこちらから
0001.00 CMD PROMPT(' 印刷の出力 ') VLDCKR(QUATTRO/OUTCHK) 0002.00 PARM KWD(TANCOD) TYPE(*CHAR) LEN(4) MIN(1) + 0003.00 CHOICE(*PGM) CHOICEPGM(QUATTRO/OUTCHO) + 0004.00 PROMPT(' 担当者コード ') 0005.00 PARM KWD(OPTION) TYPE(*CHAR) LEN(10) RSTD(*YES) + 0006.00 DFT(*PRINT) VALUES(*PRINT *OUTFILE) + 0007.00 PROMPT(' 出力オプション ')
[コンパイル]
妥当性検査プログラムは CMDで VLDCKR(QUATTRO/OUTCHK)として示されているので
コンパイルで指定する必要はない。
CRTCMD OBJLIB/OUTPUT PGM(OBJLIB/OUTPUTCL) SRCFILE(SRCLIB/QCMDSRC( AUT(*ALL)
[ 妥当性検査プログラム OUTCHK ]
ソースはこちらから
0001.00 PGM PARM(&TANCOD &OPTION) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* OUTCHK : コマンドの妥当性検査プログラム VLDCKR */ 0004.00 /* */ 0005.00 /* 2020/04/11 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&TANCOD) TYPE(*CHAR) LEN(4) 0008.00 DCL VAR(&OPTION) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&DEV) TYPE(*CHAR) LEN(10) 0010.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0011.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0012.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0013.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0014.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0015.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0016.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0017.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0018.00 VALUE('*ESCAPE ') 0019.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0020.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0021.00 VALUE(X'00000000') 0022.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0023.00 0024.00 /*( 環境の取得 )*/ 0025.00 RTVJOBA TYPE(&TYPE) 0026.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0027.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0028.00 ENDDO /* バッチ */ 0029.00 ELSE CMD(DO) /* 対話式 */ 0030.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0031.00 ENDDO /* 対話式 */ 0032.00 0033.00 /*( 入力パラメータの検査 )*/ 0034.00 IF COND(&TANCOD *EQ ' ') THEN(DO) 0035.00 CHGVAR VAR(&MSG) + 0036.00 VALUE(' 担当者コードが入力されていません。 ') 0037.00 GOTO SNDMSG 0038.00 ENDDO 0039.00 0040.00 /*( プログラムの実行 )*/ 0041.00 IF COND((&TANCOD *EQ '0001') *OR (&TANCOD *EQ + 0042.00 '0002') *OR (&TANCOD *EQ '0003')) THEN(DO) 0043.00 RETURN 0044.00 ENDDO 0045.00 ELSE CMD(DO) 0046.00 CHGVAR VAR(&MSG) VALUE(' 担当者コード ' *CAT + 0047.00 &TANCOD *TCAT ' の誤りです。 ') 0048.00 GOTO SNDMSG 0049.00 ENDDO 0050.00 0051.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0052.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0053.00 MSGFLIB(&MSGFLIB) 0054.00 SNDMSG: CHGVAR VAR(&MSGDTA) VALUE('0000' *CAT &MSG) 0055.00 /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/ 0056.00 SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 0057.00 MSGTYPE(*DIAG) 0058.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0059.00 /*( 妥当性検査のエラーは CPF0002 を戻します )*/ 0060.00 SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 0061.00 ENDPGM
[解説]
妥当性検査プログラムへ渡されるパラメータはコマンドを処理するプログラムに渡されるパラメータと
同じものが同じ個数の分だけ渡される。
0001.00 PGM PARM(&TANCOD &OPTION)
それらの受取ったパラメータを使って自由にチェックして問題がなく正しければ
ただ RETURN するだけでよい。
0041.00 IF COND((&TANCOD *EQ '0001') *OR (&TANCOD *EQ + 0042.00 '0002') *OR (&TANCOD *EQ '0003')) THEN(DO) 0043.00 RETURN 0044.00 ENDDO
エラーがあれば最初に CPD0006 を戻して続けて CPF0002 を戻すように決められているので
それに従えばよい。
0054.00 SNDMSG: CHGVAR VAR(&MSGDTA) VALUE('0000' *CAT &MSG) 0055.00 /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/ 0056.00 SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 0057.00 MSGTYPE(*DIAG) 0058.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0059.00 /*( 妥当性検査のエラーは CPF0002 を戻します )*/ 0060.00 SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 0061.00 ENDPGM
上記の妥当性検査プログラムをテンプレートにしたものが
次に紹介する AA5_SAMPLE である。
[妥当性検査プログラム: AA5_SAMPLE ]
ソースはこちらから
0001.00 PGM PARM(&DEV &IPADDR &PDT &SMBLOGIN &PRINTER + 0002.00 &LPRLOGIN &OUTQQLIB &MSGQQLIB &OPTION + 0003.00 &OUTIFS &PAGESIZEP &FONTINFOP &DRAWER + 0004.00 &DUPLEX &COPIES &CODEPAGE &TEXT &AUT + 0005.00 &ERRMSG) 0006.00 /*-------------------------------------------------------------------*/ 0007.00 /* AA5_SAMPLE: コマンドの妥当性検査プログラム VLDCKR */ 0008.00 /* */ 0009.00 /* 2019/12/13 作成 */ 0010.00 /*-------------------------------------------------------------------*/ 0011.00 DCL VAR(&DEV) TYPE(*CHAR) LEN(10) 0012.00 DCL VAR(&IPADDR) TYPE(*CHAR) LEN(15) 0013.00 DCL VAR(&PDT) TYPE(*CHAR) LEN(32) 0014.00 DCL VAR(&SMBLOGIN) TYPE(*CHAR) LEN(128) 0015.00 DCL VAR(&PRINTER) TYPE(*CHAR) LEN(32) 0016.00 DCL VAR(&LPRLOGIN) TYPE(*CHAR) LEN(64) 0017.00 DCL VAR(&OUTQQLIB) TYPE(*CHAR) LEN(20) 0018.00 DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10) 0019.00 DCL VAR(&OUTLIB) TYPE(*CHAR) LEN(10) 0020.00 DCL VAR(&MSGQWLIB) TYPE(*CHAR) LEN(20) 0021.00 DCL VAR(&MSGQQLIB) TYPE(*CHAR) LEN(20) 0022.00 DCL VAR(&MSGQ) TYPE(*CHAR) LEN(10) 0023.00 DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10) 0024.00 DCL VAR(&OPTION) TYPE(*CHAR) LEN(6) 0025.00 DCL VAR(&OUTIFS) TYPE(*CHAR) LEN(128) 0026.00 DCL VAR(&PAGESIZEP) TYPE(*CHAR) LEN(19) 0027.00 DCL VAR(&PAGESIZE) TYPE(*CHAR) LEN(17) 0028.00 DCL VAR(&FONTINFOP) TYPE(*CHAR) LEN(18) 0029.00 DCL VAR(&FONTINFO) TYPE(*CHAR) LEN(16) 0030.00 DCL VAR(&DRAWER) TYPE(*CHAR) LEN(2) 0031.00 DCL VAR(&DUPLEX) TYPE(*CHAR) LEN(1) 0032.00 DCL VAR(&COPIES) TYPE(*CHAR) LEN(2) 0033.00 DCL VAR(&CODEPAGE) TYPE(*CHAR) LEN(5) 0034.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) 0035.00 DCL VAR(&AUT) TYPE(*CHAR) LEN(10) 0036.00 DCL VAR(&ERRMSG) TYPE(*CHAR) LEN(4) 0037.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0038.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0039.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0040.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0041.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0042.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0043.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0044.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0045.00 VALUE('*ESCAPE ') 0046.00 DCL VAR(&ERR) TYPE(*CHAR) LEN(1) 0047.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0048.00 VALUE(X'00000000') 0049.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0050.00 0051.00 /*( 環境の取得 )*/ 0052.00 RTVJOBA TYPE(&TYPE) 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 IF COND(&PRINTER *EQ ' ') THEN(DO) 0062.00 CHGVAR VAR(&MSG) + 0063.00 VALUE(' プリンター名が入力されていません。 ') 0064.00 GOTO SNDMSG 0065.00 ENDDO 0066.00 0067.00 /*( プログラムの実行 )*/ 0068.00 CALL PGM(MYPGM) PARM(&ERR &MSG) 0069.00 IF COND(&ERR *EQ ' ') THEN(DO) 0070.00 CHGVAR VAR(&MSGTYPE) VALUE('*DIAG ') 0071.00 ENDDO 0072.00 IF COND(&MSG *NE ' ') THEN(DO) 0073.00 GOTO SNDMSG 0074.00 ENDDO 0075.00 0076.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0077.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0078.00 MSGFLIB(&MSGFLIB) 0079.00 SNDMSG: CHGVAR VAR(&MSGDTA) VALUE('0000' *CAT &MSG) 0080.00 /*( 妥当性検査のエラーは最初に CPD0006 を戻します )*/ 0081.00 SNDPGMMSG MSGID(CPD0006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) + 0082.00 MSGTYPE(*DIAG) 0083.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0084.00 /*( 妥当性検査のエラーは CPF0002 を戻します )*/ 0085.00 SNDPGMMSG MSGID(CPF0002) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) 0086.00 ENDPGM