TYPES命令

13.2 TYPES命令

2. TYPES命令

TYPES命令とは

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

基本データ型

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

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

「事前定義済データ型」

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

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

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

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

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

「完全ABAPデータ型」

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

「不完全データ型」

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

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

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

TYPES命令:基本データ型

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

「サンプルコード」①

1REPORT Z_SAMPLE131.
2 
3*&---------------------------------------------------------------------*
4* 型定義
5*&---------------------------------------------------------------------*
6TYPES:
7  TYP_TEXT          TYPE C,             "テキスト項目
8  TYP_TEXT8(8)    TYPE C,             "テキスト項目
9  TYP_TEXT10(10) TYPE C,            "テキスト項目
10  TYP_NUM            TYPE I,              "整数
11  TYP_KUNNR        TYPE KUNNR.  "得意先コード
12 
13*&---------------------------------------------------------------------*
14* 変数定義
15*&---------------------------------------------------------------------*
16DATA:
17   WK_TEXT      TYPE TYP_TEXT,
18   WK_TEXT8    TYPE TYP_TEXT8,
19   WK_TEXT10  TYPE TYP_TEXT10,
20   WK_NUM       TYPE TYP_NUM,
21   WK_KUNNR  TYPE TYP_KUNNR.
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36*&---------------------------------------------------------------------*
37* 主処理
38*&---------------------------------------------------------------------*
39START-OF-SELECTION.
40 
41*初期化
42CLEAR: WK_TEXT,
43            WK_TEXT8,
44            WK_TEXT10,
45            WK_NUM,
46            WK_KUNNR.
47 
48*値の代入
49   WK_TEXT = '0123456789'.
50   WK_TEXT8 = '0123456789'.
51   WK_TEXT10 = '0123456789'.
52   WK_NUM = 123.
53   WK_KUNNR = 'A001'.
54 
55*出力処理
56  WRITE WK_TEXT.
57  WRITE / WK_TEXT8.
58  WRITE / WK_TEXT10.
59  WRITE / WK_NUM.
60  WRITE / WK_KUNNR.
61 
62END-OF-SELECTION.

実行結果

「サンプルコード」②

1REPORT Z_SAMPLE132.
2 
3*&---------------------------------------------------------------------*
4* 型定義
5*&---------------------------------------------------------------------*
6TYPES:
7  TYP_TEXT8  TYPE C LENGTH 8,  "テキスト項目
8  TYP_TEXT10 TYPE C LENGTH 10. "テキスト項目
9 
10*&---------------------------------------------------------------------*
11* 変数定義
12*&---------------------------------------------------------------------*
13DATA:
14   WK_TEXT8  TYPE TYP_TEXT8,
15   WK_TEXT10 TYPE TYP_TEXT10.
16 
17*&---------------------------------------------------------------------*
18* 主処理
19*&---------------------------------------------------------------------*
20START-OF-SELECTION.
21 
22*初期化
23CLEAR: WK_TEXT8,
24            WK_TEXT10.
25 
26*値の代入
27   WK_TEXT8 = 'あいうえお'.
28   WK_TEXT10 = 'あいうえお'.
29 
30*出力処理
31  WRITE WK_TEXT8.
32  WRITE / WK_TEXT10.
33 
34END-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 のような形にならないように気を付けましょう。

「サンプルコード」③

1REPORT ZTEST_BASEDATA.
2 
3DATA:
4  LCGATA(10) TYPE C,                      "C型
5  LNGATA(10) TYPE N,                      "N型
6  LDGATA     TYPE D,                      "D型
7  LTGATA     TYPE T,                      "T型
8  LIGATA     TYPE I,                      "I型
9  LFGATA     TYPE F,                      "F型
10  LPGATA(5)  TYPE P DECIMALS 3,           "P型
11  LXGATA(10) TYPE X,                      "X型
12  LSTRING    TYPE STRING,                 "STRING型
13  LXSTRING   TYPE XSTRING.                "XSTRING型
14 
15PARAMETERS:
16  PCHAR(20)  TYPE C,                     "文字
17  PINTEG     TYPE I,                     "整数
18  PFLOAT     TYPE P DECIMALS 3,          "小数
19  PDATE      TYPE D,                     "日付
20  PTIME      TYPE T,                     "時刻
21  PHEXAD(10) TYPE X.                     "Byte
22 
23*値の代入
24LCGATA   = PCHAR.     "C型
25LNGATA   = PINTEG.    "N型
26LDGATA   = PDATE.     "D型
27LTGATA   = PTIME.     "T型
28LIGATA   = PINTEG.    "I型
29LFGATA   = PFLOAT.    "F型
30LPGATA   = PFLOAT.    "P型
31LXGATA   = PHEXAD.    "X型
32LSTRING  = PCHAR.     "STRING型
33LXSTRING = PHEXAD.    "XSTRING型
34 
35*出力結果
36WRITE:
37    'LCGATA(C型)        :', LCGATA,
38  / 'LNGATA(N型)        :', LNGATA,
39  / 'LDGATA(D型)        :', LDGATA,
40  / 'LTGATA(T型)        :', LTGATA,
41  / 'LIGATA(I型)        :', LIGATA,
42  / 'LFGATA(F型)        :', LFGATA,
43  / 'LPGATA(P型)        :', LPGATA,
44  / 'LXGATA(X型)        :', LXGATA,
45  / 'LSTRING(STRING型)  :', LSTRING,
46  / 'LXSTRING(XSTRING型):', LXSTRING.

実行結果

補足

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

構造データ型

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

TYPES命令:構造データ型

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

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

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

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

「サンプルコード」①

1REPORT ZFUJII_SAMPLE133.
2 
3*&---------------------------------------------------------------------*
4* 型定義
5*&---------------------------------------------------------------------*
6*構造データ型
7TYPES:
8    BEGIN OF TYP_PRODUCT_LIST,
9      TYP_TEXT(8) TYPE C,      "商品名
10      TYP_CODE(4) TYPE C,      "商品コード
11      TYP_LIFNR   TYPE LIFNR,  "仕入先コード
12    END OF TYP_PRODUCT_LIST.
13 
14*&---------------------------------------------------------------------*
15* 変数定義
16*&---------------------------------------------------------------------*
17DATA:
18      WK_TEXT  TYPE TYP_PRODUCT_LIST-TYP_TEXT,
19      WK_CODE  TYPE TYP_PRODUCT_LIST-TYP_CODE,
20      WK_LIFNR TYPE TYP_PRODUCT_LIST-TYP_LIFNR.
21*&---------------------------------------------------------------------*
22* 主処理
23*&---------------------------------------------------------------------*
24START-OF-SELECTION.
25 
26* 初期化
27  CLEAR: WK_TEXT,
28         WK_CODE,
29         WK_LIFNR.
30 
31*値の代入
32   WK_TEXT  = 'りんご'.
33   WK_CODE  = 'C001'.
34   WK_LIFNR = 'L100'.
35 
36*出力処理
37  WRITE WK_TEXT.
38  WRITE / WK_CODE.
39  WRITE / WK_LIFNR.
40 
41END-OF-SELECTION.

実行結果

テーブルデータ型

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

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

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

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

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

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

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

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

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

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

「サンプルコード」①

1REPORT Z_SAMPLE134.
2 
3*&---------------------------------------------------------------------*
4* 型定義
5*&---------------------------------------------------------------------*
6*構造データ型
7TYPES:
8    BEGIN OF TYP_PRODUCT_LIST,
9      TYP_TEXT(8) TYPE C,  "商品名
10      TYP_CODE(4) TYPE C,    "商品コード
11      TYP_LIFNR   TYPE LIFNR,  "仕入先コード
12    END OF TYP_PRODUCT_LIST.
13 
14*テーブルデータ型
15TYPES TYP_LIST TYPE STANDARD TABLE OF TYP_PRODUCT_LIST.
16 
17*&---------------------------------------------------------------------*
18* 内部テーブル定義
19*&---------------------------------------------------------------------*
20DATA IT_PRODUCT_LIST TYPE TYP_LIST.
21 
22*&---------------------------------------------------------------------*
23* 構造定義
24*&---------------------------------------------------------------------*
25DATA ST_PRODUCT_LIST TYPE TYP_PRODUCT_LIST.
26 
27*&---------------------------------------------------------------------*
28* 主処理
29*&---------------------------------------------------------------------*
30START-OF-SELECTION.
31 
32* 初期化
33  CLEAR: IT_PRODUCT_LIST,
34              ST_PRODUCT_LIST.
35 
36*&---------------------------------------------------------------------*
37*1レコード目処理
38*&---------------------------------------------------------------------*
39*値の代入
40   ST_PRODUCT_LIST-TYP_TEXT = 'りんご'.
41   ST_PRODUCT_LIST-TYP_CODE = 'C001'.
42   ST_PRODUCT_LIST-TYP_LIFNR = 'L100'.
43 
44*内部テーブルへ格納
45APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST.
46 
47*初期化
48CLEAR ST_PRODUCT_LIST.
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59*&---------------------------------------------------------------------*
60*2レコード目処理
61*&---------------------------------------------------------------------*
62*値の代入
63   ST_PRODUCT_LIST-TYP_TEXT = 'みかん'.
64   ST_PRODUCT_LIST-TYP_CODE = 'C003'.
65   ST_PRODUCT_LIST-TYP_LIFNR = 'L300'.
66 
67*内部テーブルへ格納
68APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST.
69 
70*初期化
71CLEAR ST_PRODUCT_LIST.
72 
73*出力処理
74  LOOP AT IT_PRODUCT_LIST INTO ST_PRODUCT_LIST.
75*1レコードずつ出力
76     WRITE ST_PRODUCT_LIST.
77     WRITE /.
78  ENDLOOP.
79 
80END-OF-SELECTION.

実行結果


NEXT>> 13.3 DATA命令

f