PR

【ABAP】SELECT-OPTIONS命令の使い方を3分で解説

ABAP

このページでは、ABAP初心者向けに選択画面作成時に利用する ”SELECT-OPTIONS” 命令について説明します。

SELECT-OPTIONS命令は、SAPの画面項目を定義する命令

以下のサンプル画面の中における項目「連番」「処理ステータス」などはSELECT-OPTIONS命令によって定義されています。

SELECT-OPTIONS命令
図1:SELECT-OPTIONS命令サンプル

このページでは、SELECT-OPTIONS命令の意味や使い方のコツ・利用する際の注意点について1から解説していきます。

このページで学べる内容
  • SELECT-OPTIONS命令の意味と使い方・構文ルール
    • PARAMETERS命令との違い
  • SELECT-OPTIONS命令とレンジテーブル
  • SELECT-OPTIONS命令各種オプション
    • OBLIGATORY:必須入力
    • NO-DISPLAY:項目の非表示
    • NO-EXTENSION:複数選択の禁止
    • NO-INTERVALS:2つめの項目が非表示

ABAPエンジニアを目指す方であれば、絶対に知っておきたい超・重要知識です。3分ぐらいで読めますので、是非最後までご覧ください。

参考 ABAPの基本構文ルール

スポンサーリンク

SELECT-OPTIONS命令とは?

SELECT-OPTIONS命令は、画面の項目を定義する命令です。

↓画像の「連番」「処理ステータス」「販売伝票タイプ」は、SELECT-OPTIONS命令で定義されている項目。

SELECT-OPTIONS命令
図2:SELECT-OPTIONS命令

このようなFROM~TO指定できる項目を作るのが、SELECT-OPTIONS命令です。

「販売組織」項目などのように単一の画面項目はPARAMETERS命令によって定義されています。

PARAMETERS命令

SELECT-OPTIONS命令と合わせて覚えておきたいのがPARAMETERS命令。SELECT-OPTIONS命令と同じように選択画面内に選択項目を作成する命令です。

SELECT-OPTIONS命令と異なり、入力項目は1か所のみ(つまり範囲指定・複数検索が行えません)です。

構文ルール:SELECT-OPTIONS命令

それでは、早速構文ルールを学習していきましょう。

SELECT-OPTIONS命令の基本構文ルールは以下の通り。

SELECT-OPTIONS <sel> FOR <dbfield> [addition...].

" <sel>はセレクトオプションの名前を表します。
" <dbfield>は対象となるデータベースフィールドを表します。

PARAMETERS命令と異なるのが、TYPEオプションではなくFORを利用すること。また、FORの後にはデータ型ではなく、変数などのデータオブジェクトを指定する必要があること。(データ型を指定できない理由は次の章で詳しく説明します。)

早速サンプルコードを見てみましょう。

SELECT-OPTIONS: 
  S_SEQNO   FOR  GW_SCREEN-SEQNO,                 "連番"
  S_STATUS  FOR  GW_SCREEN-STATUS OBLIGATORY,     "処理ステータス"
  S_AUART   FOR  GW_SCREEN-AUART.                 "販売伝票タイプ" 

SELECT-OPTIONSに続けて、"項目名" を指定します。(上記サンプルコードで言えば、"S_SEQNO" "S_STATUS" "S_AUART")

※名称は、8文字以内でなければいけませんが、それ以外の制約は特にありません。コーディング規約に沿って分かりやすい名称を指定すればOK。

選択基準は普通複数あるので、実際の現場ではチェーン形式で記載するのが一般的です。

基本的な考え方はDATA命令とあまり違わないように感じるかもしれません。DATA命令の場合は、オペラント部の指定が "TYPE" であったのに対して、SELECT-OPTIONSの場合は "FOR" が続く点だけが異なるように見えます。

実は、このTYPEとFORの違いが重要です。この微妙な違いの理解が、SELECT-OPTIONS命令では重要なポイントです。

SELECT-OPTIONS命令とレンジテーブル

PARAMETERS命令と、SELECT-OPTIONS命令の違いで理解しておきたい重要なポイントは、SELECT-OPTIONS命令が生成するデータオブジェクトはレンジテーブル型になるという点です。

レンジテーブルとは

その名の通り、Renge(日本語訳:範囲)を保持するテーブルです。

以下のように、4つの項目から成立する内部テーブルの一種です。

レンジテーブル
図3:レンジテーブル

上記レンジテーブルには、1-30の値が格納されているということを示します。

レンジテーブルの基本を1から復習しておきたい方は以下の記事をご覧ください。

FORオプションの後で指定するデータ型は、このレンジテーブルの「HIGH」項目と「LOW」項目のデータ型になります。

レンジテーブル
再掲:レンジテーブル

単一項目のPARAMETERS命令とはこの点で大きく異なりますのでしっかり区別して理解しておきましょう。

SELECT-OPTIONS命令の基本の理解はこの辺でOK。以下にSELECT-OPTIONS命令を利用した基本的なサンプルコードを記載します。

サンプルコード1

REPORT ZMYREPORT.

* Material NumberのためのSelect-options文
SELECT-OPTIONS s_matnr FOR mara-matnr.

START-OF-SELECTION.

  * 入力された範囲でMaterialを選択
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択されたMaterialを表示
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

参考 START-OF-SELECTION / SELECT / LOOP / WRITE

このプログラムは、まず最初にSELECT-OPTIONSを使用してユーザーからのMaterial Numberの入力を受け付けます。その後、START-OF-SELECTIONイベントが始まると、入力されたMaterial Numberの範囲に基づいてMARAテーブルからデータを選択。選択された各材料について、その番号と説明を出力します。

サンプルコード2

REPORT ZMYREPORT2.

* Select-options文で国名の入力を受け付ける
SELECT-OPTIONS s_country FOR kna1-land1.

START-OF-SELECTION.

  * 入力された国名の範囲で顧客を選択します
  SELECT kunnr name1 land1 FROM kna1 INTO TABLE @DATA(it_kna1) WHERE land1 IN @s_country.

  * 選択された顧客を表示します
  LOOP AT it_kna1 INTO DATA(wa_kna1).
    WRITE: / '顧客番号:', wa_kna1-kunnr, '名前:', wa_kna1-name1, '国:', wa_kna1-land1.
  ENDLOOP.

このプログラムでもSELECT-OPTIONSを使用してユーザーによる国名の入力を受け付け。その後、START-OF-SELECTIONイベントが始まると、入力された国名の範囲でKNA1テーブルからデータを選択するという仕組み。最後に、選択された各顧客に対して、ループ内でその顧客番号、名前、および国を出力します。

このコードもシンプルな例示です。実際の開発では、エラーハンドリングや効率的なデータ取得のためのロジックなど、さらに複雑な要素が必要になる点に注意。

ここからは、SELECT-OPTIONS命令の様々なオプションについてご説明します。

SELECT-OPTIONS命令の様々なオプション

ABAPのSELECT-OPTIONS命令の主なオプションを以下に表形式で示します。

オプション説明
DEFAULT選択オプションの初期値を設定します。
LOWER CASE入力値を小文字として受け入れます(デフォルトは大文字)。
MEMORY IDパラメータIDを使用して選択オプションを初期化します。
MODIF ID画面の特定の部分を変更するための修飾IDを設定します。
NO-DISPLAY選択画面にフィールドを表示しません。
NO-EXTENSIONユーザーが範囲行を追加することを制限します。
NO INTERVALS選択画面で範囲指定を許可しません。個々の値のみを入力できます。
NO-UPPER-LIMIT選択オプションに上限値を入力することを制限します。
NO-LOWER-LIMIT選択オプションに下限値を入力することを制限します。
OBLIGATORYユーザーが値を必ず入力する必要があることを指定します。
AS CHECKBOX選択オプションをチェックボックスとして表示します。

これらのオプションを利用することで、SELECT-OPTIONS命令の動作をより細かく制御し、アプリケーションの特定の要件に合わせてカスタマイズすることが可能になります。

ここでは、その中から覚えておくと便利なオプション4つに絞って、サンプルコード付きで解説していきます。

OBLIGATORY:必須入力

OBLIGATORYオプションは、入力項目の「FROM」の部分への入力を必須化します。

SELECT-OPTIONS: 
   S_SEQNO   FOR  GW_SCREEN-SEQNO                       ,   "連番
   S_STATUS  FOR  GW_SCREEN-STATUS OBLIGATORY           ,   "処理ステータス
   S_AUART   FOR  GW_SCREEN-AUART                       .   "販売伝票タイプ
OBLIGATORYY

上記の通りでコーディングすると、入力項目「S_STATUS」の最初の入力項目(FROM)が必須となります。

必須入力項目は✅マークが付与されます。

必須化されると、当該項目が未入力の状態でプログラムを実行することはできません。

サンプルコード3

REPORT ZMYREPORT.

* 材料番号(Material Number)のためのSelect-options文、OBLIGATORYオプション付き
SELECT-OPTIONS s_matnr FOR mara-matnr OBLIGATORY.

START-OF-SELECTION.

  * 入力された範囲で材料を選択
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択された材料を表示
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

このプログラムでは、最初にSELECT-OPTIONSを使用してユーザーによる材料番号の入力を受け付けます。OBLIGATORYオプションが指定されているため、ユーザーは必ず何らかの材料番号を入力しなければなりません。

NO-DISPLAY:項目の非表示

このオプションを利用すると、入力項目が画面上に表示されなくなります。

SELECT-OPTIONS: 
   S_SEQNO   FOR  GW_SCREEN-SEQNO  NO-DISPALY           ,   "連番
   S_STATUS  FOR  GW_SCREEN-STATUS OBLIGATORY           ,   "処理ステータス
   S_AUART   FOR  GW_SCREEN-AUART                       .   "販売伝票タイプ

上記のようにコーディングすると、項目「S_SEQNO」は画面上に表示されなくなります。

ただし、プログラム内でその範囲を指定することは可能です。これは、特定のパラメータについてはユーザーの入力を必要とせず、プログラム内で自動的に指定するような場合に役立ちます。

サンプルコード4

REPORT ZMYREPORT.

* Material TypeのためのSelect-options文、NO-DISPLAYオプション付き
SELECT-OPTIONS s_mtart FOR mara-mtart NO-DISPLAY.

START-OF-SELECTION.

  * 材料タイプをプログラム内で指定します
  s_mtart-sign = 'I'.
  s_mtart-option = 'EQ'.
  s_mtart-low = 'ROH'.
  APPEND s_mtart.

  * 指定された材料タイプの範囲で材料を選択します
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE mtart IN @s_mtart.

  * 選択された材料を表示します
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

参考 APPEND命令

このプログラムでは、最初にNO-DISPLAYオプション付きでSELECT-OPTIONSを宣言。その後、START-OF-SELECTIONイベント内で、材料タイプ(ここでは'ROH')を指定。指定した材料タイプでMARAテーブルからデータを選択するというプログラムです。

このように、NO-DISPLAYオプションはユーザー入力が不要なパラメータを扱う場合に便利です。

NO-EXTENSION:複数選択の禁止

このオプションを利用すると、画面から複数選択を行うための押ボタンが消えます。

NO-EXTENSIONオプション
図4:NO-EXTENSIONオプション

そのため、このオプションを利用した場合はFROM~TOで指定するか、FROMだけを指定する入力しか行えなくなります。

SELECT-OPTIONS: 
   S_SEQNO   FOR  GW_SCREEN-SEQNO  NO-DISPALY           ,   "連番
   S_STATUS  FOR  GW_SCREEN-STATUS OBLIGATORY           ,   "処理ステータス
   S_AUART   FOR  GW_SCREEN-AUART  NO-EXTENSION         .   "販売伝票タイプ

サンプルコード5

REPORT ZMYREPORT.

* 材料番号(Material Number)のためのSelect-options文、NO-EXTENSIONオプション付き
SELECT-OPTIONS s_matnr FOR mara-matnr NO-EXTENSION.

START-OF-SELECTION.

  * 入力された範囲で材料を選択します
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択された材料を表示します
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

このプログラムでは、最初にSELECT-OPTIONSを使用してユーザーによる材料番号の入力を受け付けます。NO-EXTENSIONオプションが指定されているため、ユーザーは範囲の拡張(複数行の入力)を行うことができません。

NO-INTERVALS:TO項目が非表示

このオプションを利用すると、2つめの入力項目(TO)が非表示になります。

言い方を変えると、NO-INTERVALSオプションを利用することで該当のフィールドに対して選択画面で範囲を指定することができなくなり、個々の値のみを許可する形になります。

SELECT-OPTIONS: 
   S_AUART   FOR  GW_SCREEN-AUART  NO-INTERVALS         .   "販売伝票タイプ

見た目上は、PARAMETRES命令で定義したときと画面上は同じような表示になります。

サンプルコード6

REPORT ZMYREPORT.

* 材料番号(Material Number)のためのSelect-options文、NO-INTERVALSオプション付き
SELECT-OPTIONS s_matnr FOR mara-matnr NO-INTERVALS.

START-OF-SELECTION.

  * 入力された範囲で材料を選択します
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択された材料を表示します
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

このプログラムでは、NO-INTERVALSオプションが指定されているため、ユーザーは範囲の指定を行うことができず、個々の値のみが入力可能です。

SELECT-OPTIONS命令を利用する際の注意点

SELECT-OPTIONS命令を使用する際には、以下のようないくつかの注意点があります。

注意点1 データ型の一致

SELECT-OPTIONSで指定するフィールドは、その後のSELECT文で使用されるテーブルの該当フィールドとデータ型が一致している必要があります。一致していない場合、期待しない結果を得る可能性があります。

REPORT ZMYREPORT.

* 数値型のフィールドに対して文字列型を使用
SELECT-OPTIONS s_matnr FOR mara-matnr AS STRING.

START-OF-SELECTION.

  * 入力された範囲で材料を選択
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択された材料を表示
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

↑のプログラムでは、材料番号(MARAテーブルのmatnrフィールド)のデータ型を数値型から文字列型に変更しています。そのため、プログラムの実行時に、SELECT文でのWHERE条件が数値型のフィールドと文字列型の範囲との間で不一致を引き起こし、エラーが発生します。

参考 ABAPのデータ型

注意点2 レンジテーブルの理解

SELECT-OPTIONS命令は、ユーザが指定した範囲に基づいてデータベースからデータを抽出するために使用されます。そのため、SELECT-OPTIONSで生成されるレンジテーブルの構造(SIGN、OPTION、LOW、HIGHの各フィールド)を理解し、それを適切に使用することが重要です。

注意点3 パフォーマンスへの影響

SELECT-OPTIONSは、指定された範囲に基づいてデータベースからデータを抽出します。範囲が広すぎる場合、大量のデータを読み込むことになり、パフォーマンスに影響を及ぼす可能性があります。適切な範囲を指定することで、このリスクを軽減できます。

REPORT ZMYREPORT.

SELECT-OPTIONS s_matnr FOR mara-matnr NO-DISPLAY.

START-OF-SELECTION.

  * プログラム内で非常に広い範囲を指定します
  s_matnr-sign = 'I'.
  s_matnr-option = 'BT'.
  s_matnr-low = '000000000000000001'.
  s_matnr-high = '999999999999999999'.
  APPEND s_matnr.

  * 入力された範囲で材料を選択
  SELECT matnr maktx FROM mara INTO TABLE @DATA(it_mara) WHERE matnr IN @s_matnr.

  * 選択された材料を表示
  LOOP AT it_mara INTO DATA(wa_mara).
    WRITE: / '材料番号:', wa_mara-matnr, '説明:', wa_mara-maktx.
  ENDLOOP.

このプログラムでは、NO-DISPLAYオプションが設定されたSELECT-OPTIONSでユーザーからの入力を受け付けず、代わりにプログラム内で広大な範囲を設定しています。その結果、非常に多くの材料が選択され、それによりパフォーマンスに影響を及ぼす可能性があります。

SELECT-OPTIONS命令のまとめ

  1. 範囲指定: SELECT-OPTIONSはABAPでデータベースからデータを選択する際に、ユーザーが特定の範囲を指定できるようにする命令。
  2. 選択画面の自動生成: SELECT-OPTIONSを使用すると、ABAPが自動的に選択画面を生成。この画面でユーザーはデータの選択範囲を設定することが可能。
  3. 複数のオプション: SELECT-OPTIONSにはいくつかのオプションがあり、それぞれが選択画面の特定の振る舞いを制御する。
  4. レンジテーブルの生成: SELECT-OPTIONSは、ユーザーが指定した範囲に基づいて"レンジテーブル"を生成。このレンジテーブルは、後続のデータベース操作で使用される。
SELECTION-SCREEN BEGIN OF BLOCK MAIN WITH FRAME TITLE TEXT-S01.

* 会計年度
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (10) TEXT-S03 FOR FIELD GSOP_GJAHR.
  SELECT-OPTIONS GSOP_GJAHR FOR GDF_GJAHR OBLIGATORY.
SELECTION-SCREEN END OF LINE.

* 伝票タイプ
SELECTION-SCREEN BEGIN OF LINE.
  SELECTION-SCREEN COMMENT (10) TEXT-S04 FOR FIELD GS_BLART.
  SELECT-OPTIONS GS_BLART FOR GDF_BLART.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK MAIN.

参考 SELECTION-SCREEN / テキストシンボル(TEXT-)

初めてABAPを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました