ファイルの CCSID は DSPFD
コマンドを実行すれば「コード化文字セット ID」として表示されるのは
良く知られているが、これをプログラムによって取得しようとすると結構大変である。
ファイルの CCSID は実は厳密にいうとフィールド毎に定義されているので QUSLFLD
によって
調べる必要がある。
しかし、たかがファイルのCCSID を調べるだけでユーザー・スペースを作って(QUSCRTUS
)レコード名を
調べて(QUSLRCD
) さらにフィールド情報を調べる(QUSLFL
) のは手間がかかりすぎである。
しかし RTVFD
というコマンドは存在していない。
RTVCCSID
のようなコマンドがないものかと探したらライブラリーの中に見つかったので
早速、利用したら正常に動作していたので、ここで紹介する。
---------------------------------------------------------------------------------- 0001.00 CMD PROMPT(' ファィルの CCSID の検索 ') 0002.00 PARM KWD(FILE) TYPE(FILE) + 0003.00 PROMPT(' ファイル ') 0004.00 FILE: QUAL TYPE(*NAME) LEN(10) 0005.00 QUAL TYPE(*CHAR) LEN(10) DFT(*LIBL) + 0006.00 PROMPT(' ライブラリー ') 0007.00 PARM KWD(CCSID) TYPE(*DEC) LEN(5 0) RTNVAL(*YES) + 0008.00 PROMPT(' CCSID ') ----------------------------------------------------------------------------------
コマンド RTVCCSID
は キー・ワード CCSID に 5桁小数0 の CCSID の値を戻すコマンドであるので
コンパイルは
CRTCMD CMD(MYLIB/RTVCCSID) PGM(MYLIB/RTVCCSIDCL) SRCFILE(MYSRCLIB/QCMDSRC) ALLOW(*BPGM *IPGM) AUT(*ALL)
のようにして実行環境はバッチであることを示す ALLOW(*BPGM *IPGM)
を指定する必要がある。
------------------------------------------------------------------------------------ 0001.00 PGM PARM(&FILFILLIB &CCSID) 0002.00 /*---------------------------------------------------------*/ 0003.00 /* RTVCCSID : ファィルの CCSID の検索 */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80) 0006.00 DCL VAR(&FILFILLIB) TYPE(*CHAR) LEN(20) 0007.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) 0008.00 DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10) 0009.00 DCL VAR(&CCSID) TYPE(*DEC) LEN(5 0) 0010.00 DCL VAR(&ADDPFM) TYPE(*CHAR) LEN(1) VALUE('0') 0011.00 0012.00 CHGVAR VAR(&FILE) VALUE(%SST(&FILFILLIB 01 10)) 0013.00 CHGVAR VAR(&FILLIB) VALUE(%SST(&FILFILLIB 11 10)) 0014.00 CHKOBJ OBJ(&FILLIB/&FILE) OBJTYPE(*FILE) MBR(*FIRST) 0015.00 MONMSG MSGID(CPF9800) EXEC(DO) 0016.00 ADDPFM FILE(&FILLIB/&FILE) MBR(DMY) 0017.00 CHGVAR VAR(&ADDPFM) VALUE('1') 0018.00 ENDDO 0019.00 OVRDBF FILE(FILE) TOFILE(&FILLIB/&FILE) + 0020.00 SECURE(*YES) OVRSCOPE(*JOB) 0021.00 CALL PGM(ASNET.COM/RTVCCSID) PARM(&CCSID) 0022.00 DLTOVR FILE(FILE) LVL(*JOB) 0023.00 IF COND(&ADDPFM *EQ '1') THEN(DO) 0024.00 RMVM FILE(&FILLIB/&FILE) MBR(DMY) 0025.00 ENDDO 0026.00 RETURN 0027.00 0028.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG) 0029.00 SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG) 0030.00 ENDPGM ------------------------------------------------------------------------------------
このCLP ではプログラム RTVCCSID
にパラメータとして &CCSID
を渡して結果の値を受け取っているだけである。
コンパイルは通常のCLP と同じであり、
CRTCLPGM PGM(MYLIB/RTVCCSIDCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
で十分である。
次にプログラム : RTVCCSID
は単なる RPG プログラムであり、ソースは次のとおりである。
--------------------------------------------------------------------------------------------------- 0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2007-') 0002.00 F********** ファィルの CCSID の検索 ********************************** 0003.00 FFILE IF F 9999 DISK 0004.00 F INFDS(INFDS) 0005.00 F********************************************************************** 0006.00 D INFDS DS 0007.00 D CCSID# 218 219I 0 0008.00 IFILE AA 10 0009.00 I 1 9999 DATA 0010.00 C*----------------------------------------------------+ 0011.00 C *ENTRY PLIST | 0012.00 C PARM CCSID 5 0 | *LIB/*OBJ 0013.00 C*----------------------------------------------------+ 0014.00 C CCSID# IFEQ -1 0015.00 C Z-ADD 65535 CCSID 0016.00 C ELSE 0017.00 C Z-ADD CCSID# CCSID 0018.00 C END 0019.00 C SETON LR 0020.00 C RETURN 0021.00 C READ FILE 50 0022.00 C END TAG ---------------------------------------------------------------------------------------------------
RPGプログラム : RTVCCSID
は INFDS
で CCSID が取得できることを利用してそれを
パラメータ値として戻しているだけの簡単なプログラムである。
コンパイルは
CRTBNDRPG PGM(MYLIB/RTVCCSID) SRCFILE(MYSRCLIB/QRPGLESRC) AUT(*ALL)
である。
最後にコマンド RTVCCSID
を利用するサンプルCLP として CLP: TESTCCSID
を書きに紹介する。
--------------------------------------------------------------------------------- 0001.00 PGM 0002.00 /*---------------------------------------------------------*/ 0003.00 /* TESTCCSID : CCSID を調べる */ 0004.00 /*---------------------------------------------------------*/ 0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0006.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0007.00 DCL VAR(&CCSID) TYPE(*DEC) LEN(5 0) 0008.00 DCL VAR(&CCSID_C) TYPE(*CHAR) LEN(5) 0009.00 0010.00 RTVJOBA TYPE(&TYPE) 0011.00 RTVCCSID FILE(QTRFIL/SHOHIN) CCSID(&CCSID) 0012.00 CHGVAR VAR(&CCSID_C) VALUE(&CCSID) 0013.00 SNDPGMMSG MSG('QTRFIL/SHOHIN の CCSID は ' *TCAT + 0014.00 &CCSID_C *TCAT ' です。 ') MSGTYPE(*COMP) 0015.00 ENDPGM ---------------------------------------------------------------------------------