【SAP ABAP】ABAP7.4以降のS4HANAでの新構文(SELECT文)

登場人物紹介

三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!

博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!

この記事を読むメリット

  • ABAP7.4以降のSELECT文についての新構文を理解することができます。

ABAP7.4以降ではSELECT文の書き方がだいぶ変わり、非常に便利になりました。
ネイティブSQLで直接データベースを触れたことがある方は分かると思いますが、それと近い感覚でSQL内で演算することができるようになっています。

博士

ここではSELECT文についての新構文を解説していくのじゃ!


※当記事ではABAP7.5以降の新構文も含みます。

・同じプログラム内で旧構文と新構文のSELECT文は同居可能です。
・1つのSELECT文の中では旧構文もしくは新構文のどちらかで記載する必要があります。

この記事のポイント

取得項目の指定 / 変数の指定の方法の変更

・新構文では取得項目は「,」を付けて指定します。
・内部テーブルや条件指定時の変数には、変数の頭に「@」を付けます

旧構文
* データ取得
SELECT ebeln
       bukrs
  FROM ekko
  INTO TABLE it_ekko
 WHERE ernam = l_user.
新構文
* データ取得
SELECT ebeln,
       bukrs
  FROM ekko
  INTO TABLE @it_ekko
 WHERE ernam = @l_user.

SELECT構文(記載順序)の追加

新構文では以下のような取得の仕方も可能となりました。

SELECT FROM テーブル名
FIELDS 項目1,項目2…
WHERE 項目 = @変数
INTO TABLE @内部テーブル

旧構文
SELECT ebeln
       bukrs
  FROM ekko
  INTO TABLE it_ekko
 WHERE ernam = l_user.
新構文
SELECT FROM ekko
     FIELDS ebeln,
            bukrs
      WHERE ernam = @l_user
 INTO TABLE @it_ekko.

UNION / UNION ALLの使用が可能に

新構文では、
・UNION / UNION ALLを用いて複数のSELECT文を一つの内部テーブルに格納することができます。
・UNION / UNION ALLを用いる際は「SELECT構文(記載順序)の追加」の構文を用い、格納先の内部テーブルは最後に一度だけ指定します。
・UNIONは重複削除され、UNION ALLは重複があってもそのまま内部テーブルにデータが格納されます。

旧構文
SELECT ebeln
       bukrs
  FROM ekko
  INTO TABLE it_ekko
 WHERE ernam = l_user1.

SELECT ebeln
       bukrs
  FROM ekko
  APPENDING TABLE it_ekko
 WHERE ernam = l_user2.
新構文
SELECT FROM ekko
     FIELDS ebeln,
            bukrs
      WHERE ernam = @l_user1
UNION
SELECT FROM ekko
     FIELDS ebeln,
            bukrs
      WHERE ernam = @l_user2
 INTO TABLE @it_ekko.

条件の左辺の演算が可能に

新構文では条件文(WHERE句)の左辺を演算して条件指定ができます。

新構文の例
SELECT FROM ztest_saplab
     FIELDS zkey1,
            zfltp1,
            zfltp2
        WHERE zint1 + zint2 < 10
   INTO TABLE @it_table.

テーブル項目以外を取得項目へ設定可能に

新構文ではテキストや変数を取得項目値として指定できるようになりました。

新構文の例
SELECT 'TEST'  AS field1,
       @l_text AS field2
  FROM ztest_saplab
  INTO TABLE @it_table.

演算した結果を取得項目へ設定可能に

新構文では計算した結果を取得項目値として指定できるようになりました。

新構文の例
SELECT 10 * 10        AS field1,
       zint1 + zint2  AS field2
  FROM ztest_saplab
  INTO TABLE @it_table.

内部テーブルからSELECT可能に

新構文ではDBテーブルからだけではなく内部テーブルからSELECTできるようになりました。

新構文の例
SELECT FROM @it_table AS TAB1 "内部テーブルから取得
     FIELDS ZKEY1
 INTO TABLE @it_table2.

新構文では内部テーブル・DBテーブルをJOINしたテーブルからSELECTも可能です。

新構文の例
SELECT FROM @it_table AS tab1
      INNER JOIN makt AS tab2
         ON tab1~zkey1 = tab2~maktx
     FIELDS tab1~zkey1
 INTO TABLE @it_table2.

サブクエリ(副問い合わせ)が利用可能に

新構文ではサブクエリ(副問い合わせ)も利用可能になりました。

SELECT matnr
  from mara
 where matnr in ( SELECT matnr
                    from makt
                   WHERE matnr = mara~matnr
                     and maktx = 'Frame' )
 INTO TABLE @data(it_mara).

さまざまな関数が利用可能に

新構文ではさまざまな関数を条件(WHERE句)や取得項目(FIELD句)に使用することができるようになりました。

新構文の例
SELECT FROM ztest_saplab
   FIELDS concat( ztext1 , ztext2 ) AS FIELD1,
          lower( ztext2 )           AS FIELD2,
          left( ztext3 , 4 )        AS FIELD3,
          CASE ztext3
            when '1' then 'GOOD'
            when '2' then 'BAD'
            ELSE 'NORMAL'
          END                       AS FIELD4
    WHERE concat( ztext1 , ztext2 ) = ztest_saplab~ztext3
     INTO TABLE @it_table.

関数一覧

使用できる関数を以下にまとめます。

数値関数

関数内容
ABS( field )fieldの絶対値。
CEIL( field )field以上の最小の整数に丸めた値。
DiV( field1,field2 )field1をfield2で除算した際の商(整数部分)。
DIVISION( field1,field2,dec )field1をfield2で除算して、dec(少数点の桁の位置)で四捨五入した値。
FLOOR( field )field以下の最大の整数に丸めた値。
MOD( field1,field2 )field1をfield2で除算した際の余り。
ROUND( field1,pos )field1をpos(少数点の桁の位置)で四捨五入した値。

文字列関数

関数内容
LEFT( field,len )fieldの左側から長さlenだけ切り出したの文字列。
RIGHT( field,len )fieldの右側から長さlenだけ切り出したの文字列。
LOWER( field )fieldを全て小文字に変換した文字列。
UPPER( field )fieldを全て大文字に変換した文字列。
INITCAP( field )fieldの単語の文字列の最初の文字を大文字に変換し、それ以外の文字を小文字に変換した文字列。
LENGTH( field )fieldの文字数。
SUBSTRING( field,pos,len )fieldから、文字の位置posから長さlenだけ切り出した文字列。
INSTR( field1,field2 )field1から文字列field2が最初に出現する位置。
REPLACE( field1,field2,field3 )field1の文字列に対し、field2をfield3に置換した文字列
CONCAT( field1,field2 )field1,field2を連結した文字列。
CONCAT_WITH_SPACE( field1,field2,len )field1,field2を長さlenのスペースを間に挟んで連結した文字列。
LTRIM( field,char )fieldの文字列の左側の文字charを削除した文字列。
RTRIM( field1,char )fieldの文字列の右側の文字charを削除した文字列。
LPAD( field1,len,field2 )field1を長さlenだけ切り出した文字列。
その際、長さlenに満たない場合は左側に文字列field2を埋めた文字列となる。
RPAD( field1,len,field2 )field1を長さlenだけ切り出した文字列。
その際、長さlenに満たない場合は右側に文字列field2を埋めた文字列となる。

条件の関数

関数内容
CASE field1
WHEN value1
THEN return1
WHEN value2
THEN return2

ELSE
return3
END
field1の値が、
・value1の時にreturn1を返す。
・value2の時にreturn2を返す。

・上記以外の時にreturn3を返す。
CASE
WHEN cond1
THEN return1
WHEN cond2
THEN return2

ELSE
return3
END
・条件式cond1が正の時にreturn1を返す。
・条件式cond2が正の時にreturn2を返す。

・上記以外の時にreturn3を返す。
※上に記載している条件が優先される。
COALESCE( field1,field2,field3,… )field1,field2,field3…のうち、最初にNULLではない値を返す。
博士

SELECTに関するABAP7.4以降の新構文についての解説は以上じゃ。
まだ新構文はあるので、都度更新していくぞい!

★★★SAPラボのライター募集★★★

SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!

SAPラボのライターの特徴 

・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!

SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。

募集要項

・SAP導入や運用保守プロジェクトへの参画経験1年以上

ご応募/お問合せ先

info@sap-career.com

少しでもご興味ある方、ぜひお気軽にご連絡下さい!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

株式会社Luxy(https://luxy-inc.com/company_info/)と株式会社アガルートITパートナーズ(https://agaroot-itp.com/about/)の代表取締役。

新卒でSAPエンジニアとして働き始める。副業で事業を開始したのち、2015年に独立しシステム開発会社を設立。SAPの案件に従事しつつシステム開発事業を成長させ、2021年に会社をバイアウト。その後も創業会社とグループ会社で代表を兼任。
SAPエンジニア・コンサルタント歴は10年以上。

一緒に「SAPラボ」を盛り上げてくれる副業ライター(SAP経験者)を募集してますので、お問い合わせよりお願いします!

この記事のポイント