!--a11y-->

PAI イベントでは、自動項目チェックの後、PAI モジュールがDynpro 制御ロジックでの発生順に呼び出されます。したがって、Dynpro 上での入力が自動チェックをパスするまで、最初の呼出は実行されません。特に、すべての必須項目に値が入力されていなければならず、また ABAP ディクショナリの項目に定義された値一覧やチェックテーブルとの照合によるチェックにパスしなければなりません。
場合によっては、単に画面を終了するためだけでも、ユーザが大量のデータを入力しなければならないことがあります。このような状況を回避するため、特別なモジュールコール付の特殊な機能コードを使用することができます。このモジュールコールでは、Dynpro 上でのユーザの入力内容にかかわらず、モジュールが呼び出されます。
Dynpro 上の押ボタンと GUI ステータスのエレメントのどちらの機能コードにも、機能タイプ E を割り当てることができます。押ボタンに対してこの割当を行うには、スクリーンペインタで 機能タイプ属性を E に設定します。GUI ステータスの場合は、メニューペインタでジャンプ → オブジェクト一覧 → 機能一覧 を選択し、必要な機能コードを選択して機能タイプとして E を指定します。
ユーザがステータスで押ボタンまたは機能を選択すると、自動項目チェックが回避され、Dynpro 制御ロジックで特殊モジュールが呼び出されます。特殊モジュールコールが存在しない場合は、通常の PAI 処理が再開され、その結果、自動項目チェックが実行されることになります。
基本的に、タイプ E
の機能はユーザが Dynpro
を終了できるようにします。そのため、前画面
(F3)
、終了
(Shift + F3)
、および取消
(F12)
には、通常、タイプ E
の機能が割り当てられます。
ユーザがタイプ E の機能を選択すると、Dynpro 制御ロジックは次の命令に直接ジャンプします。
MODULE <mod> AT EXIT-COMMAND.
この命令は、Dynpro 制御ロジックのどこに置かれているかにかかわりなく、Dynpro 上の項目内容に対する自動チェックより先に直ちに実行されます。モジュール<mod> の実行前には、OK-CODE 項目の内容が同名の ABAP 項目に移送されます。しかし、その他の Dynpro 項目 はこの段階ではプログラムに移送されません。AT EXIT-COMMAND オプションを指定した MODULE 命令が複数ある場合は、最初の命令のみ実行されます。AT EXIT-COMMAND オプションを指定した MODULE 命令がない場合は、通常の PAI 処理が再開されます。
タイプ が E 以外の機能コードを持つ機能をユーザが選択した場合は、MODULE <mod> AT EXIT-COMMAND 命令は実行されません。
MODULE ... AT EXIT-COMMAND 命令は、通常、自動入力チェックを行わずに現在の Dynpro を終了する目的で使用されます。そのため、現在の Dynpro 、コールチェーン、またはプログラム全体のどれを終了するかに応じて、LEAVE 命令の適切なバリアントを組み込むんで MODULE ... AT EXIT-COMMAND 命令をプログラミングするようにします。このモジュールで Dynpro が終了されないと、モジュールの完了後に通常の PAI 処理が再開されます。つまり、自動項目チェックが実行され、通常の PAI モジュールが呼び出されて、FIELDS 命令に定義された順序にしたがって Dynpro からプログラムにデータが送り返されます。

無条件のモジュールコール
PROGRAM DEMO_DYNPRO_AT_EXIT_COMMAND.
DATA: OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE OK_CODE,
INPUT1(20), INPUT2(20).
CALL SCREEN 100.
MODULE INIT_SCREEN_0100 OUTPUT.
SET
PF-STATUS 'STATUS_100'.
ENDMODULE.
MODULE CANCEL INPUT.
MESSAGE
I888(BCTRAIN) WITH TEXT-001 OK_CODE INPUT1 INPUT2.
IF OK_CODE
= 'CANCEL'.
CLEAR
OK_CODE.
LEAVE
PROGRAM.
ENDIF.
ENDMODULE.
MODULE BACK INPUT.
MESSAGE
I888(BCTRAIN) WITH TEXT-002 OK_CODE INPUT1 INPUT2.
IF OK_CODE
= 'BACK'.
CLEAR:
OK_CODE, INPUT1, INPUT2.
LEAVE TO
SCREEN 100.
ENDIF.
ENDMODULE.
MODULE EXECUTE1 INPUT.
MESSAGE
I888(BCTRAIN) WITH TEXT-003 OK_CODE INPUT1 INPUT2.
SAVE_OK =
OK_CODE.
CLEAR
OK_CODE.
ENDMODULE.
MODULE EXECUTE2 INPUT.
MESSAGE
I888(BCTRAIN) WITH TEXT-004 OK_CODE INPUT1 INPUT2.
IF SAVE_OK
= 'EXECUTE'.
MESSAGE
S888(BCTRAIN) WITH TEXT-005.
ENDIF.
ENDMODULE.
Dynpro 100 の次画面 ( 静的定義) は同じ Dynpro です。このレイアウトは次のようなものです。
入力項目には INPUT1 と INPUT2 という名称が割り当てられています。この 2 つの項目はいずれも必須項目です。押ボタンの機能コードは EXECUTE と CANCEL です。CANCEL には機能タイプ E が設定されています。
GUI
ステータス STATUS_100
では、前画面
(F3)
アイコンが機能コード BACK
で、取消
(F12)
アイコンが機能コード CANCEL
でそれぞれ有効になっています。どちらも機能タイプ E
が設定されています。機能コード EXECUTE
は機能キー F8
に割り当てられています。この機能コードには機能タイプ E
は設定されていません。
この Dynpro 制御ロジックは次のとおりです。
PROCESS BEFORE OUTPUT.
MODULE
INIT_SCREEN_0100.
PROCESS AFTER INPUT.
MODULE
EXECUTE1.
MODULE
CANCEL AT EXIT-COMMAND.
MODULE BACK
AT EXIT-COMMAND.
MODULE
EXECUTE2.
このプログラムでは、情報およびステータスメッセージによって、ユーザのインタラクションのあとに呼び出されるモジュールと移送されるデータが示されます。
キ ユーザが必須項目にデータを入力しないで実行を選択すると、自動項目チェックによってエラーメッセージが表示されます。
キ ユーザが必須項目にデータを入力したあとに実行を選択すると、Dynpro 項目がすべてプログラムに移送され、モジュール EXECUTE1 と EXECUTE2 が呼び出されます。
キ ユーザが取消を選択すると、必須項目へのデータの入力が行われているかどうかにかかわりなく、OK_CODE 項目が移送され、CANCEL モジュールが呼び出されます。CANCEL モジュールによって、プログラムが終了します。
キ ユーザが前画面を選択すると、必須項目へのデータの入力が行われているかどうかにかかわりなく、OK_CODE 項目が移送され、CANCEL モジュールが呼び出されます。ただし、この場合は、機能コードが BACK であるためプログラムは終了しません。その代わり、自動項目チェックが実行されます。必須項目にデータが入力されていれば、モジュールEXECUTE1 と EXECUTE2 が呼び出されます。
BACK モジュールは呼び出されません。なぜなら、AT EXIT-COMMAND オプションを指定したモジュールが複数ある場合、最初のモジュールのみが呼び出されるためです。上の例の場合、機能コード BACK は CANCEL モジュールで処理されます。その後、AT EXIT-COMMAND オプションを指定したモジュール命令は 1 つだけとなるので、命令の位置は重要ではなくなります。