Tools

18. ファイルの CCSID を検索する RTVCCSID

ファイルのCCSID を調べるのは意外とやっかいである。
RTVFD というコマンドは存在していないのである。
またファイル API によって CCSID を取得することもできるのだがAPI を使い慣れている人であっても長々とあのファイル API を書くのはかなり大変な作業となってしまう。
ところが RPG の INFDS では簡単に CCSID を検索することができる。
そこでここでは RPG の INFDS を使って CCSID を検索するコマンド : RTVCCSID を紹介しよう。

【 CMDS : 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)
【 CLP : RTVCCSIDCL 】
             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)
【 RPG : RTVCCSID 】
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 によって検査後に除去している。