TYPES命令
13.2 TYPES命令
2. TYPES命令
TYPES命令とは
TYPES命令では、変数、構造、内部テーブルなどのデータ型を作成することができます。
データ型名は、基本的に任意に決められます。
データ型に使用できるものには、基本データ型、構造データ型、テーブルデータ型の3種類です。
基本データ型
基本データ型は、主に変数の型のことを指します。
イメージとしては、1つの箱のようなイメージです。
基本データ型に用いられるものは、 「事前定義済データ型」と「ABAPディクショナリオブジェクトのデータ型」の2つです。
「事前定義済データ型」
事前定義のABAPデータ型は名前の通り標準で予め用意されたデータ型です。
「事前定義済データ型」は、文字データ型、数字データ型、文字列に分けられます。
文字データ型,数字データ型は固定長となっており、固定の長さを持ちます。
文字列は、可変長となっており、固定の長さを持ちません。
「完全ABAPデータ型と不完全データ型」
前述で述べた固定長のデータ型(文字データ型、数値データ型)の中でも完全ABAPデータ型と不完全データ型があります。
(ここでの固定長とは、プログラム内で使用する際には、長さを指定し、固定する必要があるデータ型という意味を指します。※後述でも記載していますが、指定しない場合は、最小を指定したという扱いになり、最小の固定長で固定されます。)
簡単に説明すると予めデータの長さが決まっている、決まっていないという違いがあります。
「完全ABAPデータ型」
データ型の長さが事前に決まっているため、以下の型を使用する場合は長さを指定する必要はありません。(指定する事はできます。)
「不完全データ型」
データ型の長さが決まっていないため、長さを指定する必要があります。
指定しない場合は最小の長さとなります。※前ページの「事前定義済データ型」に記載されている表の有効項目長の最小の長さになります。
「ABAPディクショナリオブジェクトのデータ型」
ABAPディクショナリオブジェクトのデータ型とは、
ABAPディクショナリ(トランザクションコード:SE11)を用いて登録されているデータ型のことです。
ABAPプログラムの中でABAP ディクショナリのデータ型を使用する場合、事前定義されたディクショナリのデータ型は以下のように ABAP データ型へと変換されます。
TYPES命令:基本データ型
また、事前定義済みデータ型を使用した場合の桁数は、
基本データ型が持つ桁数になりますが、自分で決めることも可能です。
その場合、下記の構文の項目長の部分に任意の数字を入れます。
「サンプルコード」①
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
7 | TYP_TEXT TYPE C, "テキスト項目 |
8 | TYP_TEXT8(8) TYPE C, "テキスト項目 |
9 | TYP_TEXT10(10) TYPE C, "テキスト項目 |
11 | TYP_KUNNR TYPE KUNNR. "得意先コード |
13 | *&---------------------------------------------------------------------* |
15 | *&---------------------------------------------------------------------* |
17 | WK_TEXT TYPE TYP_TEXT, |
18 | WK_TEXT8 TYPE TYP_TEXT8, |
19 | WK_TEXT10 TYPE TYP_TEXT10, |
21 | WK_KUNNR TYPE TYP_KUNNR. |
36 | *&---------------------------------------------------------------------* |
38 | *&---------------------------------------------------------------------* |
49 | WK_TEXT = '0123456789'. |
50 | WK_TEXT8 = '0123456789'. |
51 | WK_TEXT10 = '0123456789'. |
実行結果
「サンプルコード」②
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
7 | TYP_TEXT8 TYPE C LENGTH 8, "テキスト項目 |
8 | TYP_TEXT10 TYPE C LENGTH 10. "テキスト項目 |
10 | *&---------------------------------------------------------------------* |
12 | *&---------------------------------------------------------------------* |
14 | WK_TEXT8 TYPE TYP_TEXT8, |
15 | WK_TEXT10 TYPE TYP_TEXT10. |
17 | *&---------------------------------------------------------------------* |
19 | *&---------------------------------------------------------------------* |
実行結果
補足
実行結果で、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 のような形にならないように気を付けましょう。
「サンプルコード」③
10 | LPGATA(5) TYPE P DECIMALS 3, "P型 |
11 | LXGATA(10) TYPE X, "X型 |
12 | LSTRING TYPE STRING, "STRING型 |
13 | LXSTRING TYPE XSTRING. "XSTRING型 |
18 | PFLOAT TYPE P DECIMALS 3, "小数 |
21 | PHEXAD(10) TYPE X. "Byte |
32 | LSTRING = PCHAR. "STRING型 |
33 | LXSTRING = PHEXAD. "XSTRING型 |
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」で挟まれた部分は、前述の基本データ型宣言と同じ方法で宣言します。
※構造データ型において宣言されたデータ型名部分を参照する場合は、
「構造データ型ー基本データ型」のように「ー」でつなぐことで参照できます。
「サンプルコード」①
1 | REPORT ZFUJII_SAMPLE133. |
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
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. |
14 | *&---------------------------------------------------------------------* |
16 | *&---------------------------------------------------------------------* |
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 | *&---------------------------------------------------------------------* |
23 | *&---------------------------------------------------------------------* |
実行結果
テーブルデータ型
テーブルデータ型は、すでに宣言されている構造、またはSAP標準に存在する構造データ型を参照することができる「内部テーブルの型」を指します。
テーブルデータ型は、以下に示したように同じ構造がいくつも連なった複数行の
構造データ型です。
テーブルデータ型のデータ型として使用できるものは、構造データ型のみです。
例えば、「1つの変数」と「1項目しか持たない構造」は
見かけ上同じ形をしていますが、変数をテーブルデータ型として
宣言することはできません。
要は、変数として定義しているか、構造として定義しているかの違いです。
変数として定義している場合は、テーブルデータ型として使用することはできないと覚えておきましょう。
TYPES命令:テーブルデータ型
テーブルデータ型を定義する際は以下の様に定義します。
※DBテーブルはデータ型ではないが、SAPシステム上ではDBテーブルの構造を参照するようにSAPシステムの仕様として構築されており、DBテーブルを型として指定すると内部テーブルを作成します。
すでにABAPディクショナリ(トランザクションコード:SE11)を用いて登録されているテーブルデータ型を使用する場合は、以下のように定義します。
※構文②は、特に作成するメリットはないので(構文①を参照すればよいので)、構文②を使用することはないですが、一応、作成することはできるということを覚えておきましょう。
「サンプルコード」①
3 | *&---------------------------------------------------------------------* |
5 | *&---------------------------------------------------------------------* |
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. |
15 | TYPES TYP_LIST TYPE STANDARD TABLE OF TYP_PRODUCT_LIST. |
17 | *&---------------------------------------------------------------------* |
19 | *&---------------------------------------------------------------------* |
20 | DATA IT_PRODUCT_LIST TYPE TYP_LIST. |
22 | *&---------------------------------------------------------------------* |
24 | *&---------------------------------------------------------------------* |
25 | DATA ST_PRODUCT_LIST TYPE TYP_PRODUCT_LIST. |
27 | *&---------------------------------------------------------------------* |
29 | *&---------------------------------------------------------------------* |
33 | CLEAR: IT_PRODUCT_LIST, |
36 | *&---------------------------------------------------------------------* |
38 | *&---------------------------------------------------------------------* |
40 | ST_PRODUCT_LIST-TYP_TEXT = 'りんご'. |
41 | ST_PRODUCT_LIST-TYP_CODE = 'C001'. |
42 | ST_PRODUCT_LIST-TYP_LIFNR = 'L100'. |
45 | APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST. |
59 | *&---------------------------------------------------------------------* |
61 | *&---------------------------------------------------------------------* |
63 | ST_PRODUCT_LIST-TYP_TEXT = 'みかん'. |
64 | ST_PRODUCT_LIST-TYP_CODE = 'C003'. |
65 | ST_PRODUCT_LIST-TYP_LIFNR = 'L300'. |
68 | APPEND ST_PRODUCT_LIST TO IT_PRODUCT_LIST. |
74 | LOOP AT IT_PRODUCT_LIST INTO ST_PRODUCT_LIST. |
76 | WRITE ST_PRODUCT_LIST. |
実行結果
NEXT>> 13.3 DATA命令