このページでは、データオブジェクト(変数・構造・内部テーブル)の初期化を行うCLEAR命令の使い方を解説します。また、CLEAR命令以外の、初期化に関する命令であるREFRESH命令やFREE命令についても補足的に解説します。
ABAPエンジニアを目指す方であれば、最低限押さえておきたい基本知識ですので、是非最後までご覧ください。
それでは早速解説を始めます。
初期化とは?
プログラミングにおける初期化とは、読んで字のごとく変数などのオブジェクトを最初の状態に戻すこと。言い換えれば、宣言時点の状態に戻すことをプログラミングでは初期化処理と呼びます。
ただし、ABAPではもう少し簡単に考えてOK。ABAPで初期化と言ったら、既に格納されているレコードを削除するようなイメージ。つまり、対象の変数や内部テーブルをからっぽにすることを初期化と呼びます。
この初期化を行うために、ABAPではCLEAR命令・FREE命令・REFRESH命令を用いることができます。
CLEAR命令
CLEAR (変数 or 構造 or 内部テーブル).
CLEAR命令は、指定したデータオブジェクトを初期化します。CLEARに続けて、初期化したいデータオブジェクトを指定するだけでOK。構文の形としてはかなり簡単です。
DATA TEST TYPE STRING 'Hello!'. WRITE TEST. " Hello! " TEST = 'Good-Bye!' WRITE TEST. " Good-Bye! " CLEAR TEST. WRITE TEST. " これは何も表示されません "
上記サンプルコードでは、変数に格納されている値をWRITE命令を用いて出力しています。ここでは、下から2行目でCLEAR命令を用いています。
対象のデータオブジェクトにVALUEオプションで "開始値" を与えていたとしても、CLEAR命令では対象のデータオブジェクトはブランクになってしまう点に注意しましょう。これは、主に他のプログラミング言語を学んだことがある人が陥りがちな罠なので、特にプログラミング経験者の方ほど注意が必要です。
内部テーブルを指定した場合は、全ての行がクリアされ同時にメモリも開放されます。
CLEAR命令:WITHオプション
ABAPエンジニアの間でもあまり知られていませんが、CLEAR命令にはWITHオプションを利用して初期値以外の値をデータオブジェクトに代入する方法が存在します。
CLEAR (変数 or 構造 or 内部テーブル) WITH 指定値.
指定値は1桁の文字列でなければなりません。そうでない場合、構文エラーとなりプログラムは有効化できません。
DATA A TYPE C LENGTH 10. A = 'Hello!'. WRITE A. "Hello!" CLEAR A WITH 'a'. WRITE A. "aaaaaa."
WITHオプションを利用することで、全ての桁が「a」で上書きされました。
REFRESH命令とFREE命令
CLEAR命令と似た命令にREFRESH命令とFREE命令があります。この章では、CLEAR命令と比較してREFRESH命令とFREE命令がどのような処理をするのかを解説します。
まず結論から整理すると、3つの命令は、簡単に言うと以下のような違いがあります。
命令 | 処理内容 | メモリの解放 |
---|---|---|
CLEAR | 変数・構造・内部テーブルの初期化 | ー |
FREE | 変数・構造・内部テーブルの初期化 | 〇 |
REFRESH | 内部テーブルの初期化 | ー |
基本的には、CLEAR命令さえ覚えておけば初期化関連の処理はOK。ただし、古いソースコードの場合にはREFRESH命令が使われていたり、特定の要件を満たすためにあえてFREE命令が使われていたりすることがあります。
レベルが1つ上のABAPエンジニアを目指し、この章ではREFRESH命令・FREE命令の処理内容について簡単に補足・説明しておきます。
REFRESH命令
命令 | 処理内容 | メモリの解放 |
---|---|---|
REFRESH | 内部テーブルの初期化 | ー |
※現在は廃止された命令です。
REFRESH命令は、内部テーブルを初期化する際に利用します。変数と構造の初期化には利用することができません。
内部テーブルに対しては、基本的にはCLEAR命令との動きをします。一部、CLEAR命令と異なるのは「ヘッダー付き内部テーブル」に対する処理です。
ヘッダー付き内部テーブルというのは、内部テーブル+構造(作業エリア)が合体した内部テーブルのこと。REFRESH命令では、このヘッダー付き内部テーブルの「内部テーブル」部分を初期化するのに対して、CLEAR命令では「構造(作業エリア)」部分を初期化します。
上記のような処理を行うことから、変数・構造の初期化はCLEAR命令を。内部テーブルの場合にはREFRESH命令を用いると言うのがひと昔前のABAPの定説でしたが、今ではヘッダー付き内部テーブルがそもそも利用されなくなったため、使い分けは不要となっています。
FREE命令
命令 | 処理内容 | メモリの解放 |
---|---|---|
REFRESH | 変数・構造・内部テーブルの初期化 | 〇 |
FREE命令は、変数・構造・内部テーブルの初期化を行います。
ただし、FREE命令はCLEARとREFRESHと異なり、初期化と同時に「メモリの開放」を行います。
メモリの開放―。すなわち、データオブジェクトを宣言したタイミングで割り当てられていた「プログラムの作業領域を削除する」ということです。
つまり、FREE命令を利用すると、宣言した「変数」「構造」「内部テーブル」の宣言を取り消す処理が行われるということです。したがって、そのプログラム内でそれ以上そのデータオブジェクトを利用しない場合に用いるのがFREE命令といえます。
基本はCLEAR命令を利用する
一昔前のABAPでは、CLEAR命令とREFRESH命令の違いを明確に意識する必要がありましたが今はヘッダー付き内部テーブルを用いないため、その差異を意識する必要がなくなりました。
そのため、データオブジェクトの初期化を行いたい場合は、基本CLEAR命令を利用するように心がけるようにしましょう。
ABAPを1から学習したい方は
ABAPを1から学習したい方は、以下の記事をご覧ください。
こちらの記事では、ABAPを用いて簡単な機能を実装できるようにするための必須知識を解説しております。今、本サイトで一番人気の記事ですので是非合わせてご覧ください。