Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


COPYを使用してRPG/COBOLでコードの重複を減らす方法

Cobos4i(SmartPad4i)ではバックエンド側の処理をRPGやCOBOLなどのIBMiプログラムで作成します。RPGやCOBOLプログラムではCOPYを使用することで、外部のソースコードを取り込みコンパイルすることが可能です。例えば、同じ処理を別プログラム内で使用する場合にはCOPYを使用してコードの重複を減らすことができます。本TipsではCOPYについてご紹介します。

COPYについて

RPGやCOBOLでCOPYを使用することで外部ソースファイルのメンバーをプログラムに組み込むことができます。
定数やプロトタイプ宣言を共通化したり、別のプログラムで同じロジックを記述する場合に活用可能です。

COPYではコンパイル時にメンバーの内容がソースコードに展開されるため、実行時に展開されているのではなく、コンパイル実施時点のソースが使用されます。
そのため、COPYで読み込んでいるソースを変更した場合には、プログラムを再度コンパイルする必要があります。

COPYの記述方法

例えば、各プログラムで共通のメニュー処理を定義する場合、RPGⅢプログラムでは以下例のようなロジックになります。

例) QRPGSRC(CPYMENU)

C* MENUBTN                                              
C           SPACTN    IFEQ 'M1'                         
C                     MOVEL'APP01'   @NEXT     P        
C                     GOTO ENDPGM                       
C                     ENDIF                             
C           SPACTN    IFEQ 'M2'                         
C                     MOVEL'APP02'   @NEXT     P        
C                     GOTO ENDPGM                       
C                     ENDIF                             
C           SPACTN    IFEQ 'M3'                         
C                     MOVEL'APP03'   @NEXT     P        
C                     GOTO ENDPGM                       
C                     ENDIF                             
C           SPACTN    IFEQ 'M4'                         
C                     MOVEL'APP04'   @NEXT     P        
C                     GOTO ENDPGM                       
C                     ENDIF                             
C           SPACTN    IFEQ 'F3'                         
C                     MOVEL'1'       @END      P        
C                     GOTO ENDPGM                       
C                     ENDIF                             
C           SPACTN    IFEQ 'A1'                         
C                     GOTO T200                         
C                     ENDIF                             

別のRPGプログラムで共通の内容を記述する場合、COPYを使用することで記述の重複を減らすことができます。

RPGⅢ – RPGLE

RPGでのCOPYは以下のような構文になります。
ライブラリ名はライブラリリストに含めてコンパイルすることで省略可能です。

* MENU                                    
/COPY ライブラリ名/ファイル名,メンバー名            

RPGⅢでQRPGSRCファイルのCPYMENUメンバーを読み込む場合は以下のような記述になります。

 * MENU                                       
 /COPY QRPGSRC,CPYMENU                        

ライブラリを指定して記述することもできます。

* MENU                                    
/COPY TIPS2511/QRPGSRC,CPYMENU            

コンパイルを実行してスプールを確認すると、ソースが展開されていることが確認できます。

FreeFormRPG

FreeFormRPGの場合はCOPYに記述方法のほかにINCLUDEを使用することができます。
COPYとINCLUDEはコンパイラの扱いがことなり。
SQLRPGLEでINCLUDEを使用するプログラムを作成する場合は、RPGPPOPT(*LVL2) を設定してコンパイルをする必要があります。

・/COPY または /INCLUDE
https://www.ibm.com/docs/ja/i/7.5.0?topic=directives-copy-include

COPY

//MENU                   
/COPY QRPGLESRC,CPYMENU  

INCLUDE

//MENU                                
/INCLUDE QRPGLESRC,CPYMENU        

COBOL

COBOLプログラムにもCOPYが存在します。COBOLの場合には、COPYに続けてメンバー名を指定すると、ソースコードが格納されているファイル内のメンバーを使用できます。

  COPY  CPYMENU .               

異なるファイルにCOPYするメンバーを格納している場合はファイルを指定することも可能です。
 ※QCPYLBLSRCファイルのCPYMENUメンバーを読み込む

  COPY  CPYMENU OF QCPYLBLSRC .

ライブラリを指定する場合には ‐(ハイフン)で区切って定義します。

  COPY CPYMENU OF TIPS2511-QCPYLBLSRC.