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.