!--a11y-->

画面と同様に、選択画面でもタブストリップコントロールを使用することができます。これには、タブストリップ領域とタブページを定義し、タブページに従属画面を割り当てます。ABAP プログラムでタブストリップコントロールを宣言したり、Dynpro 制御ロジックをプログラミングしたりする必要はありません ( 実際には、これらを行うことはできません) 。どちらも自動的に生成されます。
タブストリップ領域とタブページを定義するには、選択画面の定義で次の命令を使用します。
SELECTION-SCREEN:
BEGIN OF TABBED BLOCK <tab_area> FOR <n> LINES,
TAB
(<len>) <tab1> USER-COMMAND <ucom1>
[DEFAULT
[PROGRAM <prog>] SCREEN <scrn>],
TAB
(<len>) <tab2> USER-COMMAND <ucom2>
[DEFAULT
[PROGRAM <prog>] SCREEN <scrn>],
...
END
OF BLOCK <tab_area>.
この命令は、サイズ <n> のタブストリップコントロール <tab_area> を作成します。タブページ<tab1> 、<tab2>… がタブ領域に割り当てられます。<len> はタブタイトルの幅を設定します。タブタイトルには、それぞれ機能コード<ucom> を割り当てる必要があります。機能コードは、AT SELECTION-SCREEN イベントで項目 SY-UCOMM から調べることができます。
各タブタイトルと同名の文字項目が ABAP プログラムに自動的に作成されます。選択画面を表示する前に、これらの文字項目にテキストを割り当てることができます。割り当てたテキストは、選択画面上の対応するページのタイトルとして表示されます。
各タブタイトルに従属画面を割り当てる必要があります。割り当てた従属画面は、ユーザがタブタイトルを選択したときにタブ領域に表示されます。従属画面として次のいずれかを割り当てることができます。
キ スクリーンペインタを使って定義した従属画面
キ ABAP プログラム内で定義した選択画面の従属画面
この割当はプログラム内で静的に行うことも、実行時に動的に行うこともできます。実行時に、従属画面が割り当てられていないタブタイトルがあると、実行時エラーが発生します。
キ 静的割当
タブタイトルの定義で DEFAULT オプションを使用します。ABAP プログラムとその従属画面を 1 つ指定することができます。ABAP プログラムの指定を省略すると、現在のプログラムの従属画面が検索されます。ユーザがタブタイトルを選択すると、そのタブが有効化され、従属画面がタブストリップ領域に割り当てられます。静的割当はプログラムの開始から終了まで有効ですが、選択画面が表示される前にその割当を上書きすることもできます。
キ 動的割当
各タブ領域と同名の構造が ABAP プログラムに自動的に作成されます。この構造には、PROG 、DYNNR 、ACTIVETAB という 3 つの要素があります。従属画面を静的に割り当てると、この構造の各要素に、従属画面が含まれている ABAP プログラムの名前、従属画面の番号、選択画面で現在有効になっているタブタイトルの名前がそれぞれ割り当てられます。デフォルトで有効なタブページは最初のページです。選択画面が表示される前に構造の各要素に値を割り当てることで、従属画面を動的に設定することができます。
通常の従属画面をタブタイトルに割り当てるには、その制御ロジックを含んだダイアログモジュールを現在の ABAP プログラム内で定義する必要があります。従属画面が選択画面の場合は、ユーザアクションによって AT SELECTION-SCREEN イベントとそのバリアントがトリガされます ( 選択画面の処理を参照) 。たとえば、ユーザがタブタイトルを選択したときなどです。ある選択画面が別の選択画面に包含されている場合は、内側の選択画面、外側の選択画面の順に AT SELECTION-SCREEN イベントが少なくとも 2 回はトリガされます。

REPORT demo_sel_screen_with_tabstrip.
DATA flag(1) TYPE c.
* SUBSCREEN 1
SELECTION-SCREEN BEGIN OF
SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF
BLOCK b1 WITH FRAME.
PARAMETERS: p1(10) TYPE
c,
p2(10)
TYPE c,
p3(10)
TYPE c.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF
SCREEN 100.
* SUBSCREEN 2
SELECTION-SCREEN BEGIN OF
SCREEN 200 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF
BLOCK b2 WITH FRAME.
PARAMETERS: q1(10) TYPE c
OBLIGATORY,
q2(10)
TYPE c OBLIGATORY,
q3(10)
TYPE c OBLIGATORY.
SELECTION-SCREEN END OF
BLOCK b2.
SELECTION-SCREEN END OF
SCREEN 200.
* STANDARD SELECTION SCREEN
SELECTION-SCREEN: BEGIN
OF TABBED BLOCK mytab FOR 10 LINES,
TAB
(20) button1 USER-COMMAND push1,
TAB
(20) button2 USER-COMMAND push2,
TAB
(20) button3 USER-COMMAND push3
DEFAULT SCREEN 300,
END
OF BLOCK mytab.
INITIALIZATION.
button1 = text-010.
button2 = text-020.
button3 = text-030.
mytab-prog = sy-repid.
mytab-dynnr = 100.
mytab-activetab = 'BUTTON1'.
AT
SELECTION-SCREEN.
CASE sy-dynnr.
WHEN 1000.
CASE sy-ucomm.
WHEN 'PUSH1'.
mytab-dynnr = 100.
mytab-activetab =
'BUTTON1'.
WHEN 'PUSH2'.
mytab-dynnr = 200.
mytab-activetab =
'BUTTON2'.
ENDCASE.
WHEN 100.
MESSAGE s888(sabapdocu) WITH text-040
sy-dynnr.
WHEN 200.
MESSAGE s888(sabapdocu) WITH text-040
sy-dynnr.
ENDCASE.
MODULE init_0100
OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'MOD'.
CASE flag.
WHEN 'X'.
screen-input = '1'.
WHEN ' '.
screen-input = '0'.
ENDCASE.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE.
MODULE user_command_0100
INPUT.
MESSAGE s888(sabapdocu) WITH text-050 sy-dynnr.
CASE sy-ucomm.
WHEN 'TOGGLE'.
IF flag = ' '.
flag = 'X'.
ELSEIF flag = 'X'.
flag = ' '.
ENDIF.
ENDCASE.
ENDMODULE.
START-OF-SELECTION.
WRITE: / 'P1:', p1,'Q1:', q1,
/ 'P2:', p2,'Q2:', q2,
/ 'P3:', p3,'Q3:',
q3.
このプログラムでは、2 つの選択画面 100 と 200 を従属画面として定義し、3 つのタブページを持つタブストリップコントロールを標準選択画面上に配置しています。従属画面 300 ( 同じプログラムのもの) を 3 番目のタブページに静的に割り当てています。
画面 300 のレイアウトは次のとおりです。

入力/
出力項目の P1
から Q3
は、ABAP
プログラムの
パラメータを使用して定義されています。押ボタンの機能コードは TOGGLE
です。
画面 300 の Dynpro 制御ロジックは次のとおりです。
PROCESS BEFORE
OUTPUT.
MODULE init_0100.
PROCESS AFTER
INPUT.
MODULE user_command_0100.
どちらのダイアログモジュールも ABAP プログラム内で定義されています。
プログラムを実行すると、標準選択画面が表示されます。INITIALIZATION イベントで、タブタイトルにテキストが設定され、タブ領域に従属画面 100 が割り当てられ、最初のタブタイトルが有効化されます。
選択画面上のユーザアクションは、AT SELECTION-SCREEN イベントブロックで処理されます。特に、ユーザが最初の 2 つのタブタイトルのいずれかを選択したとき、従属画面を割り当て、タブタイトルを有効化する処理は、このイベントブロックの中で行われます。この処理は 3 番目のタブタイトルには必要ありません。ユーザが 3 番目のタブタイトルを選択したときには、必ず動的割当 ( 画面 300) が構造 MYTAB に格納されるからです。
従属画面を表示する前に、PBO モジュール INIT_100 が実行されます。従属画面上のユーザアクションによって PAI モジュールがトリガされます。たとえば、ユーザがタブタイトルを選択したときなどです。続いて、AT SELECTION-SCREEN イベントがトリガされます。
ステータス行に、アクションが処理された場所を示すメッセージが表示されます。