このページでは、ABAP初心者向けに選択画面作成時に利用する ”SELECT-OPTIONS” 命令について説明します。
SELECT-OPTIONS命令は、SAPの画面項目を定義する命令。
以下のサンプル画面の中における項目「連番」「処理ステータス」などはSELECT-OPTIONS命令によって定義されています。
このページでは、SELECT-OPTIONS命令の意味や使い方のコツ・利用する際の注意点について1から解説していきます。
ABAPエンジニアを目指す方であれば、絶対に知っておきたい超・重要知識です。3分ぐらいで読めますので、是非最後までご覧ください。
参考 ABAPの基本構文ルール
SELECT-OPTIONS命令とは?
SELECT-OPTIONS命令は、画面の項目を定義する命令です。
↓画像の「連番」「処理ステータス」「販売伝票タイプ」は、SELECT-OPTIONS命令で定義されている項目。
このようなFROM~TO指定できる項目を作るのが、SELECT-OPTIONS命令です。
「販売組織」項目などのように単一の画面項目は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つの項目から成立する内部テーブルの一種です。
上記レンジテーブルには、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 . "販売伝票タイプ
上記の通りでコーディングすると、入力項目「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:複数選択の禁止
このオプションを利用すると、画面から複数選択を行うための押ボタンが消えます。
そのため、このオプションを利用した場合は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命令のまとめ
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!