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.