以前に「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 をバインドして
コンパイルする必要がある。
_