Tools

36. CCSID を調べる RTVCCSID

ファイルの CCSID は DSPFD コマンドを実行すれば「コード化文字セット ID」として表示されるのは
良く知られているが、これをプログラムによって取得しようとすると結構大変である。
ファイルの CCSID は実は厳密にいうとフィールド毎に定義されているので QUSLFLD によって
調べる必要がある。
しかし、たかがファイルのCCSID を調べるだけでユーザー・スペースを作って(QUSCRTUS)レコード名を
調べて(QUSLRCD) さらにフィールド情報を調べる(QUSLFL) のは手間がかかりすぎである。
しかし RTVFD というコマンドは存在していない。
RTVCCSID のようなコマンドがないものかと探したらライブラリーの中に見つかったので
早速、利用したら正常に動作していたので、ここで紹介する。

【 コマンド : 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) を指定する必要がある。

【 実行CLP: RTVCCSIDCL 】
------------------------------------------------------------------------------------
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 プログラムであり、ソースは次のとおりである。

【 実行プログラム : RTVCCSID 】
---------------------------------------------------------------------------------------------------
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プログラム : RTVCCSIDINFDS で CCSID が取得できることを利用してそれを
パラメータ値として戻しているだけの簡単なプログラムである。
コンパイルは

CRTBNDRPG PGM(MYLIB/RTVCCSID) SRCFILE(MYSRCLIB/QRPGLESRC) AUT(*ALL)

である。
最後にコマンド RTVCCSID を利用するサンプルCLP として CLP: TESTCCSID を書きに紹介する。

【 サンプル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                                                      
---------------------------------------------------------------------------------