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 を学習する可能性はかなり低いのではないだろうか ?