RPG

118. プロシージャーのパラメータ値に値を戻すには ?

以前にも紹介しているがプロシージャーに渡すパラメータ値に値を戻したい場合がある。
例えば結果は成功/失敗を戻すだけで、結果の値はパラメータそのものに
入れて戻したい場合もある。
さらに複数個の結果が必要である場合はパラメータに入れて戻したいのは
当然かも知れない。

例えば次のプログラムがあったとする。

0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2006-')     
0002.00 F********** プロシージャーの呼び出しA ******************************** 
0003.00 D*( SETFLD  のプロトタイプ宣言 )                                        
0004.00 D SETFLD          PR                                                    
0005.00 D  FLD                          10A   Value                             
0006.00 D FIELD           S             10A   INZ                               
0007.00 C                   CALLP     SETFLD(FIELD)                      
0008.00 C     FIELD         DSPLY                   ANS               1         
0009.00 C                   SETON                                        LR     
0010.00 C                   RETURN                                              
0011.00  ********************************************************************** 
0012.00  *               SETFLD プロシージャーの定義                          * 
0013.00  ********************************************************************** 
0014.00 P SETFLD          B                   EXPORT                            
0015.00 D SETFLD          PI                                                    
0016.00 D   FLD                         10A   Value                             
0017.00 D FIELD           S             10A                        
0018.00 C                   MOVEL     'NV-CF1'      FIELD                       
0019.00 P SETFLD          E                                                     

プロシージャー SETFLD の中で MOVEL 'NV-CF1' FIELD を行っているので

結果の値の表示 : FIELD      DSPLY          ANS

によって NV-CF1 という値が表示されるかというと、そうではない。
パラメータ : FIELD の値がプロシージャーの中から戻されることはないからである。

それではこの問題をどのようにして解決すればよいのであろうか?
C言語のポインターに精通している人であれば気づくかもしれない。
ポインタが正しく理解されていれば難しい問題ではない。
プロシージャーで受け取ったパラメータが渡したパラメータと実体が
同じものであることにすればよいのである。
パラメータとしてフィールドそのものではなくフィールドのポインタを渡せば
メモリ空間上での同じものを受け取り側でも再現できるので、
渡す側と受け取る側は同じ実体を扱うことができるようになる。
つまりポインタをパラメータとして渡せばよいことになる。
これは ANS-C言語の場合と全く、同じ手法である。

それでは正解のソースを紹介しよう。
この例では DSPLY 命令で正しく「NV-CF1」の値が表示される。

0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OfficeQuattro Co,.Ltd Japan 2006-')     
0002.00 F********** プロシージャーの呼び出しB ******************************** 
0003.00 D*( SETFLD  のプロトタイプ宣言 )                                        
0004.00 D SETFLD          PR                                                    
0005.00 D  FLD                           *   Value                             
0006.00 D FIELD           S             10A   INZ                               
0007.00 C                   CALLP     SETFLD(%ADDR(FIELD))                      
0008.00 C     FIELD         DSPLY                   ANS               1         
0009.00 C                   SETON                                        LR     
0010.00 C                   RETURN                                              
0011.00  ********************************************************************** 
0012.00  *               SETFLD プロシージャーの定義                          * 
0013.00  ********************************************************************** 
0014.00 P SETFLD          B                   EXPORT                            
0015.00 D SETFLD          PI                                                    
0016.00 D   FLDPTR                        *   Value                             
0017.00 D FIELD           S             10A   BASED(FLDPTR)                     
0018.00 C                   MOVEL     'NV-CF1'      FIELD                       
0019.00 P SETFLD          E                                                     
【 解説 】

SETFLD では %ADDR(FIELD) として FIELD のポインタを渡している。
受け取り側では 受け取ったポインタ FLDPTR を基底とする FIELD
値を入れて戻している。