!--a11y-->

従属画面を使用すると、実行時にある Dynpro を別の Dynpro 内に埋め込むことができます。従属画面という用語は、埋め込んだ Dynpro にも、Dynpro を挿入したメイン画面上の領域にも適用されます。このセクションは、従属画面領域と呼ばれます。埋め込んだ実際の Dynpro は、従属画面と呼ばれます。従属画面を使用する場合、埋め込んだ Dynpro の制御ロジックもメイン画面の制御ロジックに埋め込まれます。Dynpro で従属画面を使用するのは、ABAP プログラム内でインクルードを使用するのに似ています。
従属画面を使用すると、実行時に Dynpro の内容を動的に展開することができます。たとえば、拡張コンセプトの一部である Dynpro Exit で従属画面テクニックが使用されます。また、タブストリップコントロールのような複合 Dynpro エレメントでもこのテクニックが使用されます。
従属画面を使用するために必要な手順は次のとおりです。
...
1. Dynpro に従属画面領域を定義します。
2. 適切な従属画面を定義します。

従属画面を埋め込む Dynpro のレイアウトで、スクリーンペインタを使用して従属画面領域を定義します。Dynpro 上の各従属画面領域には、一意の名称と、位置、長さ、および高さがあります。従属画面領域を互いに重ねることはできません。また、他の Dynpro エレメントと重ねることもできません。さらに、ユーザがウィンドウのサイズを調整した際に、従属画面領域のサイズが垂直方向と水平方向のどちらに調整されるかを指定することもできます。領域でサイズ調整がサポートされている場合、その最小サイズを指定することができます。サイズ調整属性が選択されている場合、ユーザがメイン画面のサイズを調整すると、PAI イベントがトリガされます。
同じプログラムまたは異なるプログラムに従属画面を登録することができます。従属画面を登録するには、Dynpro 属性に Dynpro タイプ従属画面を入力します。静的に定義されている次画面は、従属画面自体の番号でなければなりません。Dynpro のサイズを選択し、その Dynpro を挿入する従属画面領域内に収まるようにします。従属画面領域に対して従属画面が大きすぎる場合、左上隅のみが表示されます。
従属画面のレイアウト、エレメント一覧、および制御ロジックを通常の Dynpro と同様に登録します。従属画面に他の従属画面を挿入することもできます。ただし、以下の制限が適用されます。
キ 従属画面領域が小さすぎる場合、Dynpro エレメントが切詰められないように配置する必要があります。
キ ABAP プログラムに複数の従属画面を登録する場合、個々の Dynpro エレメントの名称が従属画面間で一意になるようにする必要があります。また、従属画面がメイン画面と同じプログラムに属する場合は、名称がそこで 2 回使われないようにする必要があります。そうでない場合、各ユーザアクションの後で、Dynpro から移送されたデータを ABAP プログラムで分離しなければなりません ( 例を参照) 。
キ 従属画面に独自の OK_CODE 項目を定義することはできません。従属画面上のユーザアクションにリンクされている機能コードは、メイン画面の OK_CODE 項目に格納されます。メイン画面と異なるプログラムで定義された従属画面の場合も同様です。
キ 従属画面の制御ロジックに MODULE ... AT EXIT-COMMAND 命令を含めることはできません。タイプ E の機能は、メイン画面でしか処理することができません。
キ 従属画面の制御ロジックに、命令 SET TITLEBAR 、SET PF-STATUS 、SET SCREEN 、LEAVE SCREEN 、または LEAVE TO SCREEN を使用したダイアログモジュールを含めることはできません。これらの命令によって実行時エラーが発生します。従属画面でメイン画面の GUI ステータスを変更することはできません。
また、従属画面としての選択画面を定義することもできます。
メイン画面の制御ロジックで CALL SUBSCREEN 命令を使用して、従属画面を挿入します。
メイン画面の従属画面領域に従属画面を挿入し、その PBO 制御ロジックを呼び出すには、メイン画面の PBO イベントで次の命令を使用します。
PROCESS BEFORE OUTPUT.
...
CALL SUBSCREEN <area> INCLUDING <prog>
<dynp>.
...
この命令によって、番号 <dynp> の従属画面が<area> という従属画面領域に割り当てられます。<prog> を使用して、従属画面が定義される ABAP プログラムを指定する必要があります。該当する従属画面がない場合は、実行時エラーが発生します。また、同時に従属画面の PBO 制御ロジックも挿入されます。これによって、従属画面が定義される ABAP プログラムの PBO モジュールを呼び出すことができます。従属画面 PBO の最後に、プログラムのグローバル項目が従属画面の同名の Dynpro 項目に渡されます。従属画面の PBO 制御ロジック自体に他の従属画面を挿入することができます。
従属画面領域の名称 <area> は、引用符を使用しないで直接入力する必要があります。名称 <prog> および <dynp> は、リテラルとしても変数としても指定することができます。変数を使用する場合、ABAP プログラムで宣言し、同名の変数を書き込む必要があります。Dynpro 番号 <dynp> は 4 文字でなければなりません。従属画面を領域に割り当てていない場合は、空白のままです。
従属画面の PAI 制御ロジックを呼び出すには、メイン画面の PAI 制御ロジックで次の命令を使用します。
PROCESS AFTER INPUT.
...
CALL SUBSCREEN <area>.
...
この命令によって、PBO イベントで従属画面領域<area> に挿入された従属画面の PAI 制御ロジックが挿入されます。これによって、従属画面が定義される ABAP プログラムの PAI モジュールを呼び出すことができます。データは、PAI イベントがトリガされたとき、つまり従属画面の PAI 制御ロジックの該当する FIELD 命令で、従属画面と ABAP プログラムの同名の項目間で移送されます。
CHAIN と ENDCHAIN または LOOP と ENDLOOP 間に CALL SUBSCREEN 命令を挿入することはできません ( テーブルコントロールを参照) 。従属画面が処理されている間、システム項目 SY-DYNNR にその Dynpro 番号が格納されます。したがって、CALL SUBSCREEN 命令が実行された場合やメイン画面に戻った場合、この項目の内容が変わります。
従属画面を使用する際には、入出力項目のデータはそれらが定義されたプログラム間で移送されることに注意してください。一方、画面上のユーザアクションの機能コードは常にメイン画面の OK_CODE 項目に格納され、それが定義されたプログラムに移送されます。そのため、従属画面の機能コードには、メイン画面のものと異なる名称を指定してください。
カプセル化のために、他の ABAP プログラムで従属画面を定義する場合、ABAP プログラムの PAI 制御ロジックを呼び出した後、ABAP プログラムの必要なグローバルデータが呼出側の Dynpro のプログラムに移送されるようにする必要があります。
キ たとえば、汎用グループで従属画面を定義し、そのグローバルデータを汎用モジュールパラメータ間で受渡しすることができます。その後、メインプログラムの適切なダイアログモジュールで汎用モジュールを呼び出してデータを移送する必要があります。
キ また、従属画面の PBO の前に ABAP メモリのデータクラスタ としてメインプログラムからグローバルデータをエクスポートし、従属画面の PBO モジュールにインポートすることもできます。

従属画面
REPORT demo_dynpro_subscreens.
DATA: ok_code TYPE
sy-ucomm,
save_ok TYPE sy-ucomm.
DATA: number1(4) TYPE n
VALUE '0110',
number2(4) TYPE n VALUE '0130',
field(10) TYPE c, field1(10) TYPE c,
field2(10) TYPE c.
CALL SCREEN 100.
MODULE status_100 OUTPUT.
SET PF-STATUS 'SCREEN_100'.
ENDMODULE.
MODULE fill_0110
OUTPUT.
field = 'Eingabe 1'(001).
ENDMODULE.
MODULE fill_0120
OUTPUT.
field = field1.
ENDMODULE.
MODULE fill_0130
OUTPUT.
field = 'Eingabe 2'(002).
ENDMODULE.
MODULE fill_0140
OUTPUT.
field = field2.
ENDMODULE.
MODULE cancel
INPUT.
LEAVE PROGRAM.
ENDMODULE.
MODULE save_ok INPUT.
save_ok =
ok_code.
CLEAR
ok_code.
ENDMODULE.
MODULE user_command_0110
INPUT.
IF save_ok
= 'OK1'.
number1 =
'0120'.
field1 =
field.
CLEAR
field.
ENDIF.
ENDMODULE.
MODULE user_command_0130
INPUT.
IF save_ok
= 'OK2'.
number2 =
'0140'.
field2 =
field.
CLEAR
field.
ENDIF.
ENDMODULE.
MODULE user_command_100
INPUT.
CASE
save_ok.
WHEN
'SUB1'.
number1 =
'0110'.
WHEN
'SUB2'.
number1 =
'0120'.
CLEAR
field1.
WHEN
'SUB3'.
number2 =
'0130'.
WHEN
'SUB4'.
number2 =
'0140'.
CLEAR
field2.
ENDCASE.
ENDMODULE.
Dynpro 100 の次画面は 100 です ( 静的に定義されています) 。この Dynpro のレイアウトは次のとおりです。

機能コード SUB1 から SUB4 の 4 つの押ボタンと、AREA1 および AREA2 の 2 つの従属画面領域があります。
同じ ABAP プログラムに、110 から 140 の 4 つの従属画面があります。これらの従属画面はそれぞれ、従属画面領域にちょうど収まります。レイアウトは次のとおりです。

4 つの従属画面すべての入出力項目に FIELD という名称が指定されています。従属画面 110 および 130 の押ボタンの機能コードは、OK1 および OK2 です。
Dynpro 100 の Dynpro 制御ロジックは次のとおりです。
PROCESS BEFORE OUTPUT.
MODULE status_100.
CALL SUBSCREEN: area1 INCLUDING sy-repid number1,
area2
INCLUDING sy-repid number2.
PROCESS AFTER INPUT.
MODULE cancel AT EXIT-COMMAND.
MODULE save_ok.
CALL SUBSCREEN: area1,
area2.
MODULE user_command_100.
従属画面 110 および 130 の Dynpro 制御ロジックは次のとおりです。
PROCESS BEFORE OUTPUT.
MODULE fill_0110|0130.
PROCESS AFTER INPUT.
MODULE user_command_0110|0130.
従属画面 120 および 140 の Dynpro 制御ロジックは次のとおりです。
PROCESS BEFORE OUTPUT.
MODULE fill_0120|0150.
PROCESS AFTER INPUT.
プログラムを実行すると、従属画面 110 および 130 が挿入された Dynpro が表示されます。メイン画面の押ボタンを使用すると、各画面領域の 2 つの従属画面のいずれかを選択することができます。従属画面の押ボタンを使用すると、従属画面 110 および 130 から従属画面 120 および 140 にデータを転送することができます。
すべての従属画面で同じ項目名 FIELD が使用されているので、メイン画面の各 PBO および PAI イベントで、同名の ABAP 項目が複数回転送されます。そのため、ABAP プログラムの補助項目 FIELD1 および FIELD2 に値が格納される必要があります。
従属画面の押ボタンには異なる機能コードがあり、これらは通常、ABAP 項目で処理されます。機能コードの名称が同じ場合も、補助項目を使用する必要があります。