RPG

424. MOVEA をフリー・フォーマットで書くと

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 が初めて公開するテクニックである。