RPG

428. 初回だけの *INZSR サブ・ルーチン

*INZSR という名前の特殊なサブ・ルーチンをご存知だろうか?
プログラマーがRPGプログラム・ソースの中で定義しても
定義しなくてもよいのだが定義すると最初の一回だけ
実行されるサブ・ルーチンである。
 
これは特にRPGサイクルでファイルを IP(=Input Primary) で

 FSHOHIN    IP   E           K DISK

のようにして読取る場合には最初のレコードを読取る直前に
*INZSR の内容が実行されるが次回以降は実行されない。
 
このルールに基づいて一般に最初だけ実行したいロジックを
*INZSR に記述している人は多いはずである。

C******************************************************
C     *INZSR        BEGSR                              
C******************************************************
C*  初期 サイクル のみの実行                               
     :
     :
C                   ENDSR

RPG はILE-RPG であってもコンパイル時には伝統的なRPGサイクルという
独自のルーチンが組み込まれてんぱいるされるのが常である。

ところがRPGでサービス・プログラム(*SRVPGM)を作成するときは

 H NOMAIN

と記述して RPGサイクルの組込みを否定して行わないようにする。
これはサービス・プログラム(*SRVPGM)のRPGでなくても
一般のRPGであってもRPGサイクルを使わないプログラムとするならば

 H NOMAIN

としておけばRPGサイクルが組み込まれないのでRPGオブジェクトのサイズを
小さくして初期の起動も素早くすることができる。(ただし理論上)

ところで先に紹介したようにILE-RPGのコンパイルを

 CRTBNDRPG OBJLIB/MYPGM SRCFILE(MYSRCLIB/QRPGLESRC)

のように活動化グループを正しく指定しないでコンパイルしてしまうと
1回目の実行では *INZSR の内容は実行されるが
2回目以降の実行では *INZSR は実行されないので
期待した動作とは異なった動きになってしまう。
正しいコンパイルの方法は

CRTBNDRPG PGM(OBJLIB/MYPGM) SRCFILE(MYSRCLIB/QRPGLESRC) DFTACTGRP(*NO)
ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)

として活動化グループには *NEW を指定しなければならない。
いかに正しくコンパイルすることが重要であるか
おわかり戴けるかと思う。
コンパイルの方法が間違っているとプログラムの挙動も変わってしまうのである。