!--a11y-->

ここでは、特殊機能項目選択 ( トランザクションSFAW といくつかの汎用モジュール) を使用して Dynpro 項目の属性を動的に変更する方法を説明します。
機能項目選択を使用すると、実行時に Dynpro 項目の属性を動的に変更することができます。ただし、このオプションを使用するのは、項目属性の変更が同じ Dynpro に対して頻繁に行われる必要がある場合のみにしてください。この場合、すべての項目に同じルールが適用されるので、項目の変更が明白です。
以下の基本ルールが適用されます。
キ 項目選択プロセスに関連するすべての項目が項目選択テーブルにまとめられ、項目選択機能を使用して更新されます。
キ ABAP プログラムまたは Dynpro グループ ( 下記を参照) について項目を更新することができます。
キ Dynpro グループ " 空白" ('_') に属する Dynpro には、動的な項目選択はありません。
キ 集中項目選択で修正グループ SCREEN-GROUP1 が使用されるため、この修正グループをそれ以外に使用することはできません。
キ プログラムを変更する場合と同じ、決まった特殊なルールを項目選択で使用する場合、更新トランザクションではなく、プログラムで直接変更を行う必要があります。
項目選択を使用して、実行時に以下の属性を有効化または無効化することができます。
キ 入力
キ 出力
キ 必須
キ 有効
キ 強調
キ 非表示
また、条件や関連する変更の種類を指定することもできます。イベント PROCESS BEFORE OUTPUT 時に、条件をチェックし、必要に応じて属性を変更する汎用モジュールを呼び出します。
項目選択では、影響項目と変更済項目とが区別されます。変更済項目は、Dynpro 項目でなければなりません。また、すべての項目が ABAP ディクショナリを参照している必要があります。そのためには、TABLES を使用して、対応するインタフェース作業領域を ABAP プログラムに登録します。実行時に、汎用モジュールによって影響項目の項目内容が分析され、その後、それに応じて変更済項目の属性が設定されます。
プログラムの Dynpro ごとに別々に項目選択を更新するのではなく、論理的に関連する Dynpro を Dynpro グループに結合することができます。これにより、必要な更新の量が削減されます。Dynpro を Dynpro グループに割り当てるには、スクリーンペインタの属性画面で項目 Dynpro グループ にグループを入力します。
項目選択を呼び出すには、 ツール → ABAP ワークベンチ → 開発 → 他のツール → 項目選択 を選択します。更新はプログラムとDynpro グループによります。
まず、関連する項目の ABAP ディクショナリ名を宣言する必要があります。項目グループへのテーブルの割当を選択し、テーブルを入力します。次の例を参照してください。
入力内容を保存し、影響項目を選択して必要な影響項目を一覧に入力します。さらに、任意で NOT 条件、初期値、および項目 Cust を指定します。次の例を参照してください。
NOT 条件は、選択レポートとして解釈されます。項目のいずれかが NOT 条件を満たしている場合、以降の画面モディフィケーションの影響は受けません。NOT 条件を使用することで、パフォーマンスが向上する可能性があります。

影響項目: SPFLI-CARRID
NOT 条件: NE LH
SPFLI-CARRID が項目選択に関連するのは、実行時にその内容が LH と等しくない場合のみです。
実行時に、指定された値の一覧に影響項目の現在の値が見つからなかった場合、項目の変更に初期値が使用されます。そのためには、初期値の影響を定義しておく必要があります。このオプションを使用すると、同じ影響を及ぼすあらゆる形式の影響項目を 1 回の入力で更新することができます。
項目 Cust を適宜設定することで、カスタマが該当する項目を項目選択に使用できるようにするかどうかを指定することができます。この項目選択オプションは事前に定義されている SAP 項目選択にもとづいており、これを使用することで、カスタマは、アプリケーション開発によって決定されたフレームワーク内で要件に合わせて Dynpro 属性を設定することができます。多数のアプリケーションエリアに、このための独自の特殊なカスタマイジングトランザクションが備わっています ( これらは、トランザクション SFAC に関連するパラメータトランザクションです。汎用モジュールFIELD_SELECTION_CUSTOMIZE に関する文書を参照してください) 。
続いて、変更済項目を選択して、すべての変更可能項目を一覧に入力します。次の例を参照してください。
カスタマが特殊なカスタマイジングトランザクションでこれらの変更可能項目を使用できるようにする場合、ここでも項目 Cust をそれに合わせて設定することができます。Cust を選択すると、カスタマも項目を変更することができます。
これらの影響項目および変更可能項目のそれぞれに、プログラムごとに一意の内部番号があります。内部番号が生成されると、該当する Dynpro の SCREEN-GROUP1 に番号が自動的に挿入され、スクリーンペインタで変更することはできません。これにより、項目名とSCREEN-GROUP1 との間に 1:1 の関係が確立されます。
最後に、2 つの一覧から影響項目と変更可能項目とのリンクを生成します。変更可能項目に影響を及ぼす影響項目の内容とその影響を指定します。
項目をリンクするには、選択をクリックするか、ダブルクリックして、両方の一覧から項目を選択します。影響項目を選択すると変更可能項目の一覧が表示され、変更可能項目を選択すると影響項目の一覧が表示されます。この一覧から、必要なリンクを選択します。表示される一覧で、関連する条件を入力することができます。次の例を参照してください。
上記の入力によって、PBO で該当する項目選択汎用モジュールが呼び出される Dynpro の項目 SPFLI-AIRPFROM が、SPFLI-CARRID に 'LH' が含まれる場合、非表示になります。
複数の影響項目が同一の変更済項目に影響を及ぼす場合、これらの影響のリンクを決定する組合せルールが必要です。項目がさまざまな影響によって有効化/ 無効化される場合、以下の表を使用して、個々の項目属性の設定を確立します。Dynpro プロセッサによって、複数の属性の組合せが制御されます。
|
入力 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘_’ |
|
|
‘X’ |
‘_’ |
‘X’ |
|
出力 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘_’ |
|
|
‘X’ |
‘_’ |
‘X’ |
|
有効 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘_’ |
|
|
‘X’ |
‘_’ |
‘X’ |
|
必須 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘X’ |
|
|
‘X’ |
‘X’ |
‘X’ |
|
強調 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘X’ |
|
|
‘X’ |
‘X’ |
‘X’ |
|
非表示 |
|
|
|
|
|
|
項目 1 |
|
|
|
|
‘_’ |
‘X’ |
|
項目 2 |
‘_’ |
‘_’ |
‘X’ |
|
|
‘X’ |
‘X’ |
‘X’ |
凡例:
_ =
スイッチオフ、X =
スイッチオン
項目 1 によって Dynpro 項目が非表示になる場合(X) 、項目 2 によってこれを変更することはできません。
画面モディフィケーションでは、項目選択時に行った入力だけでなく、スクリーンペインタで行った入力も考慮されます。したがって、上記の組合せの結果が個々の属性と同じリンクルールに従って Dynpro の項目属性にリンクされます。
動的修正の全範囲を使用するには、スクリーンペインタで以下の属性を使用する必要があります。
入力 =
'X'
出力 =
'X'
必須 =
'_'
非表示
= '_'
強調 =
'_'
逆に、Dynpro で次のように定義されている値を変更することはできません。
入力 =
'_'
出力 =
'_'
必須 =
'X'
非表示
= 'X'
強調 =
'X'
さらに、次のことが適用されます。以下のように入力された影響の組合せは、実際は有効な組合せではありません。これは、組合せルールによって、指定された表示属性を別の影響項目 ( または Dynpro) によって変更することはできないと規定されているためです。
入力 =
'X'
出力 =
'X'
有効 =
'X'
必須 =
'_'
強調 =
'_'
非表示
= '_'
項目選択を再入力する際に、影響を及ぼさない上記のような影響は表示されません。ただし、影響項目に初期値を定義している場合、このような影響を表示し、更新することが有効な場合があります。
変更済項目の一覧が少しでも変更されている場合、項目選択を生成する必要があります。これにより、関連する ABAP プログラムの Dynpro で変更された SCREEN-GROUP1 項目の連続番号が生成されます。
項目選択を生成するには、トランザクション SFAW から生成を選択します。
PROCESS BEFORE OUTPUT イベントで Dynpro の項目選択を有効化するために、汎用モジュール FIELD_SELECTION_MODIFY_ALL またはFIELD_SELECTION_MODIFY_SINGLE のいずれかを呼び出すことができます。これらの汎用モジュールのどちらでも、影響項目の内容が確認され、必要に応じて組合せルールを参照して画面モディフィケーションが実行されます。FIELD_SELECTION_MODIFY_ALL を使用すると、この汎用モジュールによって LOOP AT SCREEN 命令が実行されます。ただし、FIELD_SELECTION_MODIFY_SINGLE を使用する場合は、LOOP AT SCREEN を自分で実行し、ループ内で汎用モジュールを呼び出す必要があります。そのため、LOOP 内で独自の追加画面モディフィケーションを実行することができます。
イベント PBO での汎用モジュール呼出の例:
1.
CALL FUNCTION 'FIELD_SELECTION_MODIFY_ALL'
EXPORTING MODULPOOL =
MODULPOOL
DYNPROGRUPPE = DYNGRP.
2.
LOOP AT
SCREEN.
IF SCREEN_GROUP1 NE SPACE AND
SCREEN-GROUP1 NE '000'.
CALL FUNCTION
'FIELD_SELECTION_MODIFY_SINGLE'
EXPORTING
MODULPOOL = MODULPOOL
DYNPROGRUPPE = DYNGRP.
*
特殊なルール
MODIFY SCREEN.
ENDIF.
ENDLOOP.
3.
1 と同様。ただし、特殊なルールに対応する独自の LOOP AT SCREEN を追加します。
個々のケースで、オプション 2 または 3 のどちらによって最適なパフォーマンスが確保されるかを決定する必要があります。
モジュールプール および Dynpro グループ パラメータによって項目選択が決まるので、これらについて影響を更新する必要があります。
モジュールプール パラメータによって、影響項目の現在の値の検索に使用する、メインメモリ内にロードされているモジュールプールが定義されます。
汎用モジュールを呼び出す際に、システム項目 SY-REPID または SY-DYNGR を実パラメータとして直接使用することはできません。代わりに、適切な時点で他の項目にこれらを割り当ててください。例:
MODULPOOL =
SY-REPID.
DYNGRP = SY-DYNGR
モジュールプール の値が現在の SY-REPID の値と異なる場合があります。
Dynpro グループ パラメータが空白の場合、SY-DYNGR の現在の内容が使用されます。これは、モジュールプールパラメータには当てはまりません。値が '_' ( 空白) の場合、項目は変更されないためです。

2 番目の Dynpro でその PBO イベントに次のモジュールコールが含まれている ABAP プログラムについて考えてみましょう。
PROCESS BEFORE OUTPUT.
...
MODULE MODIFY_SCREEN.
モジュール MODIFY_SCREEN に次の汎用モジュール呼出が含まれているとします。
MODULE MODIFY_SCREEN OUTPUT.
CALL
FUNCTION 'FIELD_SELECTION_MODIFY_ALL'
EXPORTING
DYNPROGRUPPE = 'BILD'
MODULPOOL = 'SAPMTXXX'
EXCEPTIONS
OTHERS = 1.
また、Dynpro グループ BILD および対応する ABAP プログラムの影響が上記のように定義されているとします。
トランザクションを呼び出した後、以下のエントリが行われるとします。
変更 を選択すると、次の画面が表示されます。
ただし、'LH' の代わりに航空会社として 'AA' が入力された場合は、次の画面が表示されます。
'LH' を入力すると、項目 SPFLI-AIRPFROM は非表示になります。'AA' を入力すると、項目 SPFLI-AIRPFROM は出発空港として表示されます。
各影響項目は、他の項目に関係なく、変更可能な項目に影響を及ぼします。影響項目をリンクすることが適切な場合もありますが、これは、ヘルプ項目を定義することによってのみ可能です。その場合、汎用モジュールを呼び出す前に、アプリケーションプログラムで設定しておく必要があります。
この制限によって、項目選択の透明性が確保されます。
以下の項目があるとします。
キ
影響項目: F4711
、F4712
変更可能な項目: M4711
以下のケースは、回避策の利用が必要です。
キ
F4711 = 'A'
または
F4712 = 'B'
の場合
M4711
は入力可能
解決策:
キ
SFAW
で
H4711
を影響項目として定義します。
SFAW
で次の条件を定義します。
H4711 = 'AB'
の場合
M4711
の入力オン (
つまり、入力 =
'X')
アプリケーションプログラムで、汎用モジュールを呼び出す前に以下をプログラムしておく必要があります。
IF F4711 = 'A' OR F4712 = 'B'.
H4711 =
'AB'.
ENDIF.
キ
F4711 = 'A'
および
F4712 = 'B'
の場合のみ
M4711
は必須
解決策:
キ
項目選択で次のように更新します。
H4711 = 'AB'
の場合
M4711
は入力必須項目
(
上記の AND
条件についてのみ H4711 =
'AB')
アプリケーションプログラムで、以下を記述します。
IF F4711 = 'A' AND
F4712 = 'B'
H4711 = 'AB'
ELSE.
H4711 =....
ENDIF.
一方、以下のケースは直接表すことができます。
キ
F4711 = 'A'
および
F4712 = 'B'
の場合
M4711
は入力可能。F4711 <> 'A'
または
F4712 <> 'B'
の場合
M4711
は書込不可
解決策:
|
Dynpro: M4711 入力可能 |
|
|
|
|
|
|
|
項目選択: |
|
|
|
|
|
|
|
影響項目 |
F4711 |
値 'A' |
入力 = 'X' |
|
|
|
|
|
|
|
|
|
値 'A1' |
入力 = ' ' |
|
|
|
|
|
|
値 'AX' |
入力 = ' ' |
|
影響項目 |
F4712 |
値 ‘B ’ |
入力 = 'X' |
|
|
|
|
|
|
|
|
|
値 'B1' |
入力 = ' ' |
|
|
|
|
|
|
値 'BX' |
入力 = ' ' |
F4711 = 'A'
または
F4712 = 'B'
の場合
M4711
は入力必須項目
解決策:
|
Dynpro: 必須オフ |
|
|
|
|
|
影響項目 |
F4711 |
値 'A' |
|
|
|
|
|
|
|
必須 = 'X' |
|
影響項目 |
F4712 |
値 ‘B ’ |
|
|
|
|
|
|
|
必須 = 'X' |
影響項目の NOT 条件を定義する機能によって、項目選択定義のその他のバリアントが提供されます。
項目選択 に必要な権限オブジェクトは、" 集中項目選択" (S-FIELDSEL) です。このオブジェクトは、アクティビティとプログラム権限グループで構成されます。後者は、プログラム権限 (ABAP エディタのプログラム属性) から取得されます。
有効なアクティビティ:
'02' =
変更
'03' =
照会
'14' =
Dynpro
に関する項目選択情報の生成
'15' =
項目選択への関連するテーブルの割当
項目選択を変更すると、プログラムフローが変更されます。また、一部のアプリケーションでは、カスタマイジングアクティビティ項目の Dynpro 属性を変更することもできます。このような変更は、モディフィケーションとは見なされません。