【ABAP】1分で理解するSELECT SINGLE

ABAP

ABAPのSELECT命令のオプション版、SELECT SINGLEについて解説します。

SELECT SINGLEは、取得元のデータベーステーブルから対象のレコードを1件だけ取得したい場合に用いる命令です。

このページで学べる内容
  • SELECT SINGLEの構文ルールと使い方・意味
  • SELECT SINGLE利用時の注意点
  • UP TO 1 ROWSとの違い

ABAPerであれば、知っておきたい重要な知識ばかりですので、是非最後までご覧ください。

SELECT命令の基本から学びたい方は、以下の記事をご覧ください。

スポンサーリンク

【復習】SELECT命令とは?

blank

SELECT命令は、簡単に言うとデータベースからレコードを取り出す際に利用するABAP構文です。

SELECT命令:構文ルール
SELECT (テーブルの項目名)
  FROM (テーブル名)
  INTO (内部テーブル or 構造)
(ENDSELECT).

SELECT命令はFROM句に指定したデータベーステーブルからレコードを読み込み、INTO句に記述した内部テーブル or 構造に取得したレコードを格納します。

SELECT *
  FROM DD02L
  INTO LS_DD02L
  WHERE TABNAME  = 'BKPF'   "テーブル
    AND AS4VERS  = 0000.    "バージョン

SELECT SINGLEとは?

SELECT SINGLEは、対象のデータベースから1件だけレコードを取得したい場合に利用します。

SELECT SINGLE:構文ルール

SELECT-SINGLE:構文ルール
SELECT SINGLE (項目名)
  FROM (テーブル名) 
  INTO (構造).

構文ルールは難しくありません。SELECTの後ろに「SINGLE」と記述するだけです。SELECT SINGLEは、データを1件だけ取得する命令のため、格納先には構造を指定します。

内部テーブル/構造の区別が不安な方は

内部テーブルと構造の区別に自信がない方は、こちらのページをご覧ください。ABAPで用いられるデータオブジェクトの区別を初心者にも分かりやすいよう図解しています!

SELECT SINGLE:詳細開設

"SELECT-SINGLE" は対象のテーブルから、レコードを1件だけ抽出し、指定した構造に格納します。

SELECT SINGLE VKORG
  FROM TVKO 
  INTO @DATA(LW_VKORG) 

このコードでは

1行目: VKORG というテーブル項目の値を
2行目: TVKO というテーブルから1件だけ取得し
3行目: LW_VKORG という構造に格納する

処理を行われることになります。もし、取得したい項目が複数ある場合は、以下のように複数の項目を並べて記述すればOK。

SELECT SINGLE VKORG KUNNR BOAVO EKORG
  FROM TVKO 
  INTO @DATA(LW_VKORG) 

上記コードでは、S/4 HANAから登場した変数のインライン宣言という技術が取り入れられています。インライン宣言の詳細は下記のページで解説していますので合わせてご覧ください。

SELECT SINGLEの注意点・Tips

SELECT-SINGLE命令は決して難しい命令ではありません。そのため、使い方や構文ルールで迷う点は少ないはずです。

そのうえで、実際にABAPを書いてみた人しかわからない「落とし穴」や「Tips」を最後にご説明します。

注意!「一致するデータが何件あっても1件だけしか取得しない」

SELECT-SINGLEを利用する際に注意すべきなのは、FROM句で指定したテーブルAに該当するデータが複数件あった場合です。以下のテーブル「TABLE_A」をご覧ください。

blank

該当レコード(取得したいレコード)が複数ある場合でも、取得できるのは1件のみです。該当するデータを1件取得した時点で、処理は終了します。

SELECT文は基本的に上のレコードから順に読み込んで取得していくため、上記例でいえば、二つ目のレコードは取得されません。レコードの読み取りさえ行われません。

注意!「複数項目を取得する場合」

以下の構文を見てみましょう。

SELECT SINGLE a b c d
  FROM TVKO 
  INTO LW_VKORG 
  WHERE VKORG = @P_VKORG.

さて、この場合取得した項目a,b,c,dは、構造「LW_VKORG」にどのように入るでしょうか?これ実は結構な落とし穴です。

よくある間違いが「データ型」が同じになる箇所に自動的にはいっていくのでは?というもの。または「項目名」が同じであればそこに自動的にマッピングされるのでは?というもの。

正解は「a,b,c,d」の順に左から順に格納されていきます。つまり、データを入れる先の構造も「a,b,c,d」の順にデータ型を設定しておく必要があります。

Tips:SELECT-SINGLEを対象データの有無判定に利用する

SELECT-SINGLEは予め対象のレコードが「1件しかないとわかっている場合」もしくは「対象のレコードを1件だけ取得すればよい場合」に利用します。

この考え方をさらに発展させると、対象のテーブルに指定したレコードが1件以上存在するかどうか?を判定するような使い方も可能です。

SELECT SINGLE *
  FROM DD02L
  INTO LDS_DD02L
  WHERE TABNAME  = LV_TABNAME   " テーブル名
    AND AS4VERS  = 0000.        " バージョン

IF SY-SUBRC <> 0.
  ASSERT 0 = 1.                                                    "想定外エラー
ENDIF.

SAP / ABAPを1から学習したい方は

SAP / ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。

是非、一度ご覧になってみてください。

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