プログラム状況データ構造

プログラム状況データ構造 (PSDS) を定義して、プログラム例外/エラー情報を RPG IV プログラムに対して使用可能にすることができます。PSDS はメイン・ソース・セクションに定義されていなければなりません。したがって、1 つのモジュールにつき PSDS は 1 つだけです。

データ構造は、データ構造ステートメントの 23 桁目の S によって PSDS として 定義されます。 PSDS には事前定義サブフィールドが含まれ、発生したプログラム例外/エラーに 関する情報が提供されます。 PSDS 内のサブフィールドの位置は、特殊なキーワードによってか、または事前に 定義された開始位置および終了位置によって定義されます。 サブフィールドにアクセスするためには、各サブフィールドに名前を割り当てま す。 キーワードは、26 から 39 桁目に左寄せして指定しなければなりません。

PSDS からの情報は、定様式ダンプによっても提供されます。 しかし、PSDS がコーディングされていなかったり、PSDS の長さにそれらのフィ ールドが含まれていなかった場合には、PSDS のフィールドに関する情報は定様式 ダンプに含まれていないことがあります。 たとえば、PSDS の長さが 275 バイト だけであった場合には、 時刻および日付または実行中のプログラムの情報 は 276 バイトから始まるため、それらの情報はダンプ に *N/A* (適用されません) として表示されることになります。 詳細については、DUMP (プログラム・ダンプ)を参照 してください。

ヒント

LR がオンによる呼び出しのパフォーマンスは、PSDS を指定しないか、 あるいは PSDS の 80 バイトより後に埋め込む一部の情報を入手するのに時 間を要するので、PSDS を 80 バイトより長くしないことによって大幅に改善され ます。

表 23 にデータ構造のサブフィールドのレイアウト、およびサブ フィールドの事前に定義された開始および終了位置が示されているので、これを 使用してこのデータ構造内の情報にアクセスすることができます。

表 23. プログラム状況データ構造の内容
開始位置
(26 から
32 桁目)
終了
(26 から
39 桁目)
 

形式
 

長さ
 

キーワード
 

情報
1 10 文字 10 *PROC メイン・プロシージャーがあればその名前。それがない場合には、メイン・ソース・セクショ ンと対応する名前。
11 15 ゾーン 10 進数 5、0 *STATUS 状況コード。 これらのコードの説明については、プログラム状況コードを参照してください。
16 20 ゾーン 10 進数 5、0 前の状況コード。
21 28 文字 8 RPG IV ソース・リスト行番号またはステートメント番号。ソース・リスト 行番号は、OPTION(*SRCSTMT) が OPTION(*NOSRCSTMT) の代わりに 指定されている場合、ソース・リスト・ステートメント番号に 置き換えられます。そのステートメント番号がルート・ソース・メンバーに適用される 場合、ステートメント番号全体が組み込まれます。 ステートメント番号が 6 桁を超える場合 (すなわち、ゼロ以外のソース ID を組み込んでいる場合)、8 バイト・フィードバック域の最初の 2 桁は、ステートメン ト番号の残りの部分が 354 から 355 桁目に保管されることを示す "+" になります。
29 36 文字 8 *ROUTINE 例外またはエラーが起こった RPG IV ルーチンの名前。このサブフィールドは RPG IV ルーチンの開始時点、または *STATUS サブフィールドがゼロ以外の値によって更新される場合にのみ、プログラム呼び出しの後に更新されます。次の名前によってルーチンが識別されます。
*INIT
プログラム初期化
*DETL
明細行
*GETIN
入力レコードの入手
*TOTC
合計演算
*TOTL
合計行
*DETC
明細演算
*OFL
オーバーフロー行
*TERM
プログラム終了
*ROUTINE
呼び出されたプログラムまたはプロシージャーの名前 (最初の 8 文字)
注:
通常の RPG IV サイクルを使用していない場合には、*ROUTINE は有効でありません。プログラムが通常の RPG IV サイクルからはみ出してしまうような論理では、*ROUTINE が正しい値を反映しない場合があります。
37 39 ゾーン 10 進数 3、0 *PARMS 呼び出し側プログラムからこのプログラムに渡されたパラメーターの数。この値は、%PARMS によって戻り値と同じです。 使用可能な情報がない場合には、-1 が戻されます。
40 42 文字 3 例外タイプ (オペレーティング・システムの例外の場合には CPF、またはマシン例外の場合には MCH)。
43 46 文字 4 例外番号。 CPF 例外の場合には、このフィールドには CPF メッセージ番号が 入れられます。 マシン例外の場合には、マシンの例外番号が入れられます。
47 50 文字 4 未使用。
51 80 文字 30 メッセージ用の作業域。 この区域は、ILE RPG コンパイラーが内部で使用するための専用区域です。情 報の編成は、常に一定であるとは限りません。 この区域は、ユーザーが表示する ことができます。
81 90 文字 10 プログラムが入っているライブラリーの名前。
91 170 文字 80 検索された例外データ。 位置 *STATUS に 09999 が入っている場合に、CPF メッ セージがこのサブフィールドに入れられます。
171 174 文字 4 通知される RNX9001 例外の原因となった例外の識別。
175 184 文字 10 ファイル操作が最後に行われたファイルの名前 (エラーが起こった場合にのみ 更新されます)。 この情報には、常に完全なファイル名が 含まれています。
185 190 文字 6 未使用。
191 198 文字 8 ジョブがシステムに入力された日付 (*DATE 形式)。バッチ・ジョブが夜間処理として 投入された場合、真夜中を過ぎた時間帯に実行 されるバッチ・ジョブは翌日の日付になります。 この値は、ジョブ日付から 導出され、年は 4 桁に拡張されます。 この値によって表される日付は、270 から 275 桁目で表される日付と同じ日付です。
199 200 ゾーン 10 進数 2,0 4 桁の年の先頭の 2 桁。*YEAR の先頭の 2 桁と同じ。このフィールド は、270 から 275 桁目の日付の世紀部分に適用されます。 たとえば、日付が 1999-06-27 の場合、UDATE は 990627 で、この世紀フィールド は 19 になります。 270 から 275 桁目の値とこのフィールドの値を合わせると、191 から 198 桁目にある値の 結合情報になります。
注:
この世紀フィールドは、276 から 281 桁目、または 288 から 293 桁目の 日付には適用されません。
201 208 文字 8 ファイル操作が最後に行われたファイルの名前 (エラーが起こった場合にのみ 更新されます)。 長いファイル名が使用されている場合、このファイル名は切り捨て られます。 長いファイル名の情報については、175 から 184 桁目を参照してください。
209 243 文字 35 最後に使用されたファイルの状況情報。この情報には、状況コード、RPG IV 命令コード、RPG IV ルーチン名、ソース・リスト行番号またはステートメント番号、およびレコード名が 含まれます。これはエラーが起こった場合にのみ更新されます。
注:
命令コード名は INFDS の *OPCODE と同じ形式になっています。
ソース・リスト 行番号は、OPTION(*SRCSTMT) が OPTION(*NOSRCSTMT) の代わりに 指定されている場合、ソース・リスト・ステートメント番号に 置き換えられます。そのステートメント番号がルート・ソース・メンバーに適用される 場合、ステートメント番号全体が組み込まれます。 ステートメント番号が 6 桁を超える場合 (すなわち、ゼロ以外 のソース ID を組み込んでいる場合)、8 バイト・フィードバック域の 最初の 2 桁は、ステートメント番号の残りの部分が 356 から 357 桁目に保管される ことを示す "+" になります。
244 253 文字 10 ジョブ名。
254 263 文字 10 ユーザー・プロファイルからのユーザー名。
264 269 ゾーン 10 進数 6、0 ジョブ番号。
270 275 ゾーン 10 進数 6、0 プログラムの実行がシステムで開始された日付 (UDATE 形式) (UDATE はこの 日付から導出されます)。UDATE の説明について は、ユーザー日付の特殊語を参照してください。これは、一般に「ジョブ日付」と 呼ばれています。 この値によって表される日付は、191 から 198 桁目で表される日付と同じ日付です。
276 281 ゾーン 10 進数 6、0 プログラム実行の日付 (UDATE 形式のシステム日付)。 この値の年の部分 が 40 から 99 の間の場合、この日付は 1940 から 1999 の間になります。 それ以外の場合、この日付は 2000 から 2039 の間になります。 199 から 200 桁目の「世紀」値は、このフィールドには適用されません。
282 287 ゾーン 10 進数 6、0 プログラム実行の時刻 (hhmmss 形式)。
288 293 文字 6 プログラムがコンパイルされた日付 (UDATE 形式)。 この値の年の部分 が 40 から 99 の間の場合、この日付は 1940 から 1999 の間になります。 それ以外の場合、この日付は 2000 から 2039 の間になります。 199 から 200 桁目の「世紀」値は、このフィールドには適用されません。
294 299 文字 6 プログラムがコンパイルされた時刻 (hhmmss 形式)。
300 303 文字 4 コンパイラーのレベル。
304 313 文字 10 ソース・ファイル名。
314 323 文字 10 ソース・ライブラリー名。
324 333 文字 10 ソース・ファイル・メンバー名。
334 343 文字 10 プロシージャーが入っているプログラム。
344 353 文字 10 プロシージャーが入っているモジュール。
354 355 2 進数 2 ソース ID は、21 から 28 桁目からのステートメント番号と突き合わせ られます。
356 357 2 進数 2 ソース ID は、228 から 235 桁目からのステートメント番号と突き合わせ られます。
358 367 文字 10 現行ユーザー・プロファイル名。
368 371 整数 10,0 外部エラー・コード
372 379 整数 20,0 操作により設定された XML 要素
380 429 文字 50 未使用。

プログラム状況コード

サブフィールド位置 *STATUS に入るコードで 99 より大きいものは、例外/エラー条件と見なされます。 状況コードが 99 より大きい場合には、73 から 74 桁目に エラー標識が指定されていれば、その標識がオンに設定されます。'E' 拡張が指定されていれば、%ERROR 組み込み関数が '1' を戻すように設定されるか、 または MONITOR ブロックの中の適切な ON-ERROR グループに制御が渡されます。そうでない場合は、プログラム例外/エラー処理サブルーチンが制御を受け取ります。位置 *STATUS は、例外/エラーが起こった時に更新されます。

%STATUS 組み込み関数は、プログラムまたはファイル状況に関して設定された最新の値を戻します。

プログラム状況データ構造のサブフィールド位置 *STATUS には、次のコードが入 れられます。

通常のコード

コード
条件
00000
例外/エラーは起こっていない。
00001
呼び出されたプログラムから LR 標識がオンになって戻った。
00050
変換の結果、置換が行われる。

例外/エラー・コード

コード
条件
00100
ストリング命令の範囲外の値。
00101
負の平方根。
00102
ゼロによる除算。
00103
中間結果が結果を入れるだけ大きくない。
00104
浮動下位桁あふれ。 中間値が小さ過ぎて、中間結果フィールドに 入りません。
00105
文字の中にある、数値変換関数に対して無効な文字。
00112
日付、時刻、またはタイム・スタンプの値が正しくない。
00113
日付オーバーフローまたは下位桁あふれ。 (たとえば、日付演算の結果 が *HIVAL より大きいかまたは *LOVAL より小さい数になるとき。)
00114
日付が 4 文字の年から 2 文字の年にマップされ、日付の範囲が 1940 から 2039 に ない日付マッピング・エラー。
00115
可変長フィールドの現在の長さが正しくない。
00120
テーブルまたは配列の順序が違っている。
00121
配列指標が正しくない。
00122
OCCUR が範囲外。
00123
プログラムの初期化ステップでリセットしようとした。
00202
呼び出されたプログラムまたはプロシージャーが正常に実行されず、停止標 識 (H1 から H9) はオンでない。
00211
呼び出し側プログラムまたはプロシージャーのエラー。
00222
ポインターまたはパラメーター・エラー。
00231
呼び出されたプログラムまたはプロシージャーから停止標識がオンになって 戻った。
00232
このプログラムで停止標識がオンになった。
00233
RETURN 命令の実行時に停止標識がオンになった。
00299
RPG IV 定様式ダンプが失敗した。
00301
メソッドの呼び出しでクラスまたはメソッドが見付からなかったか、あるいはメソッドの呼び出しでエラー。
00302
Java ネイティブ・メソッドへの入り口において、Java 配列から RPG パラメーターへの変換時にエラー。
00303
RPG ネイティブ・メソッドからの出口において、RPG パラメーターから Java 配列への変換でエラー。
00304
Java メソッドの呼び出しの準備中に、RPG パラメーターから Java 配列への変換でエラー。
00305
Java メソッド後の Java 配列から RPG パラメーターまたは戻り値への変換でエラー。
00306
RPG 戻り値から Java 配列への変換でエラー。
00333
DSPLY 命令のエラー。
00351
XML 文書の構文解析時エラー。
00352
%XML の無効オプション。
00353
XML 文書が RPG 変数に一致しない。
00354
XML 構文解析の準備時エラー。
00401
IN/OUT で指定されたデータ域が見付からない。
00402
事前開始でないジョブに対しては *PDA は無効。
00411
データ域のタイプまたは長さが一致しない。
00412
データ域が出力用にロックされていない。
00413
IN/OUT 命令のエラー。
00414
ユーザーにデータ域を使用する権限がない。
00415
ユーザーにデータ域を変更する権限がない。
00421
UNLOCK 命令のエラー。
00425
記憶割り振りに必要な長さが範囲外。
00426
記憶域管理操作中にエラーが起こった。
00431
データ域は別のプログラムによってすでにロック済みである。
00432
データ域は同じ処理内のプログラムによってロック済みである。
00450
文字フィールド全体がシフトアウトおよびシフトイン文字で囲まれてい ない。
00451
2 つの CCSID 間の変換はサポートされません。
00501
分類順序検索の障害。
00502
分類順序変換の障害。
00802
コミットメント制御は活動状態になっていない。
00803
ロールバック操作が正常に実行されなかった。
00804
COMMIT 命令でエラーが起こった。
00805
ROLBK 命令でエラーが起こった。
00907
10 進数データ・エラー (数字または符号が無効)。
00970
プログラムの生成に使用されたコンパイラーのレベル番号が、RPG IV の実行時サブルーチンのレベル番号と一致しない。
09998
ILE RPG コンパイラーまたは実行時サブルーチンの内部障害。
09999
システム・ルーチン内のプログラム例外。

PSDS の例

プログラム内で PSDS を指定するためには、使用したいプログラム状況データ構 造およびサブフィールドを定義仕様書にコーディングします。

図 36. PSDS のコーディング例
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++

DMYPSDS          SDS

D PROC_NAME         *PROC                                            * プロシージャー名

D PGM_STATUS        *STATUS                                          * 状況コード

D PRV_STATUS             16     20S 0                                * 前の状況

D LINE_NUM               21     28                                   * ソース・リスト行番号

D ROUTINE           *ROUTINE                                         * ルーチン名

D PARMS             *PARMS                                           * 渡されたパラメーターの数

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                                   * 例外 ID

D DATE                  191    198                                   * 日付 (*DATE 形式)

D YEAR                  199    200S 0                                * 年 (*YEAR 形式)

D LAST_FILE             201    208                                   * 最終使用ファイル

D FILE_INFO             209    243                                   * ファイル・エラー情報

D JOB_NAME              244    253                                   * ジョブ名

D USER                  254    263                                   * ユーザー名

D JOB_NUM               264    269S 0                                * ジョブ番号

D JOB_DATE              270    275S 0                                * 日付 (UDATE 形式)

D RUN_DATE              276    281S 0                                * 実行日 (UDATE)

D RUN_TIME              282    287S 0                                * 実行時刻 (UDATE)

D CRT_DATE              288    293                                   * 作成日

D CRT_TIME              294    299                                   * 作成時刻

D CPL_LEVEL             300    303                                   * コンパイラー・レベル

D SRC_FILE              304    313                                   * ソース・ファイル

D SRC_LIB               314    323                                   * ソース・ファイル・ライブラリー

D SRC_MBR               324    333                                   * ソース・ファイル・メンバー

D PROC_PGM              334    343                                   * プログラム (プロシージャーを含む)

D PROC_MOD              344    353                                   * モジュール (プロシージャーを含む)
注:
キーワードはラベルではないので、サブフィールドのアクセスに使用する ことはできません。 記入項目が短い場合には、右側にブランクが埋め込まれます。