本ページでは、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.
この命令を利用することで、例えばあるボタンを押したときにだけ表示される項目を作ったり、逆に非表示になる項目を定義したりすることが可能です。
一歩レベルアップしたABAPエンジニアを目指し、是非このページの内容を理解し自由自在に使いこなせるようになりましょう。
画面の動的制御とは?
画面の動的制御とは、ユーザの入力内容や押したボタンなどに応じて画面の表示を変更する仕組みのことです。
例えば、以下画像はブロックAのラジオボタンに応じてブロックEに表示する項目が変わります。
ボタンDを押すと、ブロックEに表示される項目が変わります。
これが画面の動的制御です。
この実装方法をマスターすることで、例えば項目Aを入力するまでは項目Bを表示しないようにしたり、工夫次第ではユーザに応じて画面に表示する項目数をコントロールすることも可能です。
ABAPでは選択画面を作成する際、次の3つの命令を基本とします。
それぞれABAP初心者の方向けに解説している記事のリンクを載せておきます。是非ご覧ください。
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.
このサンプルコードを実行してできるのが以下のような画面です。
ラジオボタンB(R_B)を選択した場合には、項目C(P_C)だけが表示されます。
LOOP AT SCREENは一体何をしているのか。それを理解する鍵がSCREEN構造です。
構造:SCREEN
LOOP AT SCREEN命令は一言で説明すると、プログラム実行時に自動生成されるSCREEN構造の値を変更する命令です。
SCREEN構造は、画面に関する情報を保持しているシステム項目のようなもので、画面の項目ごとに以下のような情報を持ちます。
項目 | 長さ | データ型 | 内容説明 |
---|---|---|---|
NAME | 132 | C | 名称 |
GROUP1 | 3 | C | 修正グループ1 |
GROUP2 | 3 | C | 修正グループ2 |
GROUP3 | 3 | C | 修正グループ3 |
GROUP4 | 3 | C | 修正グループ4 |
REQUIRED | 1 | C | 必須項目 |
INPUT | 1 | C | 入力可能項目 |
OUTPUT | 1 | C | 表示項目 |
INTENSIFIED | 1 | C | 強調項目 |
INVISIBLE | 1 | C | 非表示エレメント |
LENGTH | 1 | X | 項目長 |
ACTIVE | 1 | C | 有効項目 |
DISPLAY_3D | 1 | C | ボックス |
VALUE_HELP | 1 | C | 入力ヘルプキー |
REQUEST | 1 | C | 入力あり |
VALUES_IN_COMBO | 1 | C | 値ヘルプあり |
COLOR | 10 | I | 色 |
例えば、とある項目の「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点。
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を勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!