メイン・プロシージャーからの戻り
メイン・プロシージャーから戻ると、次のことが起こります。
- LR がオンの場合にはファイルがクローズされ、他の資源は解放される。
- プロシージャーの呼び出しスタック項目が呼び出しスタックから除去される。
- プロシージャーがプログラム入力プロシージャーで呼び出された場合には
、そのプログラム入力プロシージャーも呼び出しスタックから除去される。
メイン・プロシージャーは、次の 1 つの方法で呼び出しプロシージャー
に制御権を戻します。
呼び出されたメイン・プロシージャーから戻る方法について次に説明します。
LR、H1 〜 H9、および RT 標識が RPG プログラム・サイクルのどこでテストされるかについての
詳細は、「WebSphere Development Studio: ILE RPG 言語解説書」の RPG プログラム・サイクルのセクションを
参照してください。
正常終了
LR 標識がオンで、H1 〜 H9 標識がオンでない時には、メイン・プロシージャーが
正常に終了し、制御権が呼び出し元プロシージャーに戻されます。 LR 標識は、
次のようにしてオンに設定することができます。
- RPG プログラム・サイクルでプライマリーまたはセカンダリー・ファイルからの最終レコードが
処理される時は、暗黙的に。
- ユーザーが LR をオンに設定する時は、明示的に。
次の場合にも、メイン・プロシージャーは正常に終了します。
- RETURN 命令が (ブランクの演算項目 2 で) 処理され、
H1 〜 H9 標識がオンではなく、LR 標識がオンである。
- RT 標識がオンで、H1 〜 H9 標識がオンでなく、LR 標識がオンである。
メイン・プロシージャーが正常に終了すると、次のことが起こります。
- *ENTRY PARM 命令の演算項目 2 から結果フィールドへの転送
が実行される。
- 定義仕様書に「受け入れファイル名」が指定されているすべての配列および
テーブルと、ロックされているすべてのデータ域データ構造が書き出される。
- このプロシージャーによってロックされているデータ域はすべてアンロックされる。
- オープンされているすべてのファイルがクローズされる。
- このプロシージャーが正常に終了したことを呼び出し元に示す
ように戻りコードが設定され、その後呼び出し元に制御権が
戻される。
メイン・プロシージャーへの次回の呼び出しでは、
エクスポートされた変数は別として、処理用に新しいコピーが使用可能になります (エクスポートされた
変数は 1 回だけ初期設定されますが、これはプログラムが活動化グループで最初に
活動化される時です。 たとえ LR が前の呼び出しでオンであっても、エクスポートされた変数は
新しい呼び出し時には最後に割り当てられた値のままです。 それらを再初期化したい場合は、手操作で
リセットしなければなりません)。
ヒント
通常は LR オンで終了して記憶域を解放するところを、指定された (持続
する) 活動化グループで実行している場合には、終了しないで戻ることを考慮
したいことがあります。 理由は次のとおりです。
- 活動化グループが終了するまで記憶域は解放されないので、LR オンで終了
しても、記憶域に関して少しも利点がない。
- 呼び出すたびにプログラムを初期設定し直すことを避ければ、
呼び出しのパフォーマンスが向上する。
これを行うのは、プログラムをその都度初期設定し直す必要がない場合のみにしてください。
異常終了
次のいずれかが起こると、メイン・プロシージャーが異常終了し、制御権が
呼び出し元プロシージャーに戻されます。
- ILE RPG 照会メッセージが出されて取り消しオプションが取られた場合。
- *PSSR または INFSR エラー処理サブルーチンの ENDSR *CANCL 命令が
処理された場合(*PSSR および INFSR エラー処理サブルーチンの *CANCL 戻り点の
詳細については、ENDSR 命令での戻り点の指定を参照してください)。
- RETURN 命令 (ブランクの演算項目 2 で) が処理された時に、H1 〜 H9 標識がオンになっている場合。
- RPG サイクルで最終レコード (LR) 処理が行われた時に、H1 〜 H9 標識がオンである場合。
メイン・プロシージャーが異常終了した時には、次のことが起こります。
- オープンされているすべてのファイルがクローズされる。
- このプロシージャーによってロックされているデータ域はすべてアンロックされる。
- 照会メッセージに対する取り消し応答でメイン・プロシージャーが終
了した場合には、異常終了の原因となるのは機能チェックである。
この場合には、機能チェックが呼び出し元に渡されます。'*CANCL' で
終了するエラー処理サブルーチンのために終了した場合には、
呼び出し元にエスケープ・メッセージが直接出されます。
そうでない場合には、どのような例外が異常終了を起こしたかを呼び出し元が調べることになります。
このプロシージャーを次回に呼び出す時には、
最新コピーを処理に使用することができます (例外処理プログラムについて詳しくは、RPG 特有の処理プログラムの使用を参照してください)。
未終了の戻り
LR 標識または H1 〜 H9 標識のどれもがオンでない時に、次のいずれかが起こると、
メイン・プロシージャーが未終了で、制御権を呼び出しプロシージャーに戻すことができます。
- RETURN 命令 (ブランクの演算項目 2 で) が処理された時。
- RT 標識がオンで制御が RPG サイクルの *GETIN 部分に達した時。この場合に
は制御権がただちに呼び出し元プロシージャーに戻されます(RT 標識について
詳しくは、「WebSphere Development Studio: ILE RPG 言語解説書」を参照してください)。
メイン・プロシージャーを呼び出し、それが未終了で戻った場合には、
プロシージャーを再び呼び出した時に、このプロシージャーのすべてのフィールド、標識、
およびファイルはプロシージャーが途中終了した時と同じ値をもっています。
しかし、次のような 3 つの例外があります。
- プログラムが *NEW 活動化グループ内で実行している場合には、
プログラムが戻った時に活動化グループが削除されるので、これは当てはまらない。
その場合には、次回にプログラムを呼び出した時には、LR オンで終了した場合と同じになります。
- ファイルを共用している場合には、ファイルの状態は、プロシージャーが途中終了した時の状態と異なることがある。
- 同じモジュール内の別のプロシージャー間で呼び出された場合には、結果は予測できない。
LR 標識と H1 〜 H9 標識を組み合わせて、RETURN 命令 (ブランクの演算項目 2 で) または RT 標識を使用することができます。
その場合に RPG プログラム・サイクル内での、RETURN 命令、RT 標識、
および H1 〜 H9 標識に対するテスト順序に注意してください。LR 標識、
または停止標識のどれかがオンで、次の条件のどちらかが当てはまる場合には、戻りによって終了します。
- RETURN 命令が実行された
- RT により未終了の戻りが起こった
(C) Copyright IBM Corporation 1992, 2006. All Rights Reserved.