ABAP ラジオボタンで選択項目を動的に変更する方法

  選択画面&イベント

概要

選択されたラジオボタンによって各項目の入力可能・入力不可を動的に制御する方法を紹介したいと思う。

サンプルコード:単一

PARAMETERS r_bukrs RADIOBUTTON GROUP rg DEFAULT 'X' USER-COMMAND command.
PARAMETERS r_vkorg RADIOBUTTON GROUP rg.
PARAMETERS p_bukrs TYPE bukrs.
PARAMETERS p_vkorg TYPE vkorg.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE screen-name.
      WHEN 'P_BUKRS'.
        IF r_bukrs = 'X'.
          screen-input = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
      WHEN 'P_VKORG'.
        IF r_vkorg = 'X'.
          screen-input = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

説明

今回は、r_bukrsを選択された場合、p_bukrsを入力可能にしp_vkorgを入力不可にする。
また、逆にr_vkorgを選択された場合、p_bukrsを入力不可にしp_vkorgを入力可能にするというプログラムである。
気をつけて頂きたいのがAT SELECTION-SCREEN OUTPUT.のイベントブロックが実行されるようにラジオボタンにUSER-COMMANDのオプションをつける事だ。
SCREENは選択画面の情報をもっているので、ループしSCREEN-NAMEで処理対象の選択項目を判断する。
その後、どちらのラジオボタンが選択されているかを確認し、SCREEN-INPUTに1(入力可能)か0(入力不可)の値を設定する。
最後にMODIFYでSCREENの値を反映する。

上記の例は一つ一つの項目を設定したが、複数の項目を同時に設定したい場合はグループを設定する事で判断が可能だ。

サンプルコード:グループ

PARAMETERS r_bukrs RADIOBUTTON GROUP rg DEFAULT 'X' USER-COMMAND command.
PARAMETERS r_vkorg RADIOBUTTON GROUP rg.

PARAMETERS p_bukrs TYPE bukrs MODIF ID BUK.
PARAMETERS p_land1 TYPE LAND1 MODIF ID BUK.

PARAMETERS p_vkorg TYPE vkorg MODIF ID VKO.
PARAMETERS p_vtweg TYPE vtweg MODIF ID VKO.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    CASE screen-group1.
      WHEN 'BUK'.
        IF r_bukrs = 'X'.
          screen-input = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
      WHEN 'VKO'.
        IF r_vkorg = 'X'.
          screen-input = 1.
        ELSE.
          screen-input = 0.
        ENDIF.
    ENDCASE.
    MODIFY SCREEN.
  ENDLOOP.

説明

各選択項目にMODIF IDのオプションをつけると、SCREEN-GROUP1に値が設定される。
その値を使用する事が各選択項目の名前を一つずつ確認する必要がなくなる。
選択項目が多い場合にはプログラムソースを簡略化する事ができるのでお勧めだ。

補足

構造:screenは選択画面のさまざまな情報を保持しており、入力可能・入力不可だけではなく
項目自体を表示・非表示(screen-invisible)にしたり、必須・任意(screen-required)を変更したりする事が可能だ。