このページでは、DATA命令のTYPES命令のオプションであるTYPEとLIKEの使い分け方法について解説します。
このページを読み終わる時には、以下の違いを説明できるようになります。
DATA A001 TYPE C. " TYPEオプションを利用 DATA B001 LIKE A001. " LIKEオプションを利用
このページでは、TYPEとLIKEの使い分けについて端的に解説します。
ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識です。是非最後までご覧ください。
前提①:DATA命令
まずは前提のおさらい。DATA命令についての簡単な解説です。「そんなのは分かっているよ!」という方はこの章は読み飛ばしてOK!
DATA命令は変数や構造、内部テーブルを定義する命令です。
DATA LDT_RESULT1 TYPE C. * DATA (変数名) TYPE (データ型). DATA LDT_RESULT2 LIKE LDT_RESULT1. * DATA (変数名) TYPE (参照オブジェクト).
そもそも変数って何?という方はこちらの記事をご覧ください。
*---------------------------------------------------* *DATA DEFINITION *---------------------------------------------------* DATA Z_SAMPLE1 TYPE D. "日付型の変数「Z_SAMPLE1」を定義 DATA Z_SAMPLE2 TYPE I. "整数型の変数「Z_SAMPLE2」を定義
本ページで解説するTYPEオプション / LIKEオプションの違いを理解するためには、DATA命令についての理解は必須となります。DATA命令を1からおさらいしたい方はこちらの記事をご覧ください。
前提②:TYPES命令
続いてTYPES命令のおさらいです。
TYPES命令はデータ型を定義する命令です。
構文ルールは基本的にDATA命令と同様です。
TYPESオプションの後には、任意のデータ型名称を。TYPEオプションの後に事前定義ABAPデータ型、もしくはABAPディクショナリに登録されているオブジェクトを指定します。
TYPES: ZBUKRS TYPE BKPF-BUKRS, "会社コード" Z_DAY1 TYPE I, "数字(4文字)" Z_DAY2 TYPE N LENGTH 8. "数字(8文字)" * TYPES (データ型) TYPE (ABAPデータ型).
TYPEオプション(DATA命令/TYPES命令)
ここからが本題です。TYPE/LIKEの違いを説明します。
TYPEオプションは、DATA命令・TYPES命令を利用する際に対象の「データ型」を指定するオプションです。
*---------------------------------------------------* *DATA DEFINITION *---------------------------------------------------* DATA Z_SAMPLE1 TYPE D. "日付型の変数「Z_SAMPLE1」を定義 DATA Z_SAMPLE2 TYPE I. "整数型の変数「Z_SAMPLE2」を定義
LIKEオプション (DATA命令/TYPES命令)
LIKEオプションも同じくDATA命令・TYPES命令のオプション。ただし、TYPEオプションがデータ型を参照するのに対して、LIKEオプションは構造や構造・変数を参照するという点で異なります。
どういうことか、文字だけではわかりづらいかと思いますので、以下のサンプルコードを基に解説します。
*---------------------------------------------------* *DATA DEFINITION *---------------------------------------------------* DATA Z_SAMPLE1 TYPE D. "日付型の変数「Z_SAMPLE1」を定義 DATA Z_SAMPLE2 LIKE Z_SAMPLE1. "「Z_SAMPLE1」と同じデータ型で変数「Z_SAMPLE2」を定義
つまり、簡単に言えば「Z_SAMPLE2」は「Z_SAMPLE1」を真似して作りますよ!ということです。そのときに利用するのはLIKEオプションであると覚えましょう。
冒頭で出した、コード例をもう一度見てみましょう。
DATA A001 TYPE C. " TYPEオプションを利用 DATA B001 LIKE A001. " LIKEオプションを利用
ここで定義されている変数 B001 は、変数 A001 と同じ変数ですよという意味。つまり A001 と同じような変数 B001 はデータ型Cの変数として宣言されるということです。
TYPEオプション
⇒既に定義済のデータ型を参照する。
LIKEオプション
⇒既に定義済の変数等を参照する。(その変数を真似して定義しますよ!ということ)
LIKEオプションの注意点
LIKEオプションで指定した参照先の変数・構造が変更された場合、その変数のデータ型も自動的に変わってしまいます。以下のサンプルコードを見てみましょう。
DATA A001 TYPE i. DATA B001 LIKE A001.
データ型i は4桁の整数を表します。この場合A001もB001も両方のデータ型は「4桁の整数」です。どちらも格納できるデータは4桁の数字で決まるので、5桁で文字列を代入しようとすればエラーが発生します。
さて、このコードを以下のように改修したらどうなるでしょうか?
DATA A001 TYPE D. DATA B001 LIKE A001.
答えは「変数 A001 が8桁の日付型に変更されたので、変数 B001 も日付型の変数に修正される」です。
したがって、例えばプログラムの改修を行う際にLIKEオプションを多用している場合、1つの変数の定義変更の影響範囲が大きくなります。
変数A のデータ型を変えたら、変数B も 変数C も全部データ型が変わってしまった。。。ということになります。
逆に言えば、1回の改修で関連する全ての変数のデータ型を変更できるというようにメリットとして理解することも可能です。
ABAPを1から勉強したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!