RPG

393. 組み込み関数を使うIF文

ILE-RPGではIF文も進化していてこれまでは

     SURYO   IFGT *ZERO

のように演算項目 1と 2の両方を使って比較していたのだが
演算項目2 だけを使う IF文として

             IF   SURYO > 0

のように書くことができる。
このIF命令は組込み関数の記述もサポートしていて
今まではある文字フィールド : STRING の先頭の1文字が
* であるかどうか検査するには

             MOVEL STRING         FLD1   1
   FLD1      IFEQ  '*'
              :
             ENDIF

のように一旦別のフィールド: FLD1 に取り出してから
調べる必要があったが IF文を使うと

             IF    %SUBST(STRING:1:1) = '*'
              :
             ENDIF

のようにして一発で調べることができ、このほうが
直感的でわかりやすい記述になる。
しかし、それならばと

      %SUBST(STRING:1:1) IFEQ '*'

      '*'                IFEQ %SIBST(STRING:1:1)

という演算は仕様として許可されていない。

ところで

             IF    %SUBST(STRING:1:1) = '*'
              :
             ENDIF

と記述すると IF文の演算項目は演算項目2 + 3 の長さとなるので
長く使えるのだがそれでも長さが不足してしまう場合がある。

             IF    %TRIMR(%SUBST:STRING:1:10)) = NULL

など組込み関数を複合化したり特に QUALIFIED したDS(=データ・ストラクチャー)
を定義したりすると

             IF    %SUBST(FORMAT.INDCATOR:1:5) = '12345'

のような記述となると演算項目の入力欄が足りなくなってしまう。
そこで登場するのがフリー・フォーマットである。
フリー・フォーマットであれば

  /FREE
     IF %SUBST(FORMAT.INDCATOR:1:5) = '12345';
      :
     ENDIF;
  /END-FREE             
 

のように演算項目全体を使って記述することができるので
十分長いエリアを使うことができ、入力欄に困ることはない。

新しいIF文を使う場合でもやはりフリー・フォーマットが有効なようである。