とあるSEの色々ブログ

プログラミングで全ての人を幸せに。プログラミングとITと転職と雑記と備忘録

未分類

【RPGLE】プロシージャ作成

投稿日:

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から特に指定もせず行うことが出来るので非常に便利です。
少しずつ記事にしていきますので、少しでも参考になればと思います。

-未分類

執筆者:


  1. 太城 義雄 より:

    還暦過ぎて転職し、新職場でRPG4を習得し始めたエンジニアです。
    RPG3では30年以上プログラミングをしてきましたので、同じような機能はもちろん、フリーフォームでの利用もできるようになりました。
    ただ、外部プログラムやプロシージャコールについてはさっぱりわからず、ネットを探していると貴方のブログに到達し、これだっ!って感じで大変助かりました。
    ありがとうございます。

    • harus.blog より:

      お役に立てて何よりです。
      管理が滞っておりまして、本日コメントを頂いていたことに気が付きました。すいません。。

      少しずつ記事を書いていこうと思います。
      コメントありがとうございました。

comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

no image

VSCODEでファイル保存時の自動アップロード

ローカル環境で開発時に、毎回サーバーへファイルをアップロードするのは大変ですよね。フォルダ構成が複雑になってきたりプロジェクトが増えて来たりすると操作ミスの可能性も出てきます。そういう場合に便利な自動 …

no image

初めまして

祝!初wordpress! 昔々に、アメブロやら、mixi日記やら、ヤフーの日記とか無料のサービスででブログを書いてたことはあるけど、こんなに本格的なブログは初めてです。 とある会社でSEをやってます …

no image

【RPG4】%KDS

RPG4から追加された関数を紹介します。%KDS() これはKLISTに代わるもので、フリーフォーマットでのみ使用可能です。特定の関数で使用可能で、キー指定にDSを引用できる命令です。IBMは、RPG …

no image

Hello world!

WordPress へようこそ。こちらは最初の投稿です。編集または削除し、コンテンツ作成を始めてください。