RPG4でフリーフォーマットで処理を書くようになったら
次は共通処理を外部プロシージャとして流用出来るように作成しましょう。
ILERPG(RPGLE)という統合言語環境で、部品を組み合わせてプログラムを作成することが出来ます。
RPG3の時にはコンパイルしたプログラム1つ1つが実行プログラムですが
ILERPGではモジュールをコンパイルし、そのモジュールごとの紐づけ(バインド)を行い実行プログラムを作成します。
細かいことはさておき、共通処理はプロシージャーとして外部に出して
プログラムをシンプルに保つことが良いことだと思います。
ソースタイプについて
ソースのタイプはRPG4と同じく*RPGLEです。
コンパイル方法
コンパイルは「CRTRPGMOD」で行います。
(15→F4でコンパイル可能)
ヘッダーファイルと処理部
プロシージャを記述する際には、
プロトタイプ定義と、プロシージャインターフェース定義の2つが必要です。
外部定義のプロシージャの場合は、内部定義と同様に
1つのソース内でプロトタイプ定義、プロシージャインターフェースを書くことも可能ですが、その場合は、呼び出し側のプログラムでもプロトタイプを書く必要があります。
その手間を回避するために、プロトタイプ宣言と処理部分を分けて書くことをお勧めします。
プロトタイプ宣言は、様々なプロシージャの内容を
1つのソースにまとめて書くことが出来ます。
その宣言部を、呼び出し側は、COPY文で取り込む形になります。

1行目は、プロシージャ名 プロトタイプ宣言 戻り値の型と桁
2行目以降は、引数の型と桁を記載します。(引数名は空白で可)

プロシージャ名 B(プロシージャ開始) EXPORT(外部公開の意味)
プロシージャ名 PI(インターフェース宣言) 戻り値の型と桁
3行目以降~引数の名称と型と桁

これを書くことで、プロトタイプ宣言の記述は不要になります。
この例では、GET_VALUEなどのプロトタイプ宣言を
HEAD_PROCというソースにまとめて記述しています。
D GET_VALUE PR 3S 0
D 8S 0
D 1
D 2S 0
D 2S 0
D 2S 0
*
D GET_TEST PR N
D 2S 0
*
D SUM PR 5S 0
D 4S 0
D 4S 0
こんな感じでまとめて記述が可能です。
実際のソース(例)
H NOMAIN
*
FTESTFILE IF E K DISK USROPN
*
D RET S 3S 0
*
/COPY TESTLIB/QRPGSRC,HEAD_PROC
*
P GET_VALUE B EXPORT
D GET_VALUE PI 3S 0
D P@VALUE1 8S 0
D P@VALUE2 1
D P@VALUE3 2S 0
D P@VALUE4 2S 0
D P@VALUE5 2S 0
*
/FREE
OPEN TESTFILE;
//具体的な処理
CLOSE TESTFILE;
RETURN RET;
/END-FREE
P E
NO MAIN
H仕様書で、メインルーチンのないプログラムということを宣言します。
その後、F仕様書やD仕様書で、使用するファイルや変数・DS等を記述します。
COPY
COPY文でプロトタイプ宣言を取り込みます
P仕様書のB~Eまでがプロシージャの処理になります。
処理を行い、戻り値を返す場合はRETURN文で指定します。
EXPORT指定を行うことで、外部のプログラムからの呼び出しが可能です。
今回、外部プロシージャ作成について記載しましたが
プロシージャ作成だけでは、コンパイル時の手間が増えたりと
あまりメリットを感じることが少ないと思います。
外部プロシージャを作成
外部プロシージャをまとめてサービスプログラムを作成
サービスプログラムをバインドディレクトリに追加
呼び出し側プログラムのH仕様書に、上記バインドディレクトリを指定
ここまで進めると、呼び出し側プログラムのコンパイルは
14から特に指定もせず行うことが出来るので非常に便利です。
少しずつ記事にしていきますので、少しでも参考になればと思います。
還暦過ぎて転職し、新職場でRPG4を習得し始めたエンジニアです。
RPG3では30年以上プログラミングをしてきましたので、同じような機能はもちろん、フリーフォームでの利用もできるようになりました。
ただ、外部プログラムやプロシージャコールについてはさっぱりわからず、ネットを探していると貴方のブログに到達し、これだっ!って感じで大変助かりました。
ありがとうございます。
お役に立てて何よりです。
管理が滞っておりまして、本日コメントを頂いていたことに気が付きました。すいません。。
少しずつ記事を書いていこうと思います。
コメントありがとうございました。