RPG

252. フリー・フォーマットへの招待 (3)

RPG の MOVE または MOVEL 命令は実は非常に便利な命令である。
MOVE を使うとごく自然に直感的に
ある変数の値を別の変数の値として代入することができる。
代入するのであれば、フリー・フォーマットで MOVE または MOVEL は
= (イコール)と同等のように思えるのだが、ところがそうでもない。

■ 文字列の = は MOVEL(P) である

文字フィールドどうしの = は、旧来のRPG命令でいえば
MOVEL(P) に相当する機能を実行している。

ある TKNAME というフィールドに '北海道地方新聞社' という
情報が入っているとき、

      /FREE
            TKNAME = '東都産業';
      /END-FREE

を実行すると結果は TKNAME には '東都産業        ' という値となる。
つまり以前に入っていたフィールド値は消去されて代入値が左寄せで代入される。
これはまさしく MOVEL(P) と同じである。

■ 数字フィールドの = は Z-ADD である

数字フィールドどうしの = による演算は数学の表示と意味合いは同じであり
旧来のRPG命令でいえば Z-ADD と同じである。
( 数学の場合、当然 = は代入という意味は持たない。)

       /FREE
              SHTANK = 128000;
       /END-FREE

これは

              Z-ADD 128000   SHTANK

と同じである。

■ 数字フィールド/文字フィールドを = で代入はできない

それでは MOVE 命令で便利であったMOVEによる文字タイプの変換はどうだろうか ?

数字フィールド SURYO ( 4S0 )に 18 という値が入っているものとする。
このとき文字フィールド CHAR04 ( 4S0 )に対して

      MOVE SURYO    CHAR04

を実行すれば CHAR04 には '0018' という値が入る。
同じようにフリー・フォーマットで書くと

           CHAR04 = SURYO

で良いと思われるが残念ながら、これはできない。
コンパイラーのエラーによって拒否されてしまう。
つまりコンパイル・エラーとなるのである。異なるタイプのフィールドを =
代入演算をすることはできないのである。

であれば %CHAR という組み込み関数を使ってSURYOを文字に変換してから
代入するのであれば問題はないはずなので

          CHAR04 = %CHAR(SURYO)

とすることができる。
しかしこれは MOVE と同じ演算結果とはならない。
%CHAR(SURYO) は 0018 ではなく、 18 となってしまうため

CHAR04 には '18 ' という値が入ってしまう

のである。
これは %CHAR によって数字をどのように文字に変換するかという
IBM の見解の問題であろう。

これを解決するには

         CHAR04 = %EDITC(SURYO:'X')

と書くことで解決することができる。
つまり編集コード X によって編集した結果を CHAR04 に代入する、という演算に
するのである。
ANSI-Cであっても

         CHAR04 = sprintf("%04d", SURYO);

のようにして 数字 SURYO を 4桁表示したものを CHAR04 に代入するという
演算が一般的に使用されているのと同じことではある。
この方法が IBM マニュアルに記述がないのでフリー・フォーマットの
普及が難しいのではないだろうか ?

参考までに IBM はフリーフォーマットを C言語経験者にわかりやすいように、
とあるが C言語の開発経験者が RPG を学習する可能性はかなり低いのではないだろうか ?