ABAP 選択画面(Selection Screen)の設定を動的に変更する方法

  選択画面&イベント

概要

選択画面の各項目には属性を持っており、ABAP プログラムの実行時に、特定の命令を使用して、各画面項目の属性の一部を事前定義された構造 screen に読み込むことができます。その後、これらの属性を変更することができます。

構造:SCREEN

項目名長さ意味
NAME132  Char 画面項目の名称
GROUP1 3 Char モディフィケーショングループ 1
GROUP2 3 Char モディフィケーショングループ 2
GROUP3 3 Char モディフィケーショングループ 3
GROUP4 3 Char モディフィケーショングループ 4
REQUIRED 1 Char 必須入力項目
INPUT 1 Char 入力項目
OUTPUT 1 Char 出力専用項目
INTENSIFIED 1 Char 強調表示
INVISIBLE 1 Char 非表示
LENGTH1X表示長
ACTIVE1Char有効
DISPLAY_3D1Char3 次元ボックス
VALUE_HELP1Char入力ヘルプボタン表示
REQUEST1Char入力あり
VALUE_IN_COMBO1Char
COLOR4I

記述箇所

プログラム内であれば問題ないが、選択画面が表示される前、表示中に動的に変更するのが一般的だろう。選択画面の表示前であれば、INITIALIZATIONイベントに記述しよう。表示中であればSELECTION-SCREEN OUTPUTイベントで入力された値を元に変更したりする事ができる。ラジオボタンで選択項目を動的に変更も参考にしよう。

サンプルコード:SCREEN-NAME (名前)

PARAMETER:
  P_SEL1 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'P_SEL1'.
*     処理記述
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

SCREEN-NAMEにはParameter、Select-Optionsで定義した名称が格納されている。SCREENには自動生成された選択画面には様々な名称のデータが含まれている為、変更を行う際は必ずNAMEで特定の項目のみロジックが機能するようIF文/CASE文で条件分岐させよう。

サンプルコード:SCREEN-GROUP1 ~GROUP4 (モディフィケーショングループ)

PARAMETER:
  P_SEL1 TYPE MATNR MODIF ID G1,
  P_SEL2 TYPE MATNR.
  P_SEL3 TYPE MATNR MODIF ID G1.

INITIALIZATION.
  LOOP AT SCREEN.
    IF SCREEN-GROUP1 = 'G1'.
* 処理記述
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

上記のように複数の選択項目に同一のグループIDを設定する事で、SCREEN-GROUP1でその値をでき、同じ処理を実行するのが容易になる。GROUP2~4に関しては選択画面が自動生成された際に値が設定されているケースがある。SE51:スクリーンペインタで確認してみよう。選択画面を自身で作っているDynpro画面であれば、GROUP1~4をフル活用してシンプルな画面を生成しよう。

サンプルコード:SCREEN-REQUIRED(必須入力項目)

PARAMETER:
  P_SEL1 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'P_SEL1'.
      SCREEN-REQUIRED = 1. "必須
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

上記のようにSCREEN-REQUIREDに’1’を設定する事で、選択項目が必須入力となり、OBLIGATORYオプションが有る場合と同じ効果となる。またOBLIGATORYオプションが有る項目に対して、SCREEN-REQUIREDを’0’に設定すると必須入力項目で無くなる。

サンプルコード:SCREEN-INPUT(入力項目)

PARAMETER:
  P_SEL1 TYPE MATNR,
  P_SEL2 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'P_SEL1'.
      SCREEN-INPUT = 1. "入力可能
    ENDIF.
    IF SCREEN-NAME = 'P_SEL2'.
      SCREEN-INPUT = 0. "入力不可
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.

上記のようにSCREEN-INPUTに’1’を設定する事で、選択項目が入力可能(デフォルト)となり、SCREEN-INPUTを’0’に設定すると入力不可となる。入力不可は画面項目が表示された際にグレー表示される。

サンプルコード:SCREEN-OUTPUT(出力専用項目)

SCREEN-OUPUTに’1’を設定しても、’0’を設定しても変化はない。
どのように使う事ができるか不明である。

サンプルコード:SCREEN-INTENSIFIED(強調表示)

PARAMETER:
  P_SEL1 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-NAME = 'P_SEL1'.
    SCREEN-INTENSIFIED = 1. "強調表示
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

SCREEN-INTENSIFIEDに’1’を設定した状態で、画面から値を入力すると若干赤く表示される。

サンプルコード:SCREEN-INVISIBLE(非表示)

PARAMETER:
  P_SEL1 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-NAME = 'P_SEL1'.
    SCREEN-INVISIBLE = 1. "非表示
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

SCREEN-INVISIBLEに’1’を設定した場合、入力欄が「*******」となる。GUI ログイン時のパスワード入力欄の用に、入力中の文字が非表示となる設定となっている。

サンプルコード:SCREEN-LENGTH(項目長)

PARAMETER:
  P_SEL1 TYPE MATNR.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-NAME = 'P_SEL1'.
    SCREEN-LENGTH = 5. "5桁
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

SCREEN-LENGTHには表示した桁数を設定する事ができる。MATNR(品目コード)は18桁の項目のため、18桁の入力欄が表示されるが、上記のように5を設定すると5桁までしか入力できなくなる。18桁(最大桁数)以上の値を設定しても効果はないぞ。

サンプルコード:SCREEN-ACTIVE(活性)

PARAMETER:
  P_SEL1 TYPE MATNR,
  P_SEL2 TYPE MATNR MODIF ID MOD.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-NAME = 'P_SEL1'.
    SCREEN-ACTIVE = 0. "入力項目のみ非活性
  ENDIF.
  IF SCREEN-GROUP1 = 'MOD'.
    SCREEN-ACTIVE = 0. "行全体を非活性
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

SCREEN-ACTIVEに’0’を設定すると入力欄が消える(表示されなくなる)。但し、選択テキストは表示されているので該当行自体が無くなる訳ではないことに注意しよう。全て非表示にしたい場合は、MODIF IDを指定して設定を行おう。

サンプルコード:SCREEN-DISPLAY_3D(3D次元)

PARAMETER:
  P_SEL1 TYPE MATNR MODIF ID MOD.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-GROUP1 = 'MOD'.
    SCREEN-DISPLAY_3D = 1.
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

選択テキストを3D表示する為の項目なので、MODIF IDで行全体が適用されるよう値を設定しよう。3D表示になるとテキストの枠が窪んだ風に表示されるぞ。

サンプルコード:SCREEN-VALUE_HELP(検索ヘルプ)

PARAMETER:
  P_SEL1 TYPE MATNR MODIF ID MOD.

INITIALIZATION.
  LOOP AT SCREEN.
  IF SCREEN-GROUP1 = 'MOD'.
    SCREEN-VALUE_HELP = 0.
  ENDIF.
  MODIFY SCREEN.
ENDLOOP.

検索ヘルプを無効にする事が可能だ。元々検索ヘルプが設定されていない項目に対して’1’を設定しても何も効果がないぞ。

サンプルコード:SCREEN-REQUEST(入力あり)

サンプルコード:SCREEN-VALUES_IN_COMBO()

サンプルコード:SCREEN-COLOR()