RPG

386. ブランクを除去する%TRIM関数

いわゆるトリム関数というものは長年RPGには無かった。
文字列の結合に CAT 命令はあったのだが
ブランクを除去(=トリム)する関数はなかったのである。

しかし文字列の結合の処理が多くなると
トリム関数は必須となる。
特に右側のブランクを除去する%TRIMR は
文字列やメッセージを組み立てるときにはなくてはならない。

弊社のあるQRPGLESRCを検索したところ 88個の%TRIM関数の使用が
見つかった。
これほど使用頻度が高いということである。

例として入力パラメータに 
[ファイル名(10A)] + [ライブラリー名(10A)]=20桁

のパラメータを受け取って

CRTPF FILE(‘ライブラリー名’/’ファイル名’)

となる文字列を組み立てることが課題とする。
次のソースを見て欲しい。

[サンプルRPG: TESTTRIM2 ]

ソースはこちらから

0001.00 H DATEDIT(*YMD/) DFTNAME(TESTTRIM2)                                    
0002.00 F********** TRIM のテスト *********************************************
0003.00 F*                                                                     
0004.00 F**********************************************************************
0005.00 D VALUE           S             10A                                    
0006.00 D FILE            S             10A                                    
0007.00 D FILLIB          S             10A                                    
0008.00 D CMD             S             80A                                    
0009.00                                                                        
0010.00 C     *ENTRY        PLIST                                              
0011.00 C                   PARM                    FILFILLIB        20        
0012.00 C                   MOVEL(P)  FILFILLIB     FILE                       
0013.00 C                   MOVE      FILFILIB      FILLIB           10        
0014.00 C     'CRTPF FILE(' CAT(P)    FILLIB        CMD                        
0015.00 C                   CAT       FILLIB:0      CMD                        
0016.00 C                   CAT       '/':0         CMD                        
0017.00 C                   CAT       FILE:0        CMD                        
0018.00 C                   CAT       ')':0         CMD                        
0019.00  /FREE                                                                 
0020.00    CMD = 'CRTPF FILE(' + %TRIMR(%SUBST(FILLIB:11:10)) + '/' +          
0021.00            %TRIMR(%SUBST(FILLIB:1:10));                                
0022.00  /END-FREE                                                             
0023.00 C     VALUE         DSPLY                   ANS               1        
0024.00 C                   SETON                                        LR
0025.00 C                   RETURN     


                                     

[解説]

今までの伝統的なRPGの手法であれば

0012.00 C                   MOVEL(P)  FILFILLIB     FILE                       
0013.00 C                   MOVE      FILFILIB      FILLIB           10        
0014.00 C     'CRTPF FILE(' CAT(P)    FILLIB        CMD                        
0015.00 C                   CAT       FILLIB:0      CMD                        
0016.00 C                   CAT       '/':0         CMD                        
0017.00 C                   CAT       FILE:0        CMD                        
0018.00 C                   CAT       ')':0         CMD 

となる。演算が1ステップ毎に細かく行われているので非常にわかりにくい。
読み手は頭の中で想像しながら読んでいくしかない。
しかし %TRIMRを使ってフリー・フォーマットで書くと

0020.00    CMD = 'CRTPF FILE(' + %TRIMR(%SUBST(FILLIB:11:10)) + '/' +          
0021.00            %TRIMR(%SUBST(FILLIB:1:10));                                
0022.00  /END-FREE

と非常に短くて直感的にほかりやすいものとなる。
%TRIMRなどの組込み関数は %SUBSTなどの他の組込み関数と複合して
使用できるのも処理をまとめて書けるようにしている。

このように CATを使うより %TRIMを使うほうがわかりやすくなる。
RPGの進化を感じることができただろうか?