【SAP ABAP】基本構文:初期化(CLEAR、REFRESH、FREE)

登場人物紹介

三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!

博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!

この記事を読むメリット

  • CLEAR命令・REFRESH命令・FREE命令を使用して、変数・構造・内部テーブルの初期化やメモリの解放ができるようになります。
博士

今回はデータオブジェクトの初期化について説明していくぞい!
データオブジェクトを適切に初期化することは、プログラムの整合性とパフォーマンスにおいて非常に重要なのじゃ!

レイナ

今回もよろしくお願いします!

この記事のポイント

初期化について

ABAPにおける「初期化」とは、変数、構造、内部テーブルのデータオブジェクトを、それらが宣言されたときの状態、つまり空の状態に戻す操作を指します。
※データオブジェクトの宣言時にVALUEオプションで初期値が設定されていた場合でも、空の状態に戻します。

初期化の重要性

データ整合性の維持再利用される変数にデータが残っていると、正確な結果を得ることができません。例えば、顧客情報を格納する変数を再利用すると、以前の顧客の情報が残っている可能性があります。これにより、誤った情報が表示等される可能性があります。適切な初期化を行うことで、データの整合性を維持します。

エラーの防止初期化されていない変数を使用すると、予期しない動作やエラーが発生する可能性があります。例えば、初期化されていない変数を条件式として使用すると、不正な値が比較される可能性があります。初期化により、プログラムの安全性が向上します。

リソースの効率的な管理大きなデータ構造を使用する場合、初期化を行うことで不要なメモリの使用を回避し、パフォーマンスを改善することができます。

博士

ABAPの初期化命令には、CLEAR命令、REFRESH命令、FREE命令があるぞい!簡単な概要じゃ。
CLEAR命令:変数・構造・内部テーブルを初期化
REFRESH命令:内部テーブルを初期化(※廃止)
FREE命令:内部テーブルのメモリ領域を解放

CLEAR命令

博士

まずはCLEAR命令じゃ。
CLEAR命令は変数・構造・内部テーブルを初期化するための命令だぞい!

構文
 CLEAR (データオブジェクト).
 ※内部テーブルを指定した場合は、全ての行のデータを削除し初期化します。
 ※定数を初期化することはできません。

 ※ヘッダー付き内部テーブル(現在非推奨)の内部テーブル部分を初期化する場合はデータオブジェクト名に[]を付けます。

使用例
* 内部テーブル
DATA: it_mara TYPE STANDARD TABLE OF mara.
" ヘッダー付き内部テーブル(現在非推奨)
DATA: it_mara_h TYPE STANDARD TABLE OF mara WITH HEADER LINE.
* 変数
DATA: lv_int TYPE i VALUE 200.

* メイン処理
lv_int = 100.                             " 200から100に書換え
APPEND INITIAL LINE TO it_mara.           " 1行空白行を追加
APPEND INITIAL LINE TO it_mara_h.         " 1行空白行を追加

* CLEAR命令で変数/構造/内部テーブル/ヘッダー付き内部テーブルを初期化
CLEAR: lv_int, it_mara, it_mara_h.
BREAK-POINT.

※動きを比較するため、13,14行目以外はCLEAR命令、REFRESH命令、FREE命令の使用例でも使いまわします。

実行結果(デバッグ画面)

実行前(※この後説明するREFRESH命令、FREE命令にも共通の実行前データ)
ABAP初期化(CLEAR命令)サンプルプログラム実行前

実行後
ABAP初期化(CLEAR命令)サンプルプログラム実行後

博士

CLEAR命令はヘッダー付き内部テーブルの場合は構造部分(作業領域)のみ初期化するぞい!
内部テーブル部分をCLEAR命令で初期化する場合は内部テーブル名の後に[]を追加する必要があるのじゃ!

例:CLEAR: it_mara_h[].
また、CLEAR命令ではメモリは確保されたままだぞい!

ヘッダー付き内部テーブルとは
内部テーブルと構造(作業領域)が合体したテーブルのことです。
内部テーブル部分と構造(作業領域)部分で名前が同じであるため、紛らわしいことが特徴です。
 CLEAR命令:構造(作業領域)部分を初期化
 REFRESH命令:内部テーブル部分を初期化(CLEAR命令に[]を付けるのと同様)

※現在はヘッダー付き内部テーブルは非推奨となっています。

REFRESH命令 ※現在は非推奨

博士

次はREFRESH命令じゃ。
REFRESH命令は内部テーブルの全ての行を削除し空の状態に初期化するための命令だぞい!

構文
 REFRESH (内部テーブル).
 ※CLEAR命令と異なり、REFRESH命令は変数・構造には使用できません。

使用例
* REFRESH命令で内部テーブル/ヘッダー付き内部テーブルを初期化
REFRESH: it_mara, it_mara_h.

※CLEAR命令の使用例の13,14行目を上記の内容で書き換えてください。

実行結果(デバッグ画面)

実行後(※実行前はCLEAR命令説明部分を参照)
ABAP初期化(REFRESH命令)サンプルプログラム実行後

博士

REFRESH命令はヘッダー付き内部テーブルの場合は内部テーブルの部分のみ初期化するぞい!

現在ヘッダー付き内部テーブルは非推奨の方針のため、あわせてREFRESH命令も非推奨となっており、新規でプログラムを実装する時はCLEAR命令のみで十分なのじゃ!
また、REFRESH命令はCLEAR命令と同様にメモリは確保されたままだぞい!

FREE命令

博士

最後はFREE命令じゃ。
FREE命令は内部テーブルの全ての行を削除するのはCLEAR命令とREFRESH命令と同様じゃが、異なるのはその行が占有していたメモリ領域を解放することじゃ!
特にデータ量の多い内部テーブルに使用すると有効だぞい。

構文
 FREE (データオブジェクト).
 ※内部テーブル以外の変数・構造はCLEAR命令と同様に動作します。

使用例
* FREE命令で内部テーブル/ヘッダー付き内部テーブルのメモリを解放
FREE: it_mara, it_mara_h.

※CLEAR命令の使用例の13,14行目を上記の内容で書き換えてください。

実行結果(デバッグ画面)

実行後(※実行前はCLEAR命令説明部分を参照)
ABAP初期化(FREE命令)サンプルプログラム実行後

博士

FREE命令はCLEAR命令とREFRESH命令とは異なり、メモリ領域自体が解放されていることがデバッグ画面で確認できたぞい!
FREE命令は内部テーブルが完全に不要にな場合にのみ使用すべきなのじゃ。

レイナ

状況にあった命令を使用することが大切ですね!
ちなみに初期化を忘れたらどうなるんでしょうか…?

初期化忘れに注意!

博士

初期化忘れは起こりがちじゃ!

以下に初期化を忘れた場合の例を作成してみたぞい。
33行目のCLEAR命令がある状態とない状態で実行した結果を見てみるのじゃ!

使用例
TYPES: BEGIN OF ty_item,
         product_name TYPE string,           " 商品名
         unit_price   TYPE p DECIMALS 2,     " 単価
         quantity     TYPE i,                " 数量
         shipping_fee TYPE p DECIMALS 2,     " 送料
       END OF ty_item.
TYPES: BEGIN OF ty_final_item,
         product_name TYPE string,           " 商品名
         total_price  TYPE p DECIMALS 2,     " 合計金額
         shipping_fee TYPE p DECIMALS 2,     " 送料
       END OF ty_final_item.

DATA: it_item TYPE TABLE OF ty_item,               " 商品情報の内部テーブル
      it_final_item TYPE TABLE OF ty_final_item,   " 最終商品情報の内部テーブル
      ls_item TYPE ty_item,                        " 商品情報の構造
      ls_final_item TYPE ty_final_item.            " 最終商品情報の構造

* 内部テーブルに商品情報を追加
APPEND VALUE ty_item( product_name = 'Product 1' unit_price = 100 quantity = 55 shipping_fee = 300 ) TO it_item.
APPEND VALUE ty_item( product_name = 'Product 2' unit_price = 120 quantity = 20 shipping_fee = 600 ) TO it_item.
APPEND VALUE ty_item( product_name = 'Product 3' unit_price = 60 quantity = 150 shipping_fee = 900 ) TO it_item.

* 合計金額の計算と送料のチェック
LOOP AT it_item INTO ls_item.
  ls_final_item-product_name = ls_item-product_name.
  ls_final_item-total_price = ls_item-unit_price * ls_item-quantity.

  IF ls_final_item-total_price >= 5000.
    ls_final_item-shipping_fee = ls_item-shipping_fee. " 合計金額が5000以上の場合は送料も最終商品情報に入れる
  ENDIF.

  APPEND ls_final_item TO it_final_item.
  CLEAR: ls_final_item. " ループの最後に最終商品情報の構造を初期化
ENDLOOP.

* 結果の表示
LOOP AT it_final_item INTO ls_final_item.
  WRITE: / '商品名:', ls_final_item-product_name, ' 合計金額:', ls_final_item-total_price, ' 送料:', ls_final_item-shipping_fee.
ENDLOOP.
実行結果

CLEAR命令あり
ABAP初期化(CLEAR命令)サンプルプログラム実行後
CLEAR命令なし
ABAP初期化(CLEAR命令)サンプルプログラム実行後

レイナ

CLEAR命令の有無で結果が変わっていますね!

博士

そうじゃ!
LOOP内で使用する変数や構造は適切に初期化しないと、前回のデータが残ったままになり、結果に影響を与えることがあるので注意が必要だぞい!!

他にも初期化が必要なケースはあるので適切な初期化を心がけ、プログラムの安全性と効率性を向上させるのじゃ!

まとめ

レイナ

教えてもらった内容をまとめてみました!

初期化命令内部テーブルの初期化ヘッダー付き内部テーブルの初期化説明
CLEARCLEAR itab.CLEAR itab.:ヘッダー部分のみ初期化
CLEAR itab[].:内部テーブル部分のみ初期化
変数・構造・内部テーブルを初期化
REFRESHREFRESH itab.REFRESH itab.:内部テーブル部分のみ初期化
 ※CLEAR itab[].と同様
 ※ヘッダー部分は初期化されない
※非推奨
内部テーブルのみ初期化
FREEFREE itab.FREE itab.
 ※ヘッダー部分は初期化されない
内部テーブルのメモリを解放
変数・構造はCLEAR命令と同じ動作
各初期化命令の説明
博士

完璧じゃ!

★★★SAPラボのライター募集★★★

SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!

SAPラボのライターの特徴 

・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!

SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。

募集要項

・SAP導入や運用保守プロジェクトへの参画経験1年以上

ご応募/お問合せ先

info@sap-labo.com

少しでもご興味ある方、ぜひお気軽にご連絡下さい!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

新卒でSAPエンジニアとしてABAPでの新規開発や保守業務を担当。
業務内容としてはロジ系(MM/SD)がメインで、ABAPの開発が最も得意。

この記事のポイント