DATA命令
13.3 DATA命令
DATA命令は、プログラム内で使う データオブジェクト(変数・構造・内部テーブル) を宣言する命令です。変数を宣言するときは、基本的に 変数名と型(データ型) を指定します。 TYPES命令で定義した型や事前定義済みデータ型、ABAPディクショナリオブジェクトのデータ型からDATA命令によって変数や構造および内部テーブルを作成します。
TYPES命令とDATA命令の違い
TYPES命令とDATA命令の違いは明確です。
- DATA命令 ⇒ 変数/構造/内部テーブルを宣言
- TYPES命令 ⇒ 変数/構造/内部テーブルの基となる「型」を定義
となります。
基本的な流れは、①「TYPES命令で型を定義」を行ったあと、
②「①で定義したデータ型に基づいてDATA命令で変数/構造を宣言」するという流れになります。
変数
変数は、単一項目の変数であり、データを1つだけ格納することができる箱のことを指します。
代入
変数や構造などのデータオブジェクトへのデータの代入や、
格納データの初期化について以下の流れで説明します。
- 変数への代入
- 構造間での代入
- 内部テーブル間での代入
- 初期化
変数への代入
変数aから変数bにデータを代入したい場合は、下記のように記述します。
※もちろん値を直接代入することも可能ですし、変数の代わりに構造の項目を使用することも可能です。
サンプルコード
REPORT Z_SAMPLE191.
DATA: LV_TEXT TYPE LENGTH 5,
LV_PACK TYPE P DECIMALS 2,
LV_INT TYPE I.
LV_TEXT = '123'.
LV_PACK = '3.59'. " 文字→数値(暗黙変換)
LV_INT = LV_PACK. " 小数→整数(小数部は切り捨てに注意)
WRITE: / |lv_text = { LV_TEXT }|,
/ |lv_pack = { LV_PACK }|,
/ |lv_int = { LV_INT }|.
結果
構造間での代入
構造間で複数項目のデータを一括代入したい場合は、MOVE-CORRESPONDING命令を使用できます。
■構造のイメージ
下の図のように、項目名が同じ箇所へデータを代入します。
ただしこの方法は、どの項目が移送されるかがコードから読み取りにくくなるため、設計・保守の観点で多用は避け、「項目名が明確で、同名項目をまとめて移したい」場面に限定して使うのが安全です。
サンプルコード
REPORT Z_SAMPLE192.
" 入力側:最低限の顧客情報(例)
TYPES: BEGIN OF TY_CUSTOMER_BASIC,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
CONTACT_NM TYPE C LENGTH 20,
END OF TY_CUSTOMER_BASIC.
" 出力側:追加情報を持つ顧客情報(例)
TYPES: BEGIN OF TY_CUSTOMER_DETAIL,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
ADDRESS TYPE C LENGTH 60,
CONTACT_NM TYPE C LENGTH 20,
DEPARTMENT TYPE C LENGTH 20,
END OF TY_CUSTOMER_DETAIL.
DATA: LS_BASIC TYPE TY_CUSTOMER_BASIC,
LS_DETAIL TYPE TY_CUSTOMER_DETAIL.
" ① 入力側(基本情報)を準備
LS_BASIC-CUSTOMER_ID = '0001'.
LS_BASIC-CUSTOMER_NM = '株式会社222'.
LS_BASIC-CONTACT_NM = '田中'.
" ② 同名項目だけを出力側にコピー
MOVE-CORRESPONDING LS_BASIC TO LS_DETAIL.
" ③ コピー結果を確認(address/department は未設定のまま)
WRITE: / |ID = { LS_DETAIL-CUSTOMER_ID }|,
/ |NAME = { LS_DETAIL-CUSTOMER_NM }|,
/ |ADDR = { LS_DETAIL-ADDRESS }|,
/ |PERS = { LS_DETAIL-CONTACT_NM }|,
/ |DEPT = { LS_DETAIL-DEPARTMENT }|.
結果
構造間での代入(新構文)
MOVE-CORRESPONDING と同様の処理は、新構文CORRESPONDINGでも記述できます。
CORRESPONDING命令を新構文で記述すると以下の通りです。
インライン宣言と組み合わせることで、新しく<構造体c>を作成しています。
また、<構造体b>のデータ型を指定する必要があります。
<構造体c>の中身は<<構文-2>>と同様です。
サンプルコード
REPORT Z_SAMPLE192_MODIFY.
TYPES: BEGIN OF TY_CUSTOMER_BASIC,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
CONTACT_NM TYPE C LENGTH 20,
END OF TY_CUSTOMER_BASIC.
TYPES: BEGIN OF TY_CUSTOMER_DETAIL,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
ADDRESS TYPE C LENGTH 60,
CONTACT_NM TYPE C LENGTH 20,
DEPARTMENT TYPE C LENGTH 20,
END OF TY_CUSTOMER_DETAIL.
DATA: LS_BASIC TYPE TY_CUSTOMER_BASIC,
LS_DETAIL TYPE TY_CUSTOMER_DETAIL.
" 入力側を VALUE でまとめて作る(初心者は「代入をまとめて書ける」程度でOK)
LS_BASIC = VALUE #( CUSTOMER_ID = '0001'
CUSTOMER_NM = '株式会社222'
CONTACT_NM = '田中' ).
" 出力側の固有項目(住所・部署)を先に設定しておく
LS_DETAIL = VALUE #( ADDRESS = '東京都千代田区'
DEPARTMENT = '営業部' ).
" (1) BASE なし:同名項目をコピーし、出力側固有項目は初期値になる
LS_DETAIL = CORRESPONDING #( LS_BASIC ).
WRITE: / '--- (1) BASEなし ---',
/ |ID = { LS_DETAIL-CUSTOMER_ID }|,
/ |NAME = { LS_DETAIL-CUSTOMER_NM }|,
/ |ADDR = { LS_DETAIL-ADDRESS }|,
/ |PERS = { LS_DETAIL-CONTACT_NM }|,
/ |DEPT = { LS_DETAIL-DEPARTMENT }|.
SKIP.
" 出力側を作り直す(住所・部署を保持したい)
LS_DETAIL = VALUE #( ADDRESS = '東京都千代田区'
DEPARTMENT = '営業部' ).
" (2) BASE あり:出力側固有項目を保持したまま、同名項目をコピー
LS_DETAIL = CORRESPONDING #( BASE ( LS_DETAIL ) LS_BASIC ).
WRITE: / '--- (2) BASEあり ---',
/ |ID = { LS_DETAIL-CUSTOMER_ID }|,
/ |NAME = { LS_DETAIL-CUSTOMER_NM }|,
/ |ADDR = { LS_DETAIL-ADDRESS }|,
/ |PERS = { LS_DETAIL-CONTACT_NM }|,
/ |DEPT = { LS_DETAIL-DEPARTMENT }|.
SKIP.
" (3) インライン宣言で新しい構造を作成(型 ty_customer_detail を明示)
DATA(LS_DETAIL_NEW) =
CORRESPONDING TY_CUSTOMER_DETAIL( BASE ( LS_DETAIL ) LS_BASIC ).
WRITE: / '--- (3) インライン宣言 ---',
/ |ID = { LS_DETAIL_NEW-CUSTOMER_ID }|,
/ |NAME = { LS_DETAIL_NEW-CUSTOMER_NM }|,
/ |ADDR = { LS_DETAIL_NEW-ADDRESS }|,
/ |PERS = { LS_DETAIL_NEW-CONTACT_NM }|,
/ |DEPT = { LS_DETAIL_NEW-DEPARTMENT }|.
結果
内部テーブルでの代入
内部テーブル間での代入も可能ですが、これには注意が必要です。
左右の内部テーブルは 同じ行型(同じデータ型) である必要があります。
行型が異なる場合の項目対応付け(マッピング)は、本章では扱いません。
サンプルコード
REPORT Z_SAMPLE193.
TYPES: BEGIN OF TY_CUSTOMER,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
CONTACT_NM TYPE C LENGTH 20,
END OF TY_CUSTOMER.
DATA:
LT_CUSTOMER_SRC TYPE STANDARD TABLE OF TY_CUSTOMER WITH EMPTY KEY,
LT_CUSTOMER_DST TYPE STANDARD TABLE OF TY_CUSTOMER WITH EMPTY KEY,
LS_CUSTOMER TYPE TY_CUSTOMER.
" ① 1行データを作って、ソーステーブルに追加
LS_CUSTOMER-CUSTOMER_ID = '0001'.
LS_CUSTOMER-CUSTOMER_NM = '株式会社222'.
LS_CUSTOMER-CONTACT_NM = '田中'.
APPEND LS_CUSTOMER TO LT_CUSTOMER_SRC.
" ② テーブル全体をコピー(同じ行型が前提)
LT_CUSTOMER_DST = LT_CUSTOMER_SRC.
" ③ コピー結果を確認
LOOP AT LT_CUSTOMER_DST INTO LS_CUSTOMER.
WRITE:
/ | ID={ LS_CUSTOMER-CUSTOMER_ID } |,
/ | NAME={ LS_CUSTOMER-CUSTOMER_NM } |,
/ | PERSON={ LS_CUSTOMER-CONTACT_NM } |.
ENDLOOP.
結果
内部テーブルでの代入(新構文)
内部テーブルどうしを丸ごとコピーする場合は、= による代入を使用します。
この代入では、左右の内部テーブルは 同じ行型(同じデータ型)である必要があります。
(行型が異なる場合の項目対応付けや、条件付きコピーは後の章で扱います)
今回は学習しませんが、新構文ではマッピング(特定項目同士の代入)やフィルター設定(条件付きコピー)なども可能です。
サンプルコード
REPORT Z_SAMPLE193_MODIFY.
TYPES: BEGIN OF TY_CUSTOMER,
CUSTOMER_ID TYPE N LENGTH 5,
CUSTOMER_NM TYPE C LENGTH 30,
CONTACT_NM TYPE C LENGTH 20,
END OF TY_CUSTOMER.
DATA:
LT_CUSTOMER_SRC TYPE STANDARD TABLE OF TY_CUSTOMER WITH EMPTY KEY,
LT_CUSTOMER_DST TYPE STANDARD TABLE OF TY_CUSTOMER WITH EMPTY KEY,
LS_CUSTOMER TYPE TY_CUSTOMER.
APPEND VALUE #(
CUSTOMER_ID = '0001'
CUSTOMER_NM = '株式会社222'
CONTACT_NM = '田中'
) TO LT_CUSTOMER_SRC.
" ② テーブル全体をコピー(同じ行型が前提)
LT_CUSTOMER_DST = LT_CUSTOMER_SRC.
" ③ コピー結果を確認
LOOP AT LT_CUSTOMER_DST INTO LS_CUSTOMER.
WRITE:
/ | ID={ LS_CUSTOMER-CUSTOMER_ID } |,
/ | NAME={ LS_CUSTOMER-CUSTOMER_NM } |,
/ | PERSON={ LS_CUSTOMER-CONTACT_NM } |.
ENDLOOP.
結果
実行結果は同じになります。
初期化
格納されたデータの初期化には、CLEAR命令を使用します。
ABAPでは、DATAで宣言した変数や構造、内部テーブルは、プログラム開始時点で初期値(空の状態)になっています。
そのため、宣言の直後に習慣的に CLEAR を記述する必要はありません。
一方で、CLEARは「初期化が不要な命令」ではなく、値を再利用する場面で意図的に初期化したいときに使用します。
具体的には、次のようなケースでは CLEAR を記述する意味があります。
- 同じワークエリア(構造)を繰り返し処理の中で使い回す場合
- 同じ変数を別の処理でも再利用する場合
- 内部テーブルの内容を明示的に空にしたい場合
例:ループ内で前回の値が残らないようにしてから、新しい値を詰め直したいとき
例:一度使った変数を、次の処理で別の意味で再利用する前に初期化したいとき
例:処理の区切りで、蓄積したデータをいったん消してから再度追加したいとき
このように、CLEAR は「とりあえず入れる命令」ではなく、前回の値が残ることで誤動作する可能性がある場面で、意図を持って使う命令として理解しておきましょう。
サンプルコード
REPORT Z_SAMPLE194.
TYPES:
BEGIN OF TY_CUSTOMER,
CUSTOMER_ID TYPE N LENGTH 5, " 顧客ID(ゼロ埋め想定)
NAME TYPE C LENGTH 30, " 顧客名
PERSON TYPE C LENGTH 20, " 担当者名
END OF TY_CUSTOMER.
DATA:
LT_CUSTOMER TYPE STANDARD TABLE OF TY_CUSTOMER WITH EMPTY KEY,
LS_CUSTOMER TYPE TY_CUSTOMER, " 1行分ワーク
LV_CUSTOMER_ID_TXT TYPE C LENGTH 5. " IDを文字として保持
" ① データを作る
LS_CUSTOMER-CUSTOMER_ID = '0001'.
LS_CUSTOMER-NAME = '株式会社222'.
LS_CUSTOMER-PERSON = '田中'.
LV_CUSTOMER_ID_TXT = LS_CUSTOMER-CUSTOMER_ID.
" ② 内部テーブルに追加
APPEND LS_CUSTOMER TO LT_CUSTOMER.
" ③ 変数を再利用する前に初期化する(例としてCLEARを実行)
CLEAR: LS_CUSTOMER, LT_CUSTOMER, LV_CUSTOMER_ID_TXT.
WRITE / '処理完了'.
結果
DATA命令:変数
変数を宣言する際の構文は以下の通りです。
「サンプルコード」①
REPORT Z_SAMPLE135.
*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
LV_TEXT TYPE C LENGTH 10, "固定長文字(最大10文字)
LV_NUM TYPE I, "整数
LV_DATE TYPE D. "日付(YYYYMMDD)
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*値の代入
LV_TEXT = 'あいうえお'.
LV_NUM = 123.
LV_DATE = '20220101'.
*画面出力処理
WRITE:
/ LV_TEXT,
/ LV_NUM,
/ LV_DATE.
END-OF-SELECTION.
実行結果
DATA 命令(新構文)
DATA 命令:変数(新構文)
ABAP 7.4 以降では、インライン宣言(DATA(変数名) = 式.)を使うと、使いたい場所で変数を宣言
し、その場で値を代入できます。このとき、型は右辺(式)の結果から自動推論されます。こういったインラ
イン宣言は、その場限りの一時変数を短く書きたいときに便利です。
プログラム全体で使う変数(グローバル変数)は、従来どおり上部で宣言しておくほうが読みやすくなりま
す。
REPORT Z_SAMPLE135_NEW.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*値の代入
DATA(LV_TEXT) = 'あいうえお'. "C LENGTH 5 になる例
DATA(LV_NUM) = 123. "I
DATA(LV_DATE) = CONV D( '20220101' ). "日付型にしたいので CONV で明示
*画面出力処理
*※型が自動で設定されるため、出力長オプションをつけています。
*「 WRITE (数字) ~. 」とすると数字の長さで出力してくれます。
WRITE: /(10) LV_TEXT,
/ LV_NUM,
/ LV_DATE.
END-OF-SELECTION.
補足:インライン宣言とリテラルの型推論
インライン宣言(DATA(変数) = 式.)では、右辺(式)の結果から型が自動的に推論されます。
ただし、「DATA(lv_date) = ‘20220101’.」のように文字リテラル(’…’)を代入した場合、
「lv_date」 は日付型(DATS)ではなく、通常は C 型(長さ 8) として推論されます。
つまり、見た目は日付でも「型としては文字列」である点に注意が必要です。
そのため、日付型として扱いたい場合は、「DATA lv_date TYPE d.」 のように型を明示するか、
「d’20220101’(型付きリテラル)」や 「CONV d( ‘20220101’ )」 を用いて型を確定させます。
実行結果
構造
構造(ワークエリア/作業領域)は1行に3列や20列など1行複数列の仕切りを持った箱となります。
内部テーブルに値を格納したり、取出したりする場合に使用します。
変数でも同様に構造(ワークエリア/作業領域)に値を格納したり取出したりすることもできます。
DATA命令:構造
DATA宣言での構造の宣言方法は2つあります。
方法①:型(DDIC 構造/DDIC テーブル行タイプ)を参照して宣言する(推奨)
1 つ目は、構造の型を直接参照する方法です。 構造の型を参照する場合は、宣言するだけで構造を定義することができます。
※DBテーブルは、データ型ではないが、SAPの仕様上 構造データ型として使えます。
DBテーブル名は「データ型そのもの」ではありませんが、DB テーブルは 1 行分の構造(行タイプ)を持って いるため、「TYPE テーブル名」と書くと「そのテーブルの 1 行分の構造」として扱えます。
方法②:DATA の中で構造を直接定義する(限定的に使用)
2つ目は、DATA BEGIN OF で定義し宣言する方法です。
DATA 命令内で構造データ型を「BEGIN OF~END OF」で定義します。
この場合、必要な項目と構造名を同時に定義する必要があります。
ただ、このように構造をユーザー自身が直接定義する形だと、その場限りの型になり再利用しづらくなります。
基本は方法①(型参照)を使うのが安全です。
「サンプルコード」①
REPORT Z_SAMPLE136.
*&---------------------------------------------------------------------*
* 構造定義:※ZFUJII01 は DDICの構造/テーブル(行タイプ)を想定
*&---------------------------------------------------------------------*
DATA LS_CUSTOMER TYPE ZFUJII01.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*値の代入
LS_CUSTOMER-MANDT = SY-MANDT. "クライアント(システム変数で定義)
LS_CUSTOMER-KUNNR = 'K001'. "得意先コード
LS_CUSTOMER-NAME1 = 'テスト株式会社'. "名称1
LS_CUSTOMER-NAME2 = '東京都'. "名称2(例)
*画面出力処理
WRITE:
/ 'クライアント :', LS_CUSTOMER-MANDT,
/ '得意先コード :', LS_CUSTOMER-KUNNR,
/ '名称1 :', LS_CUSTOMER-NAME1,
/ '名称2 :', LS_CUSTOMER-NAME2.
END-OF-SELECTION.
実行結果
構造(新構文)
構造も変数と同様にインライン宣言が可能です。 主に SQL 文や繰り返しなどで用いられます。詳しくは、後ほど学習します。 当章では、書き方の比較のための構文(サンプルコード)を紹介します。
DATA 命令:構造(新構文)
構造を宣言する際の構文は以下の通りです。
「サンプルコード」①
REPORT Z_SAMPLE136_NEW.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*値の代入
"インライン宣言:この行で ls_customer が宣言され、右辺から型が決まる
DATA(LS_CUSTOMER) = VALUE ZFUJII01(
MANDT = SY-MANDT "クライアント(ログオン中の値)
KUNNR = 'K001' "得意先コード
NAME1 = 'テスト株式会社' "名称1
NAME2 = '東京都' "名称2(例)
).
*画面出力処理
WRITE:
/ 'クライアント :', LS_CUSTOMER-MANDT,
/ '得意先コード :', LS_CUSTOMER-KUNNR,
/ '名称1 :', LS_CUSTOMER-NAME1,
/ '名称2 :', LS_CUSTOMER-NAME2.
END-OF-SELECTION.
サンプルコードでは「 VALUE <構造データ型 | DB テーブル> 」を用いて、構造に値を代入しています。 このように、インライン宣言にて構造を宣言することも可能です。
実行結果
内部テーブル
内部テーブルは、ABAPプログラムの中で使う 「表形式の一時データ置き場」 です。
イメージとしては Excel のように「行」と「列」を持ちますが、ポイントは DBテーブルの代わりではなく、メモリ上に一時的に保持するためのもの だという点です。
内部テーブルの行(1行分のデータ)は、主に構造(ワークエリア) として扱います。
つまり、「1行=構造」 を作って、内部テーブルに追加したり、内部テーブルから取り出すことができます。
・保持期間:プログラム実行中だけ(終了すると消える)
・用途:取得したデータの一時保存、並べ替え、検索、加工、一覧表示など
テーブルデータを長期的に保持する場合はABAPディクショナリ(SE11)より作成されたテーブルを使用して保持する必要があります。
DATA命令:内部テーブル
内部テーブルの宣言方法も2つあり、 1つはテーブルデータ型を参照する方法、
もう1つは、構造データ型またはDBテーブルを参照する方法です。
方法①
テーブルデータ型を参照する場合は、これまでと同様に下の構文のように
宣言するだけで内部テーブルを作成することができます。
方法②
構造データ型を参照する場合は、「STANDARD TABLE OF」という構文を
追加する必要があります。
この部分は、作成したい内部テーブルの種類に応じて書き換える必要があります。
内部テーブルの種類や宣言方法については、後述で説明します。
※DBテーブルはデータ型ではないが、SAPシステム上ではDBテーブルの構造を参照するようにSAPシステムの仕様として構築されており、DBテーブルを型として指定すると内部テーブルを作成します。
「サンプルコード」①
REPORT Z_SAMPLE137.
*&---------------------------------------------------------------------*
* 内部テーブル定義:ZFUJII01_TAB:行タイプ「ZFUJII01」が複数行並ぶ「テーブル型」
*&---------------------------------------------------------------------*
DATA GT_CUSTOMERS TYPE ZFUJII01_TAB.
*&---------------------------------------------------------------------*
* 構造定義:1行分のデータを入れるための「箱」
*&---------------------------------------------------------------------*
DATA GS_CUSTOMER TYPE ZFUJII01.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*
*1レコード目処理:構造に値を入れて、内部テーブルへ追加
*&---------------------------------------------------------------------*
*値の代入
CLEAR GS_CUSTOMER.
GS_CUSTOMER-MANDT = SY-MANDT. "クライアント
GS_CUSTOMER-KUNNR = 'K003'. "得意先コード
GS_CUSTOMER-NAME1 = 'テスト農園'. "名称1
GS_CUSTOMER-NAME2 = '北海道'. "名称2
*内部テーブルへ格納
APPEND GS_CUSTOMER TO GT_CUSTOMERS.
*&---------------------------------------------------------------------*
*2レコード目処理
*&---------------------------------------------------------------------*
*値の代入
CLEAR GS_CUSTOMER.
GS_CUSTOMER-MANDT = SY-MANDT. "クライアント
GS_CUSTOMER-KUNNR = 'K004'. "得意先コード
GS_CUSTOMER-NAME1 = '有限会社ABC'. "名称1
GS_CUSTOMER-NAME2 = '東京都'. "名称2
*内部テーブルへ格納
APPEND GS_CUSTOMER TO GT_CUSTOMERS.
*出力処理:1レコードずつ出力
LOOP AT GT_CUSTOMERS INTO GS_CUSTOMER.
WRITE: / GS_CUSTOMER-MANDT,
GS_CUSTOMER-KUNNR,
GS_CUSTOMER-NAME1,
GS_CUSTOMER-NAME2.
ENDLOOP.
END-OF-SELECTION.
実行結果
「サンプルコード」②
REPORT Z_SAMPLE138.
*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA LT_CUSTOMER TYPE STANDARD TABLE OF ZFUJII01 WITH EMPTY KEY.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
"1件目を追加
APPEND VALUE ZFUJII01(
MANDT = SY-MANDT
KUNNR = 'K005'
NAME1 = 'テスト商事'
NAME2 = '大阪府'
) TO LT_CUSTOMER.
"2件目を追加
APPEND VALUE ZFUJII01(
MANDT = SY-MANDT
KUNNR = 'K006'
NAME1 = 'サンプル電工'
NAME2 = '福岡県'
) TO LT_CUSTOMER.
*出力処理:1レコードずつ出力
LOOP AT LT_CUSTOMER INTO DATA(LS_CUSTOMER).
WRITE: / LS_CUSTOMER-MANDT,
LS_CUSTOMER-KUNNR,
LS_CUSTOMER-NAME1,
LS_CUSTOMER-NAME2.
ENDLOOP.
END-OF-SELECTION.
実行結果
内部テーブル(新構文)
DATA 命令:内部テーブル(新構文)
内部テーブルを宣言する際の構文は以下の通りです。
「サンプルコード」①
REPORT Z_SAMPLE137_NEW.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*内部テーブルへ格納
DATA(GT_CUSTOMERS) = VALUE ZFUJII01_TAB(
( MANDT = SY-MANDT KUNNR = 'K003' NAME1 = 'テスト農園' NAME2 = '北海道' )
( MANDT = SY-MANDT KUNNR = 'K004' NAME1 = '有限会社ABC' NAME2 = '東京都' ) ).
*出力処理:LOOP側もインライン宣言で1行(構造)を受け取れる
LOOP AT GT_CUSTOMERS INTO DATA(GS_CUSTOMER).
WRITE: / GS_CUSTOMER-MANDT,
GS_CUSTOMER-KUNNR,
GS_CUSTOMER-NAME1,
GS_CUSTOMER-NAME2.
ENDLOOP.
END-OF-SELECTION.
サンプルコードでは「 VALUE <テーブルデータ型> 」を用いて、内部テーブルに値を代入しています。
また、LOOP処理ではインライン宣言で構造を作成し、1レコードずつ出力しています。
DATA命令:構造(新構文)にて説明した通り、「 VALUE <DBテーブル> 」を用いると構造が宣言
されます。そのため、内部テーブルにVALUE命令を使用する場合、テーブルデータ型を用いる必要があります。
実行結果