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.