MOVEA は配列全体の値を単一フィールドに移したり
またはその逆で単一フィールドの値を配列全体に移したりする
非常に便利な演算命令であり使用頻度も高い。
例えば
C MOVEA ARRY FIELDA C MOVEA FIELDB ARRY
というような使い方をしていてこれは読者もよくご存知のはずである。
これをフリー・フォーマットで書くとどうなるか?
IBM RPG解説書に組込み関数: %SUBARR を使えと書かれているが
使用例には配列から配列へのMOVEの例しかなく
配列とフィールドのあいだの演算についての解説がない。
実はMOVEA の配列とフィールドのあいだの演算を実行する
フリー・フォーマットの命令は存在していない。
つまりないのである。
解決方法としてはフリー・フォーマットの途中で固定記述方式を
挿入するしかない。
: /END-FREE C MOVEA ARRAY FIELDA /FREE :
のような記述となる。
さてここからであるが実はこの/END-FREE や /FREE はなくてもよい。
: C MOVEA ARRY FIELDA :
のようにしてフリー・フォーマットのあいだに突然として
固定記述を挟んでもかまわない。
もっと言えば最初の /FREE や再以後の /END-FREEすら省略しても
かまわない。ただしこれは i5/OS Ver7.1 以上で有効である。
すると次のような記述を行うことができる。
[サンプルRPG: TESTMVA ]
ソースはこちらから
----------------------------------------------------------------------------------------------- 0001.00 H DFTNAME(TESTMVA) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** TESTOEF : フリー・フォーマットの MOVEA ******************* 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 * CRTRPGMOD OBJ(QTEMP/TESTMVA) SRCFILE(R610SRC/QRPGLESRC) 0007.00 * DBGVIEW(*SOURCE) AUT(*ALL) 0008.00 * CRTPGM PGM(ASNET.COM/TESTMVA) MODULE(QTEMP/TESTMVA) ACTGRP(*NEW) 0009.00 * AUT(*ALL) 0010.00 0011.00 *-------------------------------------------------------------------* 0012.00 * 2022/01/04 : 作成 0013.00 *-------------------------------------------------------------------* 0014.00 *( 作業変数 ) 0015.00 D ARRY S 5A DIM(10) 0016.00 D WORK S 50A 0017.00 D ANS S 1A 0018.00 0019.00 ARRY = '12345'; 0020.00 C MOVEA ARRY WORK 0021.00 DSPLY WORK '' ANS; 0022.00 C SETON LR 0023.00 C RETURN
[解説]
ご覧のように/FREE-/END-FREEのないフリー・フォーマットの記述が出来上がる。
これには読者諸氏も驚いたかもしれない。
この/FREE-/END-FREEが省略可能であることは Ver7.1からサポートされるようになったが
もちろんIBM 解説書にはどこにもそんな記述はない。
AS400 TIP & Techniques が初めて公開するテクニックである。