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命令を使用する場合、テーブルデータ型を用いる必要があります。

実行結果


NEXT>> 13.4 CONSTANTS

研修の詳細はこちら