ファイルの 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
---------------------------------------------------------------------------------