【ABAP】LOOP AT SCREEN―画面の動的制御を3分で解説

ABAP

本ページでは、ABAPで動的な画面制御を実装するために必要となる「LOOP AT SCREEN」命令の基本知識を解説します。

*----------------------------------------------------------------------*
*   画面処理(AT SELECTION-SCREEN OUTPUT)
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* 選択画面の動的制御
LOOP AT SCREEN.
  CASE SCREEN-GROUP1.
    WHEN 'DL'.
      IF P_DELFLG = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    WHEN 'UP'.
      IF P_UPDFLG = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
  ENDCASE.
  MODIFY SCREEN.
ENDLOOP.

この命令を利用することで、例えばあるボタンを押したときにだけ表示される項目を作ったり、逆に非表示になる項目を定義したりすることが可能です。

このページで学べる内容
  • 画面の動的制御とは?
  • LOOP AT SCREEN命令の使い方
    • SCREEN構造
  • サンプルコードと注意点

一歩レベルアップしたABAPエンジニアを目指し、是非このページの内容を理解し自由自在に使いこなせるようになりましょう。

スポンサーリンク
スポンサーリンク

画面の動的制御とは?

画面の動的制御とは、ユーザの入力内容や押したボタンなどに応じて画面の表示を変更する仕組みのことです。

例えば、以下画像はブロックAのラジオボタンに応じてブロックEに表示する項目が変わります。

変更前

ボタンDを押すと、ブロックEに表示される項目が変わります。

変更後

これが画面の動的制御です。

この実装方法をマスターすることで、例えば項目Aを入力するまでは項目Bを表示しないようにしたり、工夫次第ではユーザに応じて画面に表示する項目数をコントロールすることも可能です。

LOOP AT SCREEN命令

LOOP AT SCREEN命令はこれで一つの命令です。LOOP命令と似ている部分はあるのですが、一旦は別ものとして理解するのがおすすめです。

早速、LOOP AT SCREENを用いたコードをご覧ください。

*----------------------------------------------------------------------*
*   選択画面
*----------------------------------------------------------------------*

PARAMETERS:
 R_B RADIOBUTTON GROUP G01 DEFAULT 'X' USER-COMMAND dummy,
 R_D RADIOBUTTON GROUP G01.
 P_C      TYPE C.
 P_HENKAN TYPE C.

*----------------------------------------------------------------------*
*   画面処理(AT SELECTION-SCREEN OUTPUT)
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* 選択画面の動的制御
LOOP AT SCREEN.
  CASE SCREEN-NAME.
    WHEN 'P_C'.
      IF R_B = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    WHEN 'P_HENKAN'.
      IF R_D = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
  ENDCASE.
  MODIFY SCREEN.
ENDLOOP.

このサンプルコードを実行してできるのが以下のような画面です。

画像に alt 属性が指定されていません。ファイル名: image-3-1024x190.png

ラジオボタンB(R_B)を選択した場合には、項目C(P_C)だけが表示されます。

LOOP AT SCREENは一体何をしているのか。それを理解する鍵がSCREEN構造です。

構造:SCREEN

LOOP AT SCREEN命令は一言で説明すると、プログラム実行時に自動生成されるSCREEN構造の値を変更する命令です。

SCREEN構造は、画面に関する情報を保持しているシステム項目のようなもので、画面の項目ごとに以下のような情報を持ちます。

項目長さデータ型内容説明
NAME132C名称
GROUP13C修正グループ1
GROUP23C修正グループ2
GROUP33C修正グループ3
GROUP43C修正グループ4
REQUIRED1C必須項目
INPUT1C入力可能項目
OUTPUT1C表示項目
INTENSIFIED1C強調項目
INVISIBLE1C非表示エレメント
LENGTH1X項目長
ACTIVE1C有効項目
DISPLAY_3D1Cボックス
VALUE_HELP1C入力ヘルプキー
REQUEST1C入力あり
VALUES_IN_COMBO1C値ヘルプあり
COLOR10I

例えば、とある項目の「SCREEN-ACTIVE」の値を0にすると、その項目は画面上表示されなくなります。このほかにも、「SCREEN-REQUIRED」を1にすることで当該項目を必須項目としたりなど用途は様々です。

LOOP AT SCREEN.
  CASE SCREEN-NAME.
    WHEN 'P_C'.
      IF R_B = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    WHEN 'P_HENKAN'.
      IF R_D = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
  ENDCASE.
  MODIFY SCREEN.
ENDLOOP.

LOOP AT SCREEN命令でネストされているCASE文については、こちらの記事をご確認ください。

MODIF(修正グループ)を利用する方法

これまでのやり方では、例えば項目Aを選択した場合に「項目B~D」の属性をすべて変更したい場合には、1つ1つ地道にコーディングするしかありませんでした。

ここでは、あらかじめ画面項目をグループ化しておき、そのグループに含まれる画面項目の属性を一気に変更する方法をご紹介します。

*----------------------------------------------------------------------*
*   選択画面
*----------------------------------------------------------------------*

PARAMETERS:
 R_B RADIOBUTTON GROUP G01 USER-COMMAND dummy,
 R_D RADIOBUTTON GROUP G01,
 P_C1      TYPE C MODIF ID DL,
 P_C2      TYPE C MODIF ID DL,
 P_HENKAN1 TYPE C MODIF ID UP,
 P_HENKAN2 TYPE C MODIF ID UP.

*----------------------------------------------------------------------*
*   画面処理(AT SELECTION-SCREEN OUTPUT)
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.

* 選択画面の動的制御
LOOP AT SCREEN.
  CASE SCREEN-GROUP1.
    WHEN 'DL'.
      IF P_DELFLG = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    WHEN 'UP'.
      IF P_UPDFLG = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
  ENDCASE.
  MODIFY SCREEN.
ENDLOOP.

ポイントは2点。

MODIF ID(修正グループを利用するポイント)
  1. 画面項目定義時に「MODIF ID」オプションを利用しグループ化する。
    グループ番号は、SCREEN構造の「GROUP1」に格納される。
  2. LOOP AT SCREEN命令で、SCREEN-GROPU1の値に応じたCASE文とする。

MODIFY SCREEN

忘れがちですが、LOOP AT SCREEN命令には必ず「MODIFY SCREEN」命令をネストしましょう。MODIFY SCREEN命令によって画面属性の変更が確定されますので、この命令を書き忘れると、画面は動的に変更されません。

LOOP AT SCREEN.
~
  MODIFY SCREEN.
ENDLOOP.

AT SELECTION-SCREEN OUTPUT

LOOP AT SCREEN命令は、イベント「AT SELECTION-SCREEN OUTPUT」でのみ実行されます。

「AT SELECTION-SCREEN OUTPUT」イベントはいつ動くか?答えは画面が表示される前と選択画面でENTERボタンを押したとき。したがって、実は項目Aを選択しただけでは画面は動的に変わらないのです。

そこで利用するのが、USER-COMMANDオプション。

PARAMETERS:
 R_B RADIOBUTTON GROUP G01 USER-COMMAND dummy,
 R_D RADIOBUTTON GROUP G01.

項目定義時にUSER-COMMANDオプションを定義しておくことで、当該ラジオボタンを選択するたびにUSER-COMMAND「dummy」が内部的に実行されるようになります。

USER-COMMANDオプションは、語弊を恐れずに言えば「ENTERボタンを押す」という行為を内部的に実行することになり、「AT SELECTION-SCREEN OUTPUT」イベントをトリガーできるようになります。

初めてコーディングした際に、忘れがちなポイントですので注意しておきましょう。

イベントブロックとは?

ABAPはイベントドリブン言語ですので、イベントについての理解が重要です。

イベントとは、本ページで例示したように「ENTERボタンを押したとき」とか、「画面を表示するとき」などプログラム実行時におけるフェーズの切り替わりを表すもの。

以下の記事でABAPのイベントについて初心者向けに解説しておりますので、不安なかたはこちらをチェック!

ABAPを1から勉強したい方は

ABAPを1から学習したい方のために、ABAPに関わる基本知識を1つのページにまとめました。

こちらの記事では、ABAPを用いて簡単な機能を実装できるようにするための必須知識を解説しております。今、本サイトで一番人気の記事ですので是非合わせてご覧ください。

タイトルとURLをコピーしました