RPG

170. *PSSR でエラーが発生したステートメント行を調べるには ?

特殊サブ・ルーチン *PSSR は、モニター監視を行うためのユーザー定義のサブ・ルーチンであり、
*PSSR を定義しておけば、開発のときには予測できなかったエラーの発生を監視することができる。
*PSSR は古くから良く知られているので使用している人も多いと思うが、どのステートメント行で
エラーが発生したのかが不明であるので *PSSR の後処理やエラーの場所の特定に時間が
かかってしまったことはないだろうか ?
実は *PSSR としてのエラーが発生した場合でも、プログラム状況データ構造 ( SDS ) を調べれば
エラー行を特定することができるのである。

------------------------------------------------------------------------------
D*( プログラム状況データ構造 )     
D INFDSP         SDS               
D  PROC_NAM         *PROC          
D  ROUTINE          *ROUTINE       
D  LINE_NUM              21     28 
D  EXCP_TYPE             40     42 
D  EXCP_NUM              43     46 
D  PGM_LIB               81     90 
D  EXCP_DATA             91    170 
D  EXCP_ID              171    174 
D  PROC_PGM             334    343 
D  PROC_MOD             344    353 
D  USER                 254    263 
------------------------------------------------------------------------------
【 解説 】

上記はプログラム状況データ構造 ( SDS )の一部であるが、このうちの

D  LINE_NUM              21     28

が、エラーが発生したソースのステートメント行である。

D  PROC_PGM             334    343

がプログラム名であり、

D  PROC_MOD             344    353

がモジュール名である。

D  EXCP_TYPE             40     42

は、エラーのメッセージ・タイプである。
例えば、CPF9800 の「CPF」や MCH6801 の「MCH」の文字列が保管される。

D  EXCP_NUM              43     46

は、メッセージ番号である。
例えば、CPF9800 の「9800」や MCH6801 の「6801」の文字列が保管される。
従って、

D  MSGID                 40     46

として、まとめてメッセージ識別コードとして定義してもよいのであるが、
メッセージ・ファイルを特定するために、あえて分離して定義されているのであろうと推測される。

ここで IBM マニュアルには、詳細には解説されていない項目について補助解説を行う。

D  EXCP_ID              171    174

は、エラーを報告したメッセージを識別するための 4 桁のメッセージ参照コードである。
そして、

D  EXCP_DATA             91    170

は、このメッセージ項目に渡すメッセージ・データである。
API : QMHRCVPMRCVM0300 形式を使えば、上記のメッセージ参照コードによって
オリジナルのメッセージを受信して詳細を調べることができる。
また MSGIDEXCP_DATA を使って、元のメッセージを作成することもできる。
このようにして SDS によって *PSSR で発生したエラーの詳細を調べることができる。