以前に「25.RPGでストリーム・ファイルの存在を簡単にチェックするには?」というのを
紹介したが実際に製品内部で使われているCHKIFSというコマンドを
紹介する。
_
[コマンド: CHKIFS ]
ソースはこちらから
0001.00 CMD PROMPT('IFS 検査 ')
0002.00 PARM KWD(DIR) TYPE(*CHAR) LEN(256) CASE(*MIXED)
0003.00 PROMPT(' 登録簿 (/)')
[コンパイル]
CRTCMD OBJLIB/CHKIFS PGM(OBJLIB/CHKIFSCL) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
[ CLP : CHIFSCL ]
ソースはこちらから
0001.00 PGM PARM(&DIR)
0002.00 /*----------------------------------------------------------------*/
0003.00 /* CHKIFS : IFS ストリーム・ファイルの存在検査 */
0004.00 /* */
0005.00 /* SRCTYPE : CLLE */
0006.00 /* */
0007.00 /* CRTCLMOD QTEMP/CHKIFSCL SRCFILE(MYSRCLIB/QCLSRC) */
0008.00 /* AUT(*ALL) */
0009.00 /* CRTPGM MYLIB/CHKIFSCL MODULE(QTEMP/CHKIFSCL) */
0010.00 /* BNDSRVPGM(QSYS/QP0LLIB1) ACTGRP(*NEW) */
0011.00 /* AUT(*ALL) */
0012.00 /*----------------------------------------------------------------*/
0013.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132)
0014.00 DCL VAR(&DIR) TYPE(*CHAR) LEN(256)
0015.00 DCL VAR(&PATH) TYPE(*CHAR) LEN(256)
0016.00 DCL VAR(&PATH_PTR) TYPE(*PTR) ADDRESS(&PATH 0)
0017.00 DCL VAR(&RES) TYPE(*INT) LEN(4)
0018.00 DCL VAR(&RES_PTR) TYPE(*PTR) ADDRESS(&RES 0)
0019.00 DCL VAR(&TRUE) TYPE(*INT) VALUE(0)
0020.00 DCL VAR(&FALSE) TYPE(*INT) VALUE(-1)
0021.00 DCL VAR(&O_RDONLY) TYPE(*INT) LEN(4) VALUE(1)
0022.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
0023.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0024.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0025.00
0026.00 RTVJOBA TYPE(&TYPE)
0027.00 CHGVAR VAR(&PATH) VALUE(&DIR *TCAT &NULL)
0028.00 CALLPRC PRC('open') PARM((&PATH_PTR *BYVAL) +
0029.00 (&O_RDONLY *BYVAL) (*OMIT)) RTNVAL(&RES)
0030.00 IF COND(&RES *EQ &FALSE) THEN(DO)
0031.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) +
0032.00 MSGDTA(' ファイル ' *CAT &DIR *TCAT +
0033.00 ' が見つかりません。 ') MSGTYPE(*ESCAPE)
0034.00 ENDDO
0035.00 RETURN
0036.00
0037.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
0038.00 SNDMSG:
0039.00 IF COND(&TYPE *EQ '0') THEN(DO)
0040.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0041.00 ENDDO
0042.00 ELSE CMD(DO)
0043.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)
0044.00 ENDDO
0045.00 ENDPGM
[ソース・タイプ]
このCLPはOPMのCLPではなくILE-CLPであるのでソース・タイプはCLPではなく CLLE にしておくこと。
[コンパイル]
CRTCLMOD MODULE(QTEMP/CHKIFSCL) SRCFILE(R610SRC/QCLSRC) AUT(*ALL) DBGVIEW(*SOURCE)
CRTPGM PGM(OBJLIB/CHKIFSCL) MODULE(QTEMP/CHKIFSCL) BNDSRVPGM((QSYS/QP0LLIB1)) ACTGRP(*NEW) AUT(*ALL)
[解説]
CHKIFSは検査するIFSストリー・ファイルが存在していなければCPF9800をエラー・メッセージとして
呼出し元に戻す。
従って呼出し元では MONMSG CPF9800 で監視していれば存在を確かめることができる。
またCHKIFSCLはC言語の関数: open を使ってエラーを検査しているので
openというC言語関数をEXPORTしているサービス・プログラム : QSYS/QP0LLIB1 をバインドして
コンパイルする必要がある。
_
