DATA命令

13.3 DATA命令

3. DATA命令

DATA命令とは

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

TYPES命令とDATA命令の違い

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

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

となります。

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

変数

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

DATA命令:変数

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

「サンプルコード」①

1REPORT Z_SAMPLE135.
2 
3*&---------------------------------------------------------------------*
4* 変数定義
5*&---------------------------------------------------------------------*
6DATA:
7      WK_C(10) TYPE C, "テキスト項目
8      WK_I     TYPE I, "整数
9      WK_D     TYPE D. "日付項目
10 
11*&---------------------------------------------------------------------*
12* 主処理
13*&---------------------------------------------------------------------*
14START-OF-SELECTION.
15 
16*初期化
17CLEAR: WK_C,
18       WK_I,
19       WK_D.
20 
21*値の代入
22   WK_C = 'あいうえお'.
23   WK_I = 123.
24   WK_D = '20220101'.
25 
26*画面出力処理
27  WRITE WK_C.
28  WRITE / WK_I.
29  WRITE / WK_D.
30 
31END-OF-SELECTION.

実行結果

構造

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

DATA命令:構造

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

方法①

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

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

方法②

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

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

「サンプルコード」①

1REPORT Z_SAMPLE136.
2 
3*&---------------------------------------------------------------------*
4* 構造定義
5*&---------------------------------------------------------------------*
6DATA ST_ZFUJII01 TYPE ZFUJII01.
7 
8*&---------------------------------------------------------------------*
9* 主処理
10*&---------------------------------------------------------------------*
11START-OF-SELECTION.
12*値の代入
13   ST_ZFUJII01-MANDT = '800'.                 "クライアント
14   ST_ZFUJII01-KUNNR = 'K001'.                "得意先コード
15   ST_ZFUJII01-NAME1 = 'テスト株式会社'.        "名称1
16   ST_ZFUJII01-NAME2 = '東京都'.               "名称2
17 
18*画面出力処理
19   WRITE ST_ZFUJII01-MANDT.
20   WRITE ST_ZFUJII01-KUNNR.
21   WRITE ST_ZFUJII01-NAME1.
22   WRITE ST_ZFUJII01-NAME2.
23 
24END-OF-SELECTION.

実行結果

内部テーブル

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

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

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

DATA命令:内部テーブル

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

方法①

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

方法②

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

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

「サンプルコード」①

1REPORT Z_SAMPLE137.
2*&---------------------------------------------------------------------*
3* 内部テーブル定義
4*&---------------------------------------------------------------------*
5DATA IT_ZFUJII01 TYPE ZFUJII01_TAB.
6 
7*&---------------------------------------------------------------------*
8* 構造定義
9*&---------------------------------------------------------------------*
10DATA ST_ZFUJII01 TYPE ZFUJII01.
11 
12*&---------------------------------------------------------------------*
13* 主処理
14*&---------------------------------------------------------------------*
15START-OF-SELECTION.
16*&---------------------------------------------------------------------*
17*1レコード目処理
18*&---------------------------------------------------------------------*
19*値の代入
20   ST_ZFUJII01-MANDT = '800'.
21   ST_ZFUJII01-KUNNR = 'K003'.
22   ST_ZFUJII01-NAME1 = 'テスト農園'.
23   ST_ZFUJII01-NAME2 = '北海道'.
24*内部テーブルへ格納
25APPEND ST_ZFUJII01 TO IT_ZFUJII01.
26 
27*ST_ZFUJII01の初期化
28CLEAR ST_ZFUJII01.
29*&---------------------------------------------------------------------*
30*2レコード目処理
31*&---------------------------------------------------------------------*
32*値の代入
33   ST_ZFUJII01-MANDT = '800'.
34   ST_ZFUJII01-KUNNR = 'K004'.
35   ST_ZFUJII01-NAME1 = '有限会社abc'.
36   ST_ZFUJII01-NAME2 = '東京都'.
37 
38*内部テーブルへ格納
39APPEND ST_ZFUJII01 TO IT_ZFUJII01.
40 
41*ST_ZFUJII01の初期化
42CLEAR ST_ZFUJII01.
43 
44*出力処理
45*1レコードずつ出力
46  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
47    WRITE ST_ZFUJII01-MANDT.
48    WRITE ST_ZFUJII01-KUNNR.
49    WRITE ST_ZFUJII01-NAME1.
50    WRITE ST_ZFUJII01-NAME2.
51    WRITE /.
52  ENDLOOP.
53 
54END-OF-SELECTION.

実行結果

「サンプルコード」②

1REPORT Z_SAMPLE138.
2*&---------------------------------------------------------------------*
3* 内部テーブル定義
4*&---------------------------------------------------------------------*
5DATA IT_ZFUJII01 TYPE STANDARD TABLE OF ZFUJII01.
6 
7*&---------------------------------------------------------------------*
8* 構造定義
9*&---------------------------------------------------------------------*
10DATA ST_ZFUJII01 TYPE ZFUJII01.
11 
12*&---------------------------------------------------------------------*
13* 主処理
14*&---------------------------------------------------------------------*
15START-OF-SELECTION.
16*初期化
17CLEAR: IT_ZFUJII01,
18           ST_ZFUJII01.
19*&---------------------------------------------------------------------*
20*1レコード目処理
21*&---------------------------------------------------------------------*
22*値の代入
23   ST_ZFUJII01-MANDT = '800'.
24   ST_ZFUJII01-KUNNR = 'K005'.
25   ST_ZFUJII01-NAME1 = 'テスト商事'.
26   ST_ZFUJII01-NAME2 = '大阪府'.
27 
28*内部テーブルへ格納
29APPEND ST_ZFUJII01 TO IT_ZFUJII01.
30*ST_ZFUJII01の初期化
31CLEAR ST_ZFUJII01.
32*&---------------------------------------------------------------------*
33*2レコード目処理
34*&---------------------------------------------------------------------*
35*値の代入
36   ST_ZFUJII01-MANDT = '800'.
37   ST_ZFUJII01-KUNNR = 'K006'.
38   ST_ZFUJII01-NAME1 = 'ABC電工'.
39   ST_ZFUJII01-NAME2 = '福岡県'.
40 
41*内部テーブルへ格納
42APPEND ST_ZFUJII01 TO IT_ZFUJII01.
43 
44*WK_LISTの初期化
45CLEAR ST_ZFUJII01.
46 
47*出力処理
48  LOOP AT IT_ZFUJII01 INTO ST_ZFUJII01.
49*1レコードずつ出力
50    WRITE ST_ZFUJII01-MANDT.
51    WRITE ST_ZFUJII01-KUNNR.
52    WRITE ST_ZFUJII01-NAME1.
53    WRITE ST_ZFUJII01-NAME2.
54    WRITE /.
55  ENDLOOP.
56 
57  END-OF-SELECTION.

実行結果


NEXT>> 13.4 CONSTANTS

f