三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
登場人物紹介
三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
この記事を読むメリット
ABAP7.4以降では変数(構造)や内部テーブルへのデータ格納方法に新構文が追加されました。
これまで面倒だった処理がスッキリ書けるようになっているのでぜひ覚えておきましょう!
ここでは構造や内部テーブルへデータ格納する際の新構文を解説していくのじゃ!
・同じプログラム内で旧構文と新構文は同居可能です。
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
・新構文では以下のような形で構造にデータを格納することができます。
①構造がまだ定義されていない場合
DATA(構造) = VALUE データ型( 項目1 = 値 項目2 = 値 … ).
②構造が既に定義されている場合
構造 = VALUE #( 項目1 = 値 項目2 = 値 … ).
* 構造定義
DATA:
wa_data TYPE ty_data.
* 構造へデータ設定
wa_data-comp1 = 1.
wa_data-comp2 = 'name1'.
* データ型定義
TYPES:
BEGIN OF ty_data,
comp1 TYPE i,
comp2 TYPE string,
END OF ty_data.
* 構造へデータ設定
DATA(wa_data) = VALUE ty_data( comp1 = 1 comp2 = 'name1' ).
* 構造へデータ設定
wa_data = VALUE #( comp1 = 1 comp2 = 'name1' ).
・新構文では以下のような形で構造にデータを格納することができます。
①構造がまだ定義されていない場合
DATA(内部テーブル) = VALUE テーブル型( 項目1 = 値 項目2 = 値 … ).
②構造が既に定義されている場合
内部テーブル = VALUE #( 項目1 = 値 項目2 = 値 … ).
※既に内部テーブルに格納されていたものは削除され、指定したデータが格納されます。
* 内部テーブルへ格納(1レコード目)
CLEAR wa_data.
wa_data-comp1 = 1.
wa_data-comp2 = 'name1'.
APPEND wa_data TO it_data.
* 内部テーブルへ格納(2レコード目)
CLEAR wa_data.
wa_data-comp1 = 2.
wa_data-comp2 = 'name2'.
APPEND wa_data TO it_data.
* 内部テーブルへ格納(3レコード目)
CLEAR wa_data.
wa_data-comp1 = 3.
wa_data-comp2 = 'name3'.
APPEND wa_data TO it_data.
* データ型定義
TYPES:
BEGIN OF ty_data,
comp1 TYPE i,
comp2 TYPE string,
END OF ty_data.
* テーブルタイプ定義
TYPES:
tty_data TYPE TABLE OF ty_data WITH EMPTY KEY.
* 内部テーブルへ格納
DATA(it_data) = VALUE tty_data( ( comp1 = 1 comp2 = 'name1' )
( comp1 = 2 comp2 = 'name2' )
( comp1 = 3 comp2 = 'name3' ) ).
* 内部テーブルへデータ格納
it_data = VALUE #( ( comp1 = 1 comp2 = 'name1' )
( comp1 = 2 comp2 = 'name2' )
( comp1 = 3 comp2 = 'name3' ) ).
「comp1がすべて同じ値で格納したい!」という時は、以下のようにcomp1は1回だけ指定すればよいのじゃ!
* 内部テーブルへデータ格納
it_data = VALUE #( comp1 = 1 ( comp2 = 'name1' )
( comp2 = 'name2' )
( comp2 = 'name3' ) ).
上記の新構文(内部テーブルが定義されていない場合)では注意点があるのじゃ。
既に内部テーブルに格納されていたら、それらは削除され上書きされてしまうのじゃ!
「内部テーブルを上書きせず追加したい!」という時は以下を参考にするのじゃ。
・内部テーブルを上書きせずに追加したい場合は「BASE 内部テーブル」を使います。使用方法は以下を参照下さい。
* 内部テーブルにデータ追加
it_data = VALUE #( BASE it_data
( comp1 = 4 comp2 = 'name4' )
( comp1 = 5 comp2 = 'name5' )
( comp1 = 6 comp2 = 'name6' ) ).
「既存の内部テーブルの内容を追加したい!」ということもあるじゃろう。
そんな時は以下を参考にするのじゃ!
・内部テーブルを上書きせずに追加したい場合は「LINES OF 内部テーブル」を使います。使用方法は以下を参照下さい。
* 内部テーブル定義した際、既存の内部テーブル(it_data)のレコードを追加
DATA(it_data2) = VALUE tty_data( ( comp1 = 10 comp2 = 'name10' )
( LINES OF it_data ) ).
ABAPerであればRANGEテーブルを使用することは必ずあるじゃろう。
これまでの解説した内容を使えばできるのじゃが、念のため旧構文と新構文の書き方の違いの例を書いてみるのじゃ!
* RANGEテーブルへ格納(1レコード目)
CLEAR wa_range.
wa_range-sign = 'I'.
wa_range-option = 'EQ'.
wa_range-low = 'name1'.
APPEND wa_range TO it_range.
* RANGEテーブルへ格納(2レコード目)
CLEAR wa_range.
wa_range-sign = 'I'.
wa_range-option = 'EQ'.
wa_range-low = 'name2'.
APPEND wa_range TO it_range.
* RANGEテーブルへ格納(3レコード目)
CLEAR wa_range.
wa_range-sign = 'I'.
wa_range-option = 'EQ'.
wa_range-low = 'name3'.
APPEND wa_range TO it_range.
* RANGEテーブルへ格納
it_range = VALUE #( sign = 'I' option = 'EQ' ( low = 'name1' )
( low = 'name2' )
( low = 'name3' ) ).
・新構文では以下の形で繰り返し処理を実施し内部テーブルにデータを格納することができます。
内部テーブル = VALUE #( FOR カウンター THEN カウンター演算 UNTIL 繰り返し処理を終了する条件 ( 項目1 = 値 項目2 = 値 … ) ).
※カウンターは暗黙的に定義されるため事前の定義は不要です。
* 内部テーブルに10レコード分格納
DO 10 TIMES.
l_cnt = l_cnt + 1.
CLEAR wa_data.
wa_data-comp1 = l_cnt.
wa_data-comp2 = 'name' && l_cnt.
APPEND wa_data TO it_data.
ENDDO.
* 内部テーブルに10レコード分格納
it_data = VALUE #( FOR l_cnt_temp = 1 THEN l_cnt_temp + 1 UNTIL l_cnt_temp > 10
( comp1 = l_cnt_temp comp2 = 'name' && l_cnt ) ).
・新構文では以下の形で、ある内部テーブルの条件を指定しそれに合う条件のレコード内容を別の内部テーブルにデータを格納することができます。
内部テーブル = VALUE #( FOR 構造 IN 内部テーブル WHERE ( 条件 ) ( 項目1 = 値 項目2 = 値 … ) ).
* 内部テーブルのcomp1が4より大きい際にRANGEテーブルを作成
LOOP AT it_data INTO wa_data WHERE comp1 > 4.
wa_range-sign = 'I'.
wa_range-option = 'EQ'.
wa_range-low = wa_data-comp2.
APPEND wa_range TO it_range.
CLEAR:
wa_data.
ENDLOOP.
* 内部テーブルのcomp1が4より大きい際にRANGEテーブルを作成
it_range = VALUE #( FOR wa_data_temp IN it_data
WHERE ( comp1 > 4 )
( sign = 'I'
option = 'EQ'
low = wa_data_temp-comp2 ) ).
項目が一つであれば( 項目1 = 値 項目2 = 値 … )の部分は省略できるのじゃ!
* 内部テーブルから条件指定し、他の内部テーブルへ格納
REFRESH it_name.
LOOP AT it_data INTO wa_data WHERE comp1 > 3.
APPEND wa_data-comp2 TO it_name.
ENDLOOP.
* 内部テーブルから条件指定し、他の内部テーブルへ格納
it_name = VALUE #( FOR wa_data_temp IN it_data
WHERE ( comp1 > 3 )
( wa_data_temp-comp2 ) ).
構造や内部テーブルからのデータ格納に関するABAP7.4以降の新構文についての解説は以上じゃ。
まだ新構文はあるので、都度更新していくぞい!
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!
SAPラボのライターの特徴
・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!
SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。
募集要項
・SAP導入や運用保守プロジェクトへの参画経験1年以上
ご応募/お問合せ先
info@sap-labo.com
少しでもご興味ある方、ぜひお気軽にご連絡下さい!
株式会社Luxy(https://luxy-inc.com/company_info/)と株式会社アガルートITパートナーズ(https://agaroot-itp.com/about/)の代表取締役。
新卒でSAPエンジニアとして働き始める。副業で事業を開始したのち、2015年に独立しシステム開発会社を設立。SAPの案件に従事しつつシステム開発事業を成長させ、2021年に会社をバイアウト。その後も創業会社とグループ会社で代表を兼任。
SAPエンジニア・コンサルタント歴は10年以上。
一緒に「SAPラボ」を盛り上げてくれる副業ライター(SAP経験者)を募集してますので、お問い合わせよりお願いします!