いわゆるトリム関数というものは長年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の進化を感じることができただろうか?