【ABAP】SELECT-OPTIONS

概要

1つの項目に対して入力値を複数指定できます。
以下図の通り選択画面に入力項目を表示する命令となります。
SELECT-OPTIONS命令ではPARAMETERS命令と異なり、範囲選択が可能となります。
更にボタンを押下すると赤枠の複数選択画面が表示され、範囲指定だけではなく指定した値を複数入力する事が可能となります。

SELECT-OPTIONS命令の最後にオプションを指定する事で入力必須項目、初期値設定など定義する事が可能となります。
しかし、PARAMETERS命令と異なりラジオボタン、チェックボックスなど複数指定できないオプションは使用できません。

命令文

DATA命令にて値を格納する変数(箱)を宣言します。
宣言した変数に対してSELECT-OPTIONS命令でリンクさせることで選択テーブルの宣言が行われます。

DATA 変数名 TYPE 型.
SELECT-OPTIONS 選択基準 FOR 変数名.

特徴

特徴は以下5つの通り、最初の4つはPARAMETERSと同様の特長ため詳細説明を確認したい場合は「PARAMETERS」の記事で解説していますのでご確認ください。
最後の5つ目については簡単に説明できる内容ではないため「レンジテーブル」の記事をご確認ください。内部テーブルを理解していないと難しい内容も含まれますが理解していなくても特徴は抑えられると思います。
選択テーブルとレンジテーブルは定義の仕方は違うが中身は一緒です。
具体的にどう異なるのか記事にて説明しています。

  • 選択基準の名称(変数)は最大8桁
  • 命令した宣言位置によって選択画面の位置が決まる
  • データ型F、参照タイプ(TYPE REF TO)、集約タイプを使用する事は出来ない
  • 選択画面に表示される名称は選択基準の名称(変数)が表示される
  • 選択基準は変数ではなく選択テーブルとして扱われる

オプション

今回紹介するオプションは8個あります。
SELECT-OPTIONS命令特有のオプションは「NO-EXTENSION」、「NO INTERVALS」の2つとなります。
そのほかはPARAMETERS命令でも使用できるオプションとなっており、主観的に使用頻度の高い順で並べています。
「NO-EXTENSION」、「NO INTERVALS」については紹介のため上位にしており、使用頻度はそこまで高くないと思います。
簡単に説明をしていますが表現として分かりにくいのでサンプルコーディングをご確認頂き実際に動作確認することをお勧めします。

  • 複数選択ボタンが選択画面に表示されません。
  • 複数選択が出来ないため、PARAMETERS命令または範囲指定のみとなります。
  • 選択画面に2番目の項目(TO)が表示されません。
  • 複数ボタンは存在するため、複数選択画面から複数指定や範囲指定は可能となります。
    そのためチェックロジックを組込み、範囲指定されてたらエラーとするなど工夫が必要です。
  • 項目に値を入力しないと選択画面で入力必須のエラーとなります。
  • 項目に初めから設定した値が入力されます。
  • 大文字小文字の入力が可能となります。
  • このオプションを使用しない場合は自動で全て大文字に変換されます。
  • 選択画面に表示される項目の長さが指定されます。
  • 実際に入力できる長さは項目の長さのままです。
    例えば項目の長さ10、このオプションで指定した長さ5の場合でも長さ10の入力が可能
  • 上記より使用する場合はチェックロジックやOFFSET命令で長さを切出す等の考慮が必要です。
  • XXXXXはABAPディクショナリで定義された検索ヘルプを指定します。
  • 入力項目でF4キー押下または入力ヘルプボタンを押下する事で検索ヘルプの使用ができます。
  • ABAPディクショナリで定義した検索ヘルプの内容が表示されます。
  • 選択画面から項目が表示されなくなります。
  • 項目が表示されないため選択画面から見えませんが、項目は存在しています。
  • このオプションを使用せず、バリアントを用いる事が一般的です。
    ⇒非表示、表示の制御が必要となるとロジックが複雑になる可能性があるため

サンプルソースコード

今回紹介したオプションを用いていますので実際に動かして確認すると良いかと思います。
実際の選択画面とその結果についてはサンプルの画像の通りとなります。
入力値によって出力結果はかわりますのでお試しください。

以下選択画面となります。
複数選択ボタンを押すと複数値指定することができたり、入力ボックスをダブルクリックすると不等号を選択する事ができます。

上記入力内容に対する出力結果となります。
入力された値が全て出力されていることが分かれば良いです。
入力以外にも値が格納されておりどの様な意味があるのかについてはレンジテーブル(RANGE TABLE)の記事で解説していますので気になる様でしたらご確認ください。

DATA:W_BUKRS    TYPE T001-BUKRS,
     W_ERDAT    TYPE VBAK-ERDAT,
     W_AUART    TYPE VBAK-AUART,
     W_TEST(10) TYPE C.

SELECT-OPTIONS S_BUKRS FOR W_BUKRS.
*複数選択不可
SELECT-OPTIONS S_ERDAT FOR W_ERDAT NO-EXTENSION.
*範囲指定の非表示
SELECT-OPTIONS S_AUART FOR W_AUART NO INTERVALS.
*必須項目
SELECT-OPTIONS: S_TEST1 FOR W_TEST  OBLIGATORY,
*初期値設定
                S_TEST2 FOR W_TEST  DEFAULT 'SA',
*項目非表示
                S_TEST3 FOR W_TEST  NO-DISPLAY,
*表示項目長さ指定
                S_TEST4 FOR W_TEST  VISIBLE LENGTH 5,
*小文字使用可
                S_TEST5 FOR W_TEST  LOWER CASE,
*検索ヘルプ
                S_TEST6 FOR W_TEST  MATCHCODE OBJECT C_T001.
*オプションの複数指定も可能
*SELECT-OPTIONS S_TEST7 FOR W_TEST  NO-EXTENSION NO INTERVALS.

S_TEST3-SIGN   = 'I'.
S_TEST3-OPTION = 'EQ'.
S_TEST3-LOW    = 'テスト'.
S_TEST3-HIGH   = 'テスト2'.
APPEND S_TEST3.

IF S_BUKRS IS NOT INITIAL.
LOOP AT S_BUKRS.
WRITE: /'S_BUKRS-SIGN  :', S_BUKRS-SIGN,
       /'S_BUKRS-OPTION:', S_BUKRS-OPTION,
       /'S_BUKRS-LOW   :', S_BUKRS-LOW,
       /'S_BUKRS-HIGH  :', S_BUKRS-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_ERDAT IS NOT INITIAL.
LOOP AT S_ERDAT.
WRITE: / 'S_ERDAT-SIGN  :', S_ERDAT-SIGN,
       / 'S_ERDAT-OPTION:', S_ERDAT-OPTION,
       / 'S_ERDAT-LOW   :', S_ERDAT-LOW,
       / 'S_ERDAT-HIGH  :', S_ERDAT-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_AUART IS NOT INITIAL.
LOOP AT S_AUART.
WRITE: / 'S_AUART-SIGN  :', S_AUART-SIGN,
       / 'S_AUART-OPTION:', S_AUART-OPTION,
       / 'S_AUART-LOW   :', S_AUART-LOW,
       / 'S_AUART-HIGH  :', S_AUART-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST1 IS NOT INITIAL.
LOOP AT S_TEST1.
WRITE: / 'S_TEST1-SIGN  :', S_TEST1-SIGN,
       / 'S_TEST1-OPTION:', S_TEST1-OPTION,
       / 'S_TEST1-LOW   :', S_TEST1-LOW,
       / 'S_TEST1-HIGH  :', S_TEST1-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST2 IS NOT INITIAL.
LOOP AT S_TEST2.
WRITE: / 'S_TEST2-SIGN  :', S_TEST2-SIGN,
       / 'S_TEST2-OPTION:', S_TEST2-OPTION,
       / 'S_TEST2-LOW   :', S_TEST2-LOW,
       / 'S_TEST2-HIGH  :', S_TEST2-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST3 IS NOT INITIAL.
LOOP AT S_TEST3.
WRITE: / 'S_TEST3-SIGN  :', S_TEST3-SIGN,
       / 'S_TEST3-OPTION:', S_TEST3-OPTION,
       / 'S_TEST3-LOW   :', S_TEST3-LOW,
       / 'S_TEST3-HIGH  :', S_TEST3-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST4 IS NOT INITIAL.
LOOP AT S_TEST4.
WRITE: / 'S_TEST4-SIGN  :', S_TEST4-SIGN,
       / 'S_TEST4-OPTION:', S_TEST4-OPTION,
       / 'S_TEST4-LOW   :', S_TEST4-LOW,
       / 'S_TEST4-HIGH  :', S_TEST4-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST5 IS NOT INITIAL.
LOOP AT S_TEST5.
WRITE: / 'S_TEST5-SIGN  :', S_TEST5-SIGN,
       / 'S_TEST5-OPTION:', S_TEST5-OPTION,
       / 'S_TEST5-LOW   :', S_TEST5-LOW,
       / 'S_TEST5-HIGH  :', S_TEST5-HIGH.
ENDLOOP.
WRITE: / .
ENDIF.

IF S_TEST6 IS NOT INITIAL.
LOOP AT S_TEST6.
WRITE: / 'S_TEST6-SIGN  :', S_TEST6-SIGN,
       / 'S_TEST6-OPTION:', S_TEST6-OPTION,
       / 'S_TEST6-LOW   :', S_TEST6-LOW,
       / 'S_TEST6-HIGH  :', S_TEST6-HIGH.
ENDLOOP.
ENDIF.