DATA命令

13.3 DATA命令

3. DATA命令

DATA命令とは

DATA命令によって作成された変数や構造および内部テーブルは、データオブジェクトと呼ばれます。
TYPES命令で定義した型や事前定義済みデータ型、ABAPディクショナリオブジェクトのデータ型から
DATA命令によって変数や構造および内部テーブルを作成します。

TYPES命令とDATA命令の違い

TYPES命令とDATA命令の違いは明確です。

  • DATA命令 ⇒ 変数/構造/内部テーブルを宣言
  • TYPES命令 ⇒ 変数/構造/内部テーブルの基となる「型」を定義

となります。

基本的な流れは、①「TYPES命令で型を定義」を行ったあと、②「①で定義したデータ型に基づいてDATA命令で変数/構造を宣言」するという流れになります。

変数

変数は、単一項目の変数であり、データを1つだけ格納することができる箱のことを指します。

DATA命令:変数

変数を宣言する際の構文は以下の通りです。

「サンプルコード」①

REPORT Z_SAMPLE135.

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
      WK_C(10) TYPE C, "テキスト項目
      WK_I     TYPE I, "整数
      WK_D     TYPE D. "日付項目

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*初期化
CLEAR: WK_C,
       WK_I,
       WK_D.

*値の代入
   WK_C = 'あいうえお'.
   WK_I = 123.
   WK_D = '20220101'.

*画面出力処理
  WRITE WK_C.
  WRITE / WK_I.
  WRITE / WK_D.

END-OF-SELECTION.

実行結果

構造

構造(ワークエリア/作業領域)は1行に3列や20列など1行複数列の仕切りを持った箱となります。
内部テーブルに値を格納したり、取出したりする場合に使用します。
変数でも同様に構造(ワークエリア/作業領域)に値を格納したり取出したりすることもできます。

DATA命令:構造

DATA宣言での構造の宣言方法は2つあります。

方法①

1つ目は、構造の型を直接参照する方法です。
構造の型を参照する場合は、宣言するだけで構造を定義することができます。

※DBテーブルは、データ型ではないが、SAPの仕様上 構造データ型として使えます。

方法②

2つ目は、DATA BEGIN OFで定義し宣言する方法です。
DATA命令内で構造データ型を「BEGIN OF~END OF」で定義します。
この場合、必要な項目と構造名を同時に定義する必要があります。

ですが、こちらは基本的に使われないです。
構造(ワークエリア/作業領域)を直接定義することとなり、再利用が出来ない事が主な理由です。

「サンプルコード」①

REPORT Z_SAMPLE136.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII01 TYPE ZFUJII01.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*値の代入
   ST_ZFUJII01-MANDT = '800'.                 "クライアント
   ST_ZFUJII01-KUNNR = 'K001'.                "得意先コード
   ST_ZFUJII01-NAME1 = 'テスト株式会社'.        "名称1
   ST_ZFUJII01-NAME2 = '東京都'.               "名称2

*画面出力処理
   WRITE ST_ZFUJII01-MANDT.
   WRITE ST_ZFUJII01-KUNNR.
   WRITE ST_ZFUJII01-NAME1.
   WRITE ST_ZFUJII01-NAME2.

END-OF-SELECTION.

実行結果

内部テーブル

内部テーブルは複数行複数列の仕切りを持った箱となります。
ABAPにおける複数行の構造です。「テーブル」の名の付く通り、複数のレコードを保持することができるメモリ領域です。
Excelをイメージして頂くと分かりやすいかと思います。

用途としては、プログラム内で取得したデータを一時的に保持する場合に用いる事が多く、一時的に保持したデータを修正/追加/読込み/取出し/検索条件/出力と様々な形で使用されます。
一時的とはプログラムが実行されて終了するまでの間となり、作業メモリに保持されます。

長期的に保持する場合はABAPディクショナリ(SE11)より作成されたテーブルを使用して保持する必要があります。
テーブル内の値を取出したり修正後に格納したりする際は構造(ワークエリア/作業領域)を使用してデータの受渡しを行います。

DATA命令:内部テーブル

内部テーブルの宣言方法も2つあり、 1つはテーブルデータ型を参照する方法、
もう1つは、構造データ型またはDBテーブルを参照する方法です。

方法①

テーブルデータ型を参照する場合は、これまでと同様に下の構文のように
宣言するだけで内部テーブルを作成することができます。

方法②

構造データ型を参照する場合は、「STANDARD TABLE OF」という構文を
追加する必要があります。
この部分は、作成したい内部テーブルの種類に応じて書き換える必要があります。
内部テーブルの種類や宣言方法については、後述で説明します。

※DBテーブルはデータ型ではないが、SAPシステム上ではDBテーブルの構造を参照するようにSAPシステムの仕様として構築されており、DBテーブルを型として指定すると内部テーブルを作成します。

「サンプルコード」①

REPORT Z_SAMPLE137.
*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_ZFUJII01 TYPE ZFUJII01_TAB.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII01 TYPE ZFUJII01.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*
*1レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_ZFUJII01-MANDT = '800'.
   ST_ZFUJII01-KUNNR = 'K003'.
   ST_ZFUJII01-NAME1 = 'テスト農園'.
   ST_ZFUJII01-NAME2 = '北海道'.
*内部テーブルへ格納
APPEND ST_ZFUJII01 TO IT_ZFUJII01.

*ST_ZFUJII01の初期化
CLEAR ST_ZFUJII01.
*&---------------------------------------------------------------------*
*2レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_ZFUJII01-MANDT = '800'.
   ST_ZFUJII01-KUNNR = 'K004'.
   ST_ZFUJII01-NAME1 = '有限会社abc'.
   ST_ZFUJII01-NAME2 = '東京都'.

*内部テーブルへ格納
APPEND ST_ZFUJII01 TO IT_ZFUJII01.

*ST_ZFUJII01の初期化
CLEAR ST_ZFUJII01.

*出力処理
*1レコードずつ出力
  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
    WRITE ST_ZFUJII01-MANDT.
    WRITE ST_ZFUJII01-KUNNR.
    WRITE ST_ZFUJII01-NAME1.
    WRITE ST_ZFUJII01-NAME2.
    WRITE /.
  ENDLOOP.

END-OF-SELECTION.

実行結果

「サンプルコード」②

REPORT Z_SAMPLE138.
*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_ZFUJII01 TYPE STANDARD TABLE OF ZFUJII01.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_ZFUJII01 TYPE ZFUJII01.

*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*初期化
CLEAR: IT_ZFUJII01,
           ST_ZFUJII01.
*&---------------------------------------------------------------------*
*1レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_ZFUJII01-MANDT = '800'.
   ST_ZFUJII01-KUNNR = 'K005'.
   ST_ZFUJII01-NAME1 = 'テスト商事'.
   ST_ZFUJII01-NAME2 = '大阪府'.

*内部テーブルへ格納
APPEND ST_ZFUJII01 TO IT_ZFUJII01.
*ST_ZFUJII01の初期化
CLEAR ST_ZFUJII01.
*&---------------------------------------------------------------------*
*2レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_ZFUJII01-MANDT = '800'.
   ST_ZFUJII01-KUNNR = 'K006'.
   ST_ZFUJII01-NAME1 = 'ABC電工'.
   ST_ZFUJII01-NAME2 = '福岡県'.

*内部テーブルへ格納
APPEND ST_ZFUJII01 TO IT_ZFUJII01.

*WK_LISTの初期化
CLEAR ST_ZFUJII01.

*出力処理
  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
*1レコードずつ出力
    WRITE ST_ZFUJII01-MANDT.
    WRITE ST_ZFUJII01-KUNNR.
    WRITE ST_ZFUJII01-NAME1.
    WRITE ST_ZFUJII01-NAME2.
    WRITE /.
  ENDLOOP.

  END-OF-SELECTION.

実行結果


NEXT>> 13.4 CONSTANTS