S/4 HANAで使用可能な文法「ABAP7.4以降」について、7.4と7.5より前の文法と比較しながら解説します。この記事では、特に内部テーブルから特定の行を抽出する方法に焦点を当てています。このテクニックは、データ分析やデータ管理において非常に重要なスキルとなります。
ABAP 7.5以降の新しいSELECT文記述方法について
ABAP 7.5以降では、SELECT文の記述方法が大幅に拡張され、より柔軟なデータ操作が可能になりました。この記事では、その新しい記述方法について詳しく解説します。
リテラル値、固定値、変数値を取得項目に指定する
ABAP 7.5xでは、リテラル値、固定値、変数値をSQLの取得項目として指定できます。これにより、より直感的なコード記述が可能になりました。以下に具体的なコードを示します。
DATA: var1 TYPE char10 VALUE 'VARIABLES'.
CONSTANTS: CONS1 TYPE char10 VALUE 'CONSTANTS'.
SELECT FROM vbak AS t1
FIELDS
'LITERAL' AS lit, "リテラル値
@var1 AS var_field, "変数
@CONS1 AS cns_field, "固定値
@abap_on as check, "予約語
@( VALUE vbak-erdat( ) ) AS erdat, "初期値
INTO TABLE @DATA(results).
演算値を取得項目に指定する
ABAP 7.5以降では、テーブル項目値や変数、数値リテラルを使用した演算結果を項目値として格納することができます。以下に具体的なコードを示します。
SELECT FROM vbap
FIELDS
netwr, "項目IDがNETWRで定義される
kwmeng, "項目IDがkwmengで定義される
netwr * 100 AS jpy_netwr, "演算結果
CASE kwmeng "条件分岐
WHEN 0 THEN 0
ELSE division( netwr , kwmeng, 3 )
END AS calc2,
CASE kwmeng
WHEN 0 THEN CAST( 0 AS FLTP ) "結果がFLTP型になるため
ELSE CAST( netwr AS FLTP ) / CAST( kwmeng AS FLTP )
END AS calc3
INTO TABLE @DATA(results).
文字列編集処理の結果を項目に設定する
ABAP 7.5xでは、簡単な文字列の編集処理がSQLでできるようになりました。以下に具体的なコードを示します。
SELECT FROM sflight
FIELDS
@abap_on AS check, "固定値
carrid,
connid,
concat_with_space( carrid,connid,4 ) AS cws,
left( planetype, 3 ) AS plane_series1,
length( planetype ) as plane_series2,
lpad( CAST( paymentsum AS
ABAP7.5以降では、SELECT文の条件にFOR ALL ENTRIES を指定して内部テーブルの項目を抽出条件として使うことができます。
データ宣言
これまで事前に定義する必要があったデータオブジェクトをabap命令の一部として定義できます。
データオブジェクト・・・変数、構造、内部テーブルのこと
変数の宣言
DATA(LT_XXX) = ‘HELLO’
構造やフィールドシンボルも同じように宣言して使うことができます。
内部テーブルの宣言
DATA: BEGIN OF <内部テーブル> Occurs 0,
具体例:
DATA: BEGIN OF LT_TAB Occurs 0,
MVKE-VKORG LIKE MVKE-VORG,
ZZCONTS LIKE ZZCNTS,
END OF LT_TAB.
このように内部テーブルを記述できるのでコードが短くて済みます。
「Ocuurs 0 」というのは、データが格納されるまでレコードが0という意味です。つまり、内部テーブルが宣言された段階ではヘッダだけを持つ内部テーブルということになります。
ABAPの内部テーブル操作について
ABAPでは、内部テーブルを使用してデータを一時的に格納し、操作することができます。この記事では、その操作方法について詳しく解説します。
内部テーブルから特定の行を抽出する
ABAP 7.4では、以下のようにREAD TABLE文を使用して行を抽出していました。
READ TABLE lt_bkpf INTO ls_bkpf INDEX 1.
しかし、ABAP 7.5では、新しい文法を使用して同じ操作を行うことができます。
DATA(ls_bkpf) = lt_bkpf[ 1 ].
この宣言方法では自動的に左側の構造は右側の内部テーブルと同じ項目を持つ型になるようにします。
この文法は、より直感的で記述するコードを短くすることができます。ですが、以下のような欠点もあります。
- BINARY SEARCHがない
- SY-TABIXが更新されない
BINARY SEARCHがないと、大きな内部テーブルを効率的に検索することができません。また、SY-TABIXが更新されないため、テーブルの現在のインデックスを追跡することができません。
また、新文法を使って内部テーブルから特定の行を抽出する方法は以下の通りです。
DATA(ls_bkpf) = lt_bkpf[ bukrs = ‘0001’ ].
このコードは、内部テーブルlt_bkpfから、bukrsが’0001’の行を抽出します。このように、新文法を使用すると、特定の条件を満たす行を簡単に抽出することができます。