RPG

385. 文字に変換する%CHARの使い方

%DECに比べて文字に変換する%CHARは簡単でエラーも発生することはない。

[数字を文字に変換するTESTCHR2]

ソースはこちらから

0001.00 H DFTNAME(TESTCHR2) DATEDIT(*YMD/) BNDDIR('QC2LE')                 
0002.00 D ZONE6           S              6S 3 INZ(6.25)                    
0003.00 D PACK7           S              7P 2 INZ(7.48)                    
0004.00 D CHR10           S             10A                                
0005.00 D DSP40           S             40A                                
0006.00                                                                    
0007.00 C                   EVAL      CHR10 = %CHAR(ZONE6)                 
0008.00 C     'ZONE6='      CAT(P)    CHR10         DSP40                  
0009.00 C     DSP40         DSPLY                   ANS               1    
0010.00 C                   EVAL      CHR10 = %CHAR(PACK7)                 
0011.00 C     'PCCK7='      CAT(P)    CHR10         DSP40                  
0012.00 C     DSP40         DSPLY                   ANS               1    
0013.00 C                   SETON                                        LR
0014.00 C                   RETURN   


                                        

[解説]

ZONE10進数からでもバック数からでも%CHAR で文字列に変換することができる。
実行してみると

                プログラム・メッセージの表示

DSPLY  ZONE6=6.250  
*N                  
DSPLY  PCCK7=7.48   

  応答を入力して,実行キーを押してください 
    応答 . . .                             
                                           
                                           
 F3= 終了    F12= 取消し                   

のように表示される。
%DEC は使用頻度があるのは理解できる人も多いと思うが %CHAR はどのような
目的で使用されるのだろうか?
それは文字列の結合などを目的とする場合である。

[文字列の結合を行う%CHARの使用: TESTCHR3 ]

ソースはこちらから

0001.00 H DFTNAME(TESTCHR3) DATEDIT(*YMD/) BNDDIR('QC2LE')                    
0002.00 D ZONE6           S              6S 3 INZ(6.25)                       
0003.00 D PACK7           S              7P 2 INZ(7.48)                       
0004.00 D CHR10           S             10A                                   
0005.00 D DSP40           S             40A                                   
0006.00                                                                       
0007.00 D INFDS_THIS     SDS                                                  
0008.00 D  RUN_DATE             276    281S 0                                 
0009.00                                                                       
0010.00  /FREE                                                                
0011.00    DSP40 = ' 今日は 20' + %SUBST(%CHAR(UDATE):1:2) + ' 年 ' +         
0012.00             %SUBST(%CHAR(UDATE):3:2) + ' 月 ' +                       
0013.00             %SUBST(%CHAR(UDATE):5:2) + ' 日です。 ';                  
0014.00  /END-FREE                                                            
0015.00 C     DSP40         DSPLY                   ANS               1       
0016.00 C                   SETON                                        LR   
0017.00 C                   RETURN    


                                        

[解説]

UDATE (6桁の数字)を%CHARで文字列に変換して年月日を取り出して表示している。
数字は +結合できないので%CHARで文字列に変換する必要がある。

                           プログラム・メッセージの表示

 DSPLY   今日は 2021 年 01 月 08 日です。

  応答を入力して,実行キーを押してください 
    応答 . . .                             
                                           
                                           
 F3= 終了    F12= 取消し

ご参考までに UDATE というのは今日の日付ではなく正しくはこのジョブの開始日付のことである。
もしこのジョブがサインオフされることなく2日間続けばUDATEは最初に開始された日付のままで
変わることはない。

正しい今日の日付は

0007.00 D INFDS_THIS     SDS                                                  
0008.00 D  RUN_DATE             276    281S 0  

で示されている RUN_DATE である。