ファイル・エラー処理 (INFSR) サブルーチンの使用
ファイル・エラーまたは例外を処理するためには、
ファイル・エラー処理 (INFSR) サブルーチンを作成することができます。ファイル例外が起こると、次のようになります。
- INFDS が更新されます。
- 次のもので例外が起こった場合には、ファイル・エラー処理サブルーチン
(INFSR) が制御を受け取ります。
- 暗黙の (プライマリーまたはセカンダリー) ファイル操作
- 73 ~ 74 桁目に標識の指定されていない明示ファイル操作
ファイル・エラー処理サブルーチンは複数のファイルでエラーを処理すること ができます。
次の制約事項が適用されます。
- プログラムの開始または終了時に (例えば、サイクルの開始時の暗黙オープンで) ファイル例外が起こった場合、制御は、エラー処理サブルーチン処理プログラムではなく、ILE RPG のデフォルトの値の例外処理プログラムに渡されます。 したがってファイル・エラー処理サブルーチンは処理されません。
- 命令に関連しないエラー (例えば、CHAIN 命令での配列指標エラー) が 起こった場合には、INFSR エラー処理サブルーチンは無視されます。 エラーは、他のプログラム・エラーと同様に取り扱われます。
- INFSR はサブプロシージャーとして使用されているグローバル・ファイルでは、エラー を処理することができません。
プログラムにファイル・エラー処理サブルーチンを追加するためには、
次のステップを行ってください。
- ファイル仕様書のキーワード INFSR の後にサブルーチンの名前を記入し てください。 サブルーチン名は *PSSR とすることができますが、これはこのファイルでの例 外でプログラム・エラー処理サブルーチンに制御が渡されることを示します。
- 任意指定で、キーワード INFDS を使用してファイル仕様書でファイル情報 データ構造を指定してください。
- 演算項目 1 にキーワード INFSR に指定したものと同じサブルーチン名のあ る BEGSR 命令を指定してください。
- 戻り点がある場合にはそれを指定して、サブルーチンの ENDSR 命令にそれを コーディングしてください。 演算項目 2 の有効な項目については、ENDSR 命令での戻り点の指定を参照してくださ い。演算項目 2 はサブプロシージャー内のファイル・エラー・サブルーチンでは 使用できません。
- ファイル・エラー処理サブルーチンの残りをコーディングしてください。 ファイル・エラー処理サブルーチンで ILE RPG コンパイラー命令を使用することができますが、エラーのあった同じファイルに入出力命令を使用することは望ましくありません。ENDSR 命令は、ファイル・エラー処理サブルーチンの最後の仕様書でなければな りません。
図 1 には、INFSR エラー処理サブルーチンを使った例外処理の例が 示してあります。 プログラム TRNSUPDT は単純な在庫更新プログラムです。このプログラムはトランザクション・ファイル TRANSACT を使用して 在庫マスター・ファイル PRDMAS を更新します。入出力エラーが起こった場合には、INFSR エラー処理サブルーチンが呼び出さ れます。 レコード・ロック・エラーの場合には、そのレコードがバックログ・ファイル に書き出されます。 そうでない場合には、照会メッセージが出されます。
PRDMAS のファイル仕様書は INFDS を識別するとともに、それに関連した INFSR を識別するということに注意してください。
TRANSACT ファイルの各レコードに対して次のことが行われます。
- トランザクション製品番号を使用して製品マスター・ファイル中で該当す るレコードが見付けられます。
- レコードが見付かった場合には、在庫数量が更新されます。
- UPDATE 命令でエラーが起こった場合には、 制御が INFSR エラー処理サブルーチンに渡されます。
- レコードが見付からなかった場合には、エラー報告書に製品番号が書き出 されます。
図 1. ファイル例外処理の例
*=================================================================*
* TRNSUPDT: このプログラムは簡単な在庫更新プログラムです。 *
* トランザクション・ファイル (TRANSACT) が連続的に処理されます。 *
* トランザクションにある製品番号が、マスター・ファイル (PRDMAS) *
* にランダムにアクセスするキーとして使用されます。 *
* 1. レコードが見つかった場合には、在庫数量が *
* 更新されます。 *
* 2. レコードが見つからなかった場合には、報告書にエラーが *
* 印刷されます。 *
* 3. 現在レコードがロックされている場合には、トランザクションは *
* トランザクション受注残ファイルに書き出され、 *
* 後で処理されます。 *
* 4. それ以外の予期しないエラーが起こった場合には、実行時エラー・ *
* メッセージが出されます。 *
*=================================================================*
*-----------------------------------------------------------------*
* ファイルの定義: *
* 1) PRDMAS - 製品マスター・ファイル *
* 2) TRANSACT - トランザクション・ファイル *
* 3) TRNBACKLG - トランザクション受注残ファイル *
* 2) PRINT - エラー報告書 *
*-----------------------------------------------------------------*
FPRDMAS UF E K DISK
F INFSR(PrdInfsr)
F INFDS(PrdInfds)
FTRANSACT IP E DISK
FTRNBACKLG O E DISK
FPRINT O F 80 PRINTER
*-----------------------------------------------------------------*
* ファイル PRDMAS のファイル情報データ構造を定義します。 *
* *STATUS フィールドは取るべき処置を決めるために使用されます。 *
*-----------------------------------------------------------------*
D PrdInfds DS
D PrdStatus *STATUS
*-----------------------------------------------------------------*
* 予期される例外をリストします。 *
*-----------------------------------------------------------------*
D ErrRecLock C CONST(1218)
*-----------------------------------------------------------------*
* トランザクションの製品番号を使用して、製品マスター・ファイルに *
* アクセスします。 *
*-----------------------------------------------------------------*
C TRNPRDNO CHAIN PRDREC 10
*-----------------------------------------------------------------*
* レコードが見つかった場合、マスター・ファイルの数量を更新します。*
*-----------------------------------------------------------------*
C IF NOT *IN10
C SUB TRNQTY PRDQTY
C UPDATE PRDREC
*-----------------------------------------------------------------*
* レコードが見つからない場合には、エラー報告書を書き出します。 *
*-----------------------------------------------------------------*
C ELSE
C EXCEPT NOTFOUND
C ENDIF
C SETON LR
*-----------------------------------------------------------------*
* エラー処理ルーチン。 *
*-----------------------------------------------------------------*
C PrdInfsr BEGSR
*-----------------------------------------------------------------*
* 現在マスター・レコードがロックされている場合、トランザクション・*
* レコードを受注残ファイルに書き次のトランザクションにスキップ。 *
*-----------------------------------------------------------------*
C PrdStatus DSPLY
C IF (PrdStatus = ErrRecLock)
C WRITE TRNBREC
C MOVE '*GETIN' ReturnPt 6
*-----------------------------------------------------------------*
* 予期しないエラーが起こった場合、照会メッセージが出されます。 *
*-----------------------------------------------------------------*
C ELSE
C MOVE *BLANK ReturnPt
C ENDIF
C ENDSR ReturnPt
*-----------------------------------------------------------------*
* エラー報告書の形式。
*-----------------------------------------------------------------*
OPRINT E NOTFOUND
O TRNPRDNO
O 29 'NOT IN PRDMAS FILE'
制御がエラー処理サブルーチンに渡されると、次のことが起こります。
- エラーの原因がレコード・ロックである場合には、そのレコードが受注残 ファイルに書き出され、次のトランザクションで制御が主要部分に戻されます (戻り点として *GETIN を介します)。
- エラーの原因が何か他の理由である場合には、ReturnPt にブランクが転送されます。 これにより、RPG のデフォルトの処理プログラムに制御が渡されます。 その点での回復処置は、エラーの性質によります。
レコード・ロック・エラーの検査は、PRDMAS の INFDS の *STATUS サブフィールドを、 レコード・ロック状況コードの値によって定義される ErrRecLock フィールドと突き合わせることによって 行われるということに注意してください。 他のエラーを定義し、 そのエラーを検査し、適切な処置を取ることによって、 他のタイプの入出力エラーを処理できるように INFSR を拡張することができます。