【ABAP】TYPES命令(データ型)

概要

簡単に説明するとデータ型を定義します。
プログラム内で一時的に必要なデータ型がある場合にTYPES命令を使用します。
主な用途としてはTYPES命令で作成したデータ型を基に構造(作業領域またはワークエリア)を定義することとなります。

複数のプログラム内で同じデータ型を使用している場合はTYPES命令ではなく、ABAPディクショナリ(トランザクションコード:SE11)で定義する事でTYPES命令を随時定義しなくても呼出せます。

そのため、一時的に必要なデータ型を定義する際にTYPES命令を使用します。

命令文

データ型の定義についてはいくつか種類がありますので紹介します。
以下紹介するものが全てではないですが最初に紹介する「構造化データ型」を覚えるだけでも充分です。
理由としはほとんどの使用方法が「構造化データ型」であることや大元でもあること、他の定義方法を知るころには十分なABAPスキルが身についていることなどが挙げられます。

構造化データ型

TYPES命令でよく使われる定義の仕方が以下となります。
構造(ワークエリア、作業領域)を定義する際のデータ型として以下の様に定義します。
こちらだけ覚えていれば充分かと思います。

命令文

TYPES:
  BEGIN OF 構造化データ型,
    項目 TYPE データ型,
    項目 TYPE データ型,


  END OF 構造化データ型.

構造化データ型(INCLUDE)

定義の仕方は以下の通りで、BEGIN OF内であれば上記命令文の中にINCLUDEを組込む形で定義する事もできます。コーディングサンプルをご確認いただけると分かるかと思います。
命令文内の構造化タイプは事前に定義した構造化データ型やディクショナリテーブルなど指定する事ができます。
指定した型が構造化データ型にコピーされます。
使用する機会はあまりないですが4.6Cの頃から使用されている(長年使用されている)場合は見かける機会は多いと思われます。

命令文

TYPES: BEGIN OF 構造化データ型,
  INCLUDE TYPE 構造化タイプ AS 名称.
TYPES END OF 構造化データ型.

構造化データ型(下位構造)

構造化データ型内に更に構造化データ型を定義する方法です。
使われるケースは無いかと思いますがこの様な定義の仕方もできます。

命令文

TYPES:
  BEGIN OF 構造化データ型1,
    項目 TYPE データ型,


    BEGIN OF 構造化データ2,
      項目 TYPE データ型,
      項目 TYPE データ型,


    END OF 構造化データ型2,
  END OF 構造化データ型1.

基本データ型

1項目(変数)のデータ型を定義する方法となります。
データ型には事前定義ABAPデータ型やABAPディクショナリ内で定義されているデータオブジェクトまたはデータエレメントなどを指定します。

基本データ型を使用する事はほとんどないです。
変数を定義する際にDATA命令を使用するためデータ型は直接指定するやり方が一般的です。
もし基本データ型を使用する際は同じ型を複数回使用する場合に用いると良いです。
しかし、再理由可能なためメンテナンス性を上げる効果はありますが例えばC型の10桁の型を使いまわす際に社員IDやテキスト、番号など変数の意味合いが異なるもので使用すると修正範囲外の個所まで誤って修正してしまう、修正誤りを引起こす可能性もあるため使用する場面は限られ、ほとんど使用されないことが分かります。

命令文

TYPES 基本データ型 TYPE データ型.

テーブルデータ型

テーブルデータ型を定義する際にテーブルタイプと行データ型を指定します。
テーブルタイプには以下の種類があります。詳しくは別記事で解説します。(準備中)
行データ型は上記で定義した構造化データ型やABAPディクショナリで定義したテーブルや構造を指定します。

  • STANDARD:標準テーブル
  • SORTED:ソートテーブル
  • HASHED:ハッシュテーブル

内部テーブルを定義する際に使用されることが多いです。
詳しくは以下内部テーブルの記事をご確認ください。

命令文

TYPES テーブルデータ型 TYPE テーブルタイプ TABLE OF 行データ型.

テーブルタイプは準備中

レンジテーブルデータ型

レンジテーブルデータ型の定義方法は命令文1と命令文2があります。
命令文1はTYPE RANGE OFを使用する事でレンジテーブルデータ型を定義しています。
命令文2は最初に解説した構造化データ型を用いてレンジテーブルデータ型を定義しています。

レンジテーブルの記事を見て頂くと分かりますがDATA命令内でデータ型を直接指定する方法が多いため命令文1,命令文2で定義する方法はあまりなさそうです。

命令文1

TYPES:
  レンジテーブルデータ型 TYPE RANGE OF データ型, “レンジテーブルデータ型
  構造化データ型 TYPE LINE OF レンジテーブルデータ型. “構造(ワークエリア/作業領域)

命令文2

TYPES: 
  BEGIN OF 構造化データ型,
    SIGN   TYPE C LENGTH 1,
    OPTION TYPE C LENGTH 2,
    LOW    TYPE データ型,
    HIGH   TYPE データ型,
  END OF 構造化データ型.

特徴

特徴は以下の通り、説明した内容のまとめになります。
プログラム内で一時的に必要なデータ型がある場合はTYPES命令、複数プログラムで必要なデータ型の場合はABAPディクショナリ(トランザクションコード:SE11)で定義します。

TYPES命令は基本的に構造化データ型を定義する際に使用される事が多く、構造化データ型以外はDATA命令で直接データ型を指定してしまうため使用される事が少ないです。

  • 一時的に必要なデータ型の定義
  • 構造化データ型がメインとなる

コーディング

上記で説明したデータ型をコーディングで表すと以下となります。
TYPES命令で定義したデータ型を使用して値の格納と出力結果を確認できるようにしています。
選択画面等は無いので実行したら結果が表示されます。
TYPES命令で定義したデータ型の使用例として参考にしていただければと思います。

*----------------------------------------------------------------------*
* 型定義
*----------------------------------------------------------------------*
*基本データ型
TYPES:
  LT_TESTC TYPE C LENGTH 10,
  LT_TESTP TYPE P LENGTH 5  DECIMALS 2.

*構造化データ型(BEGIN OF)
TYPES:
  BEGIN OF TA_COMPANY,
    BUKRS TYPE BUKRS,  "会社コード
    BUTXT TYPE BUTXT,  "会社名称
  END OF TA_COMPANY.

*INCLUDE用
TYPES:
  BEGIN OF TA_MONTHMONEY,
    GJAHR   TYPE GJAHR,      "会計年度
    MONEY TYPE P DECIMALS 3, "金額
  END OF TA_MONTHMONEY.

*構造化データ型(INCLUDE)
TYPES: BEGIN OF TA_APRIL,
  BUDAT   TYPE BUDAT.   "転記日
  INCLUDE TYPE TA_MONTHMONEY AS TA_APRIL.
TYPES END OF TA_APRIL.

*構造化データ型(下位構造)
TYPES:
  BEGIN OF TA_COMPANY2,
    BUKRS TYPE BUKRS,          "会社コード
    BEGIN OF TA_MONTHMONEY2,
      GJAHR   TYPE GJAHR,      "会計年度
      MONEY TYPE P DECIMALS 3, "金額
    END OF TA_MONTHMONEY2,
  END OF TA_COMPANY2.

*テーブルデータ型(TABLE OF)
TYPES:
  TA_TABLECOMPANY TYPE TABLE OF TA_COMPANY.

*レンジテーブルデータ型(RANGE)
TYPES:
  TAR_BUKRS  TYPE RANGE OF T001-BUKRS,
  TAWA_BUKRS TYPE LINE OF  TAR_BUKRS.

*レンジテーブルデータ型(RANGE)
TYPES:
  BEGIN OF TAWA_BUKRS2,
    SIGN   TYPE C LENGTH 1,
    OPTION TYPE C LENGTH 2,
    LOW    TYPE BUKRS,
    HIGH   TYPE BUKRS,
  END OF TAWA_BUKRS2,
  TAR_BUKRS2 TYPE RANGE OF TAWA_BUKRS2.

*----------------------------------------------------------------------*
* DATA定義
*----------------------------------------------------------------------*
*基本データ型
DATA:
  LTESTC TYPE LT_TESTC,
  LTESTP TYPE LT_TESTP,
  LGJAHR TYPE TA_COMPANY2-TA_MONTHMONEY2-GJAHR.

*構造化データ型(BEGIN OF)
DATA:
  WA_COMPANY TYPE TA_COMPANY.

*構造化データ型(INCLUDE)
DATA:
  WA_APRIL TYPE TA_APRIL.

*構造化データ型(下位構造)
DATA:
  WA_COMPANY2    TYPE TA_COMPANY2,
  WA_MONTHMONEY2 TYPE TA_COMPANY2-TA_MONTHMONEY2.

*テーブルデータ型(TABLE OF)
DATA:
  IT_TABLECOMPANY TYPE TA_TABLECOMPANY,
  WA_WRITECOMPANY TYPE TA_COMPANY.      "WRITE出力用
*レンジテーブルデータ型(RANGE)
DATA:
  R_BUKRS  TYPE TAR_BUKRS,
  WA_BUKRS TYPE TAWA_BUKRS,
  WA_WRITE TYPE TAWA_BUKRS.

*レンジテーブルデータ型(RANGE)
DATA:
  R_BUKRS2  TYPE TAR_BUKRS2,
  WA_BUKRS2 TYPE TAWA_BUKRS2,
  WA_WRITE2 TYPE TAWA_BUKRS2.

************************************************************************
START-OF-SELECTION.
************************************************************************
*基本データ型
LTESTC = 'C型'.
LTESTP = 1234567.
LGJAHR = '2020'.

*構造化データ型(BEGIN OF)
WA_COMPANY-BUKRS = '0001'.
WA_COMPANY-BUTXT = '会社名'.

*構造化データ型(INCLUDE)
WA_APRIL-BUDAT = '20210520'.
WA_APRIL-GJAHR = '2021'.
WA_APRIL-MONEY = 123456.

*構造化データ型(下位構造)
WA_COMPANY2-BUKRS    = '0002'.
WA_MONTHMONEY2-GJAHR = '2021'.
WA_MONTHMONEY2-MONEY = 123456.

*テーブルデータ型(TABLE OF)
APPEND WA_COMPANY TO IT_TABLECOMPANY.

*レンジテーブルデータ型(RANGE)
WA_BUKRS-SIGN   = 'I'.
WA_BUKRS-OPTION = 'BT'.
WA_BUKRS-LOW    = '0003'.
WA_BUKRS-HIGH   = '0005'.

APPEND WA_BUKRS TO R_BUKRS.

*レンジテーブルデータ型(RANGE2)
WA_BUKRS2-SIGN   = 'I'.
WA_BUKRS2-OPTION = 'BT'.
WA_BUKRS2-LOW    = '0006'.
WA_BUKRS2-HIGH   = '0008'.

APPEND WA_BUKRS2 TO R_BUKRS2.

************************************************************************
END-OF-SELECTION.
************************************************************************

WRITE:
  '基本データ型',
  /'LTESTC:' ,LTESTC,
  /'LTESTP:' ,LTESTP,
  /'LGJAHR:' ,LGJAHR.
SKIP.
WRITE:
  /'構造化データ型(BEGIN OF)',
  /'WA_COMPANY-BUKRS' ,'WA_COMPANY-BUTXT',
  / WA_COMPANY-BUKRS ,18 WA_COMPANY-BUTXT.
SKIP.
WRITE:
  /'構造化データ型(INCLUDE)',
  /'WA_APRIL-BUDAT' ,'WA_APRIL-GJAHR' ,'WA_APRIL-MONEY',
  / WA_APRIL-BUDAT ,16 WA_APRIL-GJAHR ,31 WA_APRIL-MONEY.
SKIP.
WRITE:
  /'構造化データ型(下位構造)',
  /'WA_COMPANY2-BUKRS' ,'WA_MONTHMONEY2-GJAHR' ,'WA_MONTHMONEY2-MONEY',
  / WA_COMPANY2-BUKRS ,19 WA_MONTHMONEY2-GJAHR ,40 WA_MONTHMONEY2-MONEY.
SKIP.
WRITE:
  /'テーブルデータ型(TABLE OF)',
  /'IT_TABLECOMPANY-BUKRS' ,'IT_TABLECOMPANY-BUTXT'.
LOOP AT IT_TABLECOMPANY INTO WA_WRITECOMPANY.
  WRITE:
    / WA_WRITECOMPANY-BUKRS ,23 WA_WRITECOMPANY-BUTXT.
ENDLOOP.
SKIP.
WRITE:
  /'レンジテーブルデータ型(RANGE)',
  /'R_BUKRS-SIGN' ,'R_BUKRS-OPTION' ,'R_BUKRS-LOW' ,'R_BUKRS-HIGH'.
LOOP AT R_BUKRS INTO WA_WRITE.
  WRITE:
    / WA_WRITE-SIGN ,14 WA_WRITE-OPTION ,29 WA_WRITE-LOW ,41 WA_WRITE-HIGH.
ENDLOOP.
SKIP.
WRITE:
  /'レンジテーブルデータ型(RANGE2)',
  /'R_BUKRS2-SIGN' ,'R_BUKRS2-OPTION' ,'R_BUKRS2-LOW' ,'R_BUKRS2-HIGH'.
LOOP AT R_BUKRS2 INTO WA_WRITE2.
  WRITE:
    / WA_WRITE2-SIGN ,15 WA_WRITE2-OPTION ,31 WA_WRITE2-LOW ,44 WA_WRITE2-HIGH.
ENDLOOP.

実行結果