TYPES命令

13.2 TYPES命令

2. TYPES命令

TYPES命令とは

TYPES命令では、変数、構造、内部テーブルなどのデータ型を作成することができます。
データ型名は、基本的に任意に決められます。
データ型に使用できるものには、基本データ型、構造データ型、テーブルデータ型の3種類です。

基本データ型

基本データ型は、主に変数の型のことを指します。
イメージとしては、1つの箱のようなイメージです。

基本データ型に用いられるものは、 「事前定義済データ型」と「ABAPディクショナリオブジェクトのデータ型」の2つです。

「事前定義済データ型」

事前定義のABAPデータ型は名前の通り標準で予め用意されたデータ型です。

「事前定義済データ型」は、文字データ型、数字データ型、文字列に分けられます。
文字データ型,数字データ型は固定長となっており、固定の長さを持ちます。
文字列は、可変長となっており、固定の長さを持ちません。

「完全ABAPデータ型と不完全データ型」

前述で述べた固定長のデータ型(文字データ型、数値データ型)の中でも完全ABAPデータ型と不完全データ型があります。
(ここでの固定長とは、プログラム内で使用する際には、長さを指定し、固定する必要があるデータ型という意味を指します。※後述でも記載していますが、指定しない場合は、最小を指定したという扱いになり、最小の固定長で固定されます。)

簡単に説明すると予めデータの長さが決まっている、決まっていないという違いがあります。

「完全ABAPデータ型」

データ型の長さが事前に決まっているため、以下の型を使用する場合は長さを指定する必要はありません。(指定する事はできます。)

「不完全データ型」

データ型の長さが決まっていないため、長さを指定する必要があります。
指定しない場合は最小の長さとなります。※前ページの「事前定義済データ型」に記載されている表の有効項目長の最小の長さになります。

「ABAPディクショナリオブジェクトのデータ型」

ABAPディクショナリオブジェクトのデータ型とは、
ABAPディクショナリ(トランザクションコード:SE11)を用いて登録されているデータ型のことです。
ABAPプログラムの中でABAP ディクショナリのデータ型を使用する場合、事前定義されたディクショナリのデータ型は以下のように ABAP データ型へと変換されます。

TYPES命令:基本データ型

また、事前定義済みデータ型を使用した場合の桁数は、
基本データ型が持つ桁数になりますが、自分で決めることも可能です。
その場合、下記の構文の項目長の部分に任意の数字を入れます。

「サンプルコード」①

REPORT Z_SAMPLE131.

*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
TYPES:
  TYP_TEXT          TYPE C,             "テキスト項目
  TYP_TEXT8(8)    TYPE C,             "テキスト項目
  TYP_TEXT10(10) TYPE C,            "テキスト項目
  TYP_NUM            TYPE I,              "整数
  TYP_KUNNR        TYPE KUNNR.  "得意先コード

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
   WK_TEXT      TYPE TYP_TEXT,
   WK_TEXT8    TYPE TYP_TEXT8,
   WK_TEXT10  TYPE TYP_TEXT10,
   WK_NUM       TYPE TYP_NUM,
   WK_KUNNR  TYPE TYP_KUNNR.














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

*初期化
CLEAR: WK_TEXT,
            WK_TEXT8,
            WK_TEXT10,
            WK_NUM,
            WK_KUNNR.

*値の代入
   WK_TEXT = '0123456789'.
   WK_TEXT8 = '0123456789'.
   WK_TEXT10 = '0123456789'.
   WK_NUM = 123.
   WK_KUNNR = 'A001'.

*出力処理
  WRITE WK_TEXT.
  WRITE / WK_TEXT8.
  WRITE / WK_TEXT10.
  WRITE / WK_NUM.
  WRITE / WK_KUNNR.

END-OF-SELECTION.

実行結果

「サンプルコード」②

REPORT Z_SAMPLE132.

*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
TYPES:
  TYP_TEXT8  TYPE C LENGTH 8,  "テキスト項目
  TYP_TEXT10 TYPE C LENGTH 10. "テキスト項目

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
   WK_TEXT8  TYPE TYP_TEXT8,
   WK_TEXT10 TYPE TYP_TEXT10.

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

*初期化
CLEAR: WK_TEXT8,
            WK_TEXT10.

*値の代入
   WK_TEXT8 = 'あいうえお'.
   WK_TEXT10 = 'あいうえお'.

*出力処理
  WRITE WK_TEXT8.
  WRITE / WK_TEXT10.

END-OF-SELECTION.

実行結果

補足

実行結果で、WK_TEXT8に代入された文字の結果が「あいうえ」にならず、「あいう>」
となっています。
「サンプルコード①」では、WK_TEXT8に代入された文字の結果は「01234567」と、8バイトフルに表示されています。
なぜ、途中までしか表示されず、一方でサンプルコード①は表示されるのでしょうか?
この違いは何でしょうか?

こちらはSAPの仕様となりますが、違いとしては、
サンプル①においてWK_TEXT8には、英数字の場合、代入する時点で、8バイトより大きい部分については切り捨てされて処理されます。
サンプル②の全角文字の場合、切り捨てられずに WK_TEXT8に「あいうえお」がすべてが WK_TEXT8に格納されてしまいます。

上記のような値を格納する処理に違いがあります。

また、サンプル②の WK_TEXT8 は値が全て格納されていますが、TYPEで定義された長さは”8バイト”のため、
次のWRITE命令にて WK_TEXT8 の内容を書き出す際に、”8バイト”で表示しようとします。
ただし、 WK_TEXT8に「あいうえお」すべてが WK_TEXT8に格納されていますので、
処理としては、格納されている値をすべてを表示できないので、”表示できない文字があります”、見切れているという意味で「>」が入ります。
上記「>」も文字(1バイト)としてカウントされ、残りの1バイトでは、全角文字「え」は2バイトでのカウントになるため、
バイトの長さが足りず表示することが出来なくなり、消えてしまう形となります。
基本サンプル②のWK_TEXT8 のような形にならないように気を付けましょう。

「サンプルコード」③

REPORT ZTEST_BASEDATA.

DATA:
  LCGATA(10) TYPE C,                      "C型
  LNGATA(10) TYPE N,                      "N型
  LDGATA     TYPE D,                      "D型
  LTGATA     TYPE T,                      "T型
  LIGATA     TYPE I,                      "I型
  LFGATA     TYPE F,                      "F型
  LPGATA(5)  TYPE P DECIMALS 3,           "P型
  LXGATA(10) TYPE X,                      "X型
  LSTRING    TYPE STRING,                 "STRING型
  LXSTRING   TYPE XSTRING.                "XSTRING型

PARAMETERS:
  PCHAR(20)  TYPE C,                     "文字
  PINTEG     TYPE I,                     "整数
  PFLOAT     TYPE P DECIMALS 3,          "小数
  PDATE      TYPE D,                     "日付
  PTIME      TYPE T,                     "時刻
  PHEXAD(10) TYPE X.                     "Byte

*値の代入
LCGATA   = PCHAR.     "C型
LNGATA   = PINTEG.    "N型
LDGATA   = PDATE.     "D型
LTGATA   = PTIME.     "T型
LIGATA   = PINTEG.    "I型
LFGATA   = PFLOAT.    "F型
LPGATA   = PFLOAT.    "P型
LXGATA   = PHEXAD.    "X型
LSTRING  = PCHAR.     "STRING型
LXSTRING = PHEXAD.    "XSTRING型

*出力結果
WRITE:
    'LCGATA(C型)        :', LCGATA,
  / 'LNGATA(N型)        :', LNGATA,
  / 'LDGATA(D型)        :', LDGATA,
  / 'LTGATA(T型)        :', LTGATA,
  / 'LIGATA(I型)        :', LIGATA,
  / 'LFGATA(F型)        :', LFGATA,
  / 'LPGATA(P型)        :', LPGATA,
  / 'LXGATA(X型)        :', LXGATA,
  / 'LSTRING(STRING型)  :', LSTRING,
  / 'LXSTRING(XSTRING型):', LXSTRING.

実行結果

補足

「TYPES命令」を使わず、「DATA命令」の中で、型定義を指定し宣言していることについて、
サンプルコードのようにTYPES命令で定義した型を使いまわす必要が無い場合、後述で記載しているDATA命令だけで、問題ありません。
TYPES命令を使用する理由としては、TYPES命令で定義したものは、同様の内容を
DATA命令で複製できるという利点があります。

構造データ型

構造データ型は、構造の型を定義するための型です。
箱が連なった1行のデータ、以下のようなイメージです。

TYPES命令:構造データ型

構造(ワークエリア、作業領域)を定義する際のデータ型として以下の様に定義します。

上記のように、構造の型を宣言するためには、同時にその構造を構成する、
基本データ型も宣言する必要があります。
なお、構造データ型名は任意の名前を決めることができます。

「BEGIN OF~END OF」で挟まれた部分は、前述の基本データ型宣言と同じ方法で宣言します。

※構造データ型において宣言されたデータ型名部分を参照する場合は、
「構造データ型ー基本データ型」のように「ー」でつなぐことで参照できます。

「サンプルコード」①

REPORT ZFUJII_SAMPLE133.

*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
*構造データ型
TYPES:
    BEGIN OF TYP_PRODUCT_LIST,
      TYP_TEXT(8) TYPE C,      "商品名
      TYP_CODE(4) TYPE C,      "商品コード
      TYP_LIFNR   TYPE LIFNR,  "仕入先コード
    END OF TYP_PRODUCT_LIST.

*&---------------------------------------------------------------------*
* 変数定義
*&---------------------------------------------------------------------*
DATA:
      WK_TEXT  TYPE TYP_PRODUCT_LIST-TYP_TEXT,
      WK_CODE  TYPE TYP_PRODUCT_LIST-TYP_CODE,
      WK_LIFNR TYPE TYP_PRODUCT_LIST-TYP_LIFNR.
*&---------------------------------------------------------------------*
* 主処理
*&---------------------------------------------------------------------*
START-OF-SELECTION.

* 初期化
  CLEAR: WK_TEXT,
         WK_CODE,
         WK_LIFNR.

*値の代入
   WK_TEXT  = 'りんご'.
   WK_CODE  = 'C001'.
   WK_LIFNR = 'L100'.

*出力処理
  WRITE WK_TEXT.
  WRITE / WK_CODE.
  WRITE / WK_LIFNR.

END-OF-SELECTION.

実行結果

テーブルデータ型

テーブルデータ型は、すでに宣言されている構造、またはSAP標準に存在する構造データ型を参照することができる「内部テーブルの型」を指します。

テーブルデータ型は、以下に示したように同じ構造がいくつも連なった複数行の
構造データ型です。

テーブルデータ型のデータ型として使用できるものは、構造データ型のみです。

例えば、「1つの変数」と「1項目しか持たない構造」は
見かけ上同じ形をしていますが、変数をテーブルデータ型として
宣言することはできません。

要は、変数として定義しているか、構造として定義しているかの違いです。
変数として定義している場合は、テーブルデータ型として使用することはできないと覚えておきましょう。

TYPES命令:テーブルデータ型

テーブルデータ型を定義する際は以下の様に定義します。

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

すでにABAPディクショナリ(トランザクションコード:SE11)を用いて登録されているテーブルデータ型を使用する場合は、以下のように定義します。

※構文②は、特に作成するメリットはないので(構文①を参照すればよいので)、構文②を使用することはないですが、一応、作成することはできるということを覚えておきましょう。

「サンプルコード」①

REPORT Z_SAMPLE134.

*&---------------------------------------------------------------------*
* 型定義
*&---------------------------------------------------------------------*
*構造データ型
TYPES:
    BEGIN OF TYP_PRODUCT_LIST,
      TYP_TEXT(8) TYPE C,  "商品名
      TYP_CODE(4) TYPE C,    "商品コード
      TYP_LIFNR   TYPE LIFNR,  "仕入先コード
    END OF TYP_PRODUCT_LIST.

*テーブルデータ型
TYPES TYP_LIST TYPE STANDARD TABLE OF TYP_PRODUCT_LIST.

*&---------------------------------------------------------------------*
* 内部テーブル定義
*&---------------------------------------------------------------------*
DATA IT_PRODUCT_LIST TYPE TYP_LIST.

*&---------------------------------------------------------------------*
* 構造定義
*&---------------------------------------------------------------------*
DATA ST_PRODUCT_LIST TYPE TYP_PRODUCT_LIST.

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

* 初期化
  CLEAR: IT_PRODUCT_LIST,
              ST_PRODUCT_LIST.

*&---------------------------------------------------------------------*
*1レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_PRODUCT_LIST-TYP_TEXT = 'りんご'.
   ST_PRODUCT_LIST-TYP_CODE = 'C001'.
   ST_PRODUCT_LIST-TYP_LIFNR = 'L100'.

*内部テーブルへ格納
APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST.

*初期化
CLEAR ST_PRODUCT_LIST.










*&---------------------------------------------------------------------*
*2レコード目処理
*&---------------------------------------------------------------------*
*値の代入
   ST_PRODUCT_LIST-TYP_TEXT = 'みかん'.
   ST_PRODUCT_LIST-TYP_CODE = 'C003'.
   ST_PRODUCT_LIST-TYP_LIFNR = 'L300'.

*内部テーブルへ格納
APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST.

*初期化
CLEAR ST_PRODUCT_LIST.

*出力処理
  LOOP AT IT_PRODUCT_LIST INTO ST_PRODUCT_LIST.
*1レコードずつ出力
     WRITE ST_PRODUCT_LIST.
     WRITE /.
  ENDLOOP.

END-OF-SELECTION.

実行結果


NEXT>> 13.3 DATA命令