ファイルのCCSID を調べるのは意外とやっかいである。
RTVFD というコマンドは存在していないのである。
またファイル API によって CCSID を取得することもできるのだがAPI を使い慣れている人であっても長々とあのファイル API を書くのはかなり大変な作業となってしまう。
ところが RPG の INFDS では簡単に CCSID を検索することができる。
そこでここでは RPG の INFDS を使って CCSID を検索するコマンド : RTVCCSID を紹介しよう。
CMD PROMPT(' ファィルの CCSID の検索 ')
PARM KWD(FILE) TYPE(FILE) +
PROMPT(' ファイル ')
FILE: QUAL TYPE(*NAME) LEN(10)
QUAL TYPE(*CHAR) LEN(10) DFT(*LIBL) +
PROMPT(' ライブラリー ')
PARM KWD(CCSID) TYPE(*DEC) LEN(5 0) RTNVAL(*YES) +
PROMPT(' CCSID ')
CRTCMD CMD(MYLIB/RTVCCSID) PGM(MYLIB/RTVCCSIDCL) SRCFILE(MYSRCLIB/QCMDSRC) ALLOW(*BPGM *IPGM) AUT(*ALL)
PGM PARM(&FILFILLIB &CCSID)
/*---------------------------------------------------------*/
/* RTVCCSID : ファィルの CCSID の検索 */
/*---------------------------------------------------------*/
DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
DCL VAR(&FILFILLIB) TYPE(*CHAR) LEN(20)
DCL VAR(&FILE) TYPE(*CHAR) LEN(10)
DCL VAR(&FILLIB) TYPE(*CHAR) LEN(10)
DCL VAR(&CCSID) TYPE(*DEC) LEN(5 0)
DCL VAR(&ADDPFM) TYPE(*CHAR) LEN(1) VALUE('0')
CHGVAR VAR(&FILE) VALUE(%SST(&FILFILLIB 01 10))
CHGVAR VAR(&FILLIB) VALUE(%SST(&FILFILLIB 11 10))
CHKOBJ OBJ(&FILLIB/&FILE) OBJTYPE(*FILE) MBR(*FIRST)
MONMSG MSGID(CPF9800) EXEC(DO)
ADDPFM FILE(&FILLIB/&FILE) MBR(DMY)
CHGVAR VAR(&ADDPFM) VALUE('1')
ENDDO
OVRDBF FILE(FILE) TOFILE(&FILLIB/&FILE) +
SECURE(*YES) OVRSCOPE(*JOB)
CALL PGM(ASNET.COM/RTVCCSID) PARM(&CCSID)
DLTOVR FILE(FILE) LVL(*JOB)
IF COND(&ADDPFM *EQ '1') THEN(DO)
RMVM FILE(&FILLIB/&FILE) MBR(DMY)
ENDDO
RETURN
ERROR: RCVMSG RMV(*NO) MSG(&MSG)
SNDMSG: SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
ENDPGM
CRTCLPGM PGM(MYLIB/RTVCCSIDCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)
H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2007-')
F********** ファィルの CCSID の検索 **********************************
FFILE IF F 9999 DISK
F INFDS(INFDS)
F**********************************************************************
D INFDS DS
D CCSID# 218 219I 0
IFILE AA 10
I 1 9999 DATA
C*----------------------------------------------------+
C *ENTRY PLIST
C PARM CCSID 5 0
C*----------------------------------------------------+
C CCSID# IFEQ -1
C Z-ADD 65535 CCSID
C ELSE
C Z-ADD CCSID# CCSID
C END
C SETON LR
C RETURN
C READ FILE 50
C END TAG
CRTBNDRPG PGM(MYLIB/RTVCCSID) SRCFILE(MYSRCLIB/QRPGLESRC) AUT(*ALL)
コマンド RTVCCSID は検索された結果としての CCSID を CCSID パラメータ( *DEC 5,0 )に
戻すのでコマンドのコンパイルも *BPGM *IPGM としてバッチ用としてコンパイルしている。
CLP の中ではンバーがひとつも存在していないファイルであっても検査ができるように一時的に
DMY というメンバーを追加して RPG * RTVCCSID によって検査後に除去している。