三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
登場人物紹介
三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
この記事を読むメリット
今回はデータオブジェクトの初期化について説明していくぞい!
データオブジェクトを適切に初期化することは、プログラムの整合性とパフォーマンスにおいて非常に重要なのじゃ!
今回もよろしくお願いします!
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
ABAPにおける「初期化」とは、変数、構造、内部テーブルのデータオブジェクトを、それらが宣言されたときの状態、つまり空の状態に戻す操作を指します。
※データオブジェクトの宣言時にVALUEオプションで初期値が設定されていた場合でも、空の状態に戻します。
初期化の重要性
データ整合性の維持:再利用される変数にデータが残っていると、正確な結果を得ることができません。例えば、顧客情報を格納する変数を再利用すると、以前の顧客の情報が残っている可能性があります。これにより、誤った情報が表示等される可能性があります。適切な初期化を行うことで、データの整合性を維持します。
エラーの防止:初期化されていない変数を使用すると、予期しない動作やエラーが発生する可能性があります。例えば、初期化されていない変数を条件式として使用すると、不正な値が比較される可能性があります。初期化により、プログラムの安全性が向上します。
リソースの効率的な管理:大きなデータ構造を使用する場合、初期化を行うことで不要なメモリの使用を回避し、パフォーマンスを改善することができます。
ABAPの初期化命令には、CLEAR命令、REFRESH命令、FREE命令があるぞい!以下は簡単な概要じゃ。
まずは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命令にも共通の実行前データ)
実行後
CLEAR命令はヘッダー付き内部テーブルの場合は構造部分(作業領域)のみ初期化するぞい!
内部テーブル部分をCLEAR命令で初期化する場合は内部テーブル名の後に[]を追加する必要があるのじゃ!
例:CLEAR: it_mara_h[].
また、CLEAR命令ではメモリは確保されたままだぞい!
ヘッダー付き内部テーブルとは
内部テーブルと構造(作業領域)が合体したテーブルのことです。
内部テーブル部分と構造(作業領域)部分で名前が同じであるため、紛らわしいことが特徴です。
CLEAR命令:構造(作業領域)部分を初期化
REFRESH命令:内部テーブル部分を初期化(CLEAR命令に[]を付けるのと同様)
※現在はヘッダー付き内部テーブルは非推奨となっています。
次はREFRESH命令じゃ。
REFRESH命令は内部テーブルの全ての行を削除し空の状態に初期化するための命令だぞい!
構文
REFRESH (内部テーブル).
※CLEAR命令と異なり、REFRESH命令は変数・構造には使用できません。
* REFRESH命令で内部テーブル/ヘッダー付き内部テーブルを初期化
REFRESH: it_mara, it_mara_h.
※CLEAR命令の使用例の13,14行目を上記の内容で書き換えてください。
実行後(※実行前はCLEAR命令説明部分を参照)
REFRESH命令はヘッダー付き内部テーブルの場合は内部テーブルの部分のみ初期化するぞい!
現在ヘッダー付き内部テーブルは非推奨の方針のため、あわせてREFRESH命令も非推奨となっており、新規でプログラムを実装する時はCLEAR命令のみで十分なのじゃ!
また、REFRESH命令はCLEAR命令と同様にメモリは確保されたままだぞい!
最後はFREE命令じゃ。
FREE命令は内部テーブルの全ての行を削除するのはCLEAR命令とREFRESH命令と同様じゃが、異なるのはその行が占有していたメモリ領域を解放することじゃ!
特にデータ量の多い内部テーブルに使用すると有効だぞい。
構文
FREE (データオブジェクト).
※内部テーブル以外の変数・構造はCLEAR命令と同様に動作します。
* FREE命令で内部テーブル/ヘッダー付き内部テーブルのメモリを解放
FREE: it_mara, it_mara_h.
※CLEAR命令の使用例の13,14行目を上記の内容で書き換えてください。
実行後(※実行前はCLEAR命令説明部分を参照)
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命令あり
CLEAR命令なし
CLEAR命令の有無で結果が変わっていますね!
そうじゃ!
LOOP内で使用する変数や構造は適切に初期化しないと、前回のデータが残ったままになり、結果に影響を与えることがあるので注意が必要だぞい!!
他にも初期化が必要なケースはあるので適切な初期化を心がけ、プログラムの安全性と効率性を向上させるのじゃ!
教えてもらった内容をまとめてみました!
初期化命令 | 内部テーブルの初期化 | ヘッダー付き内部テーブルの初期化 | 説明 |
---|---|---|---|
CLEAR | CLEAR itab. | CLEAR itab.:ヘッダー部分のみ初期化 CLEAR itab[].:内部テーブル部分のみ初期化 | 変数・構造・内部テーブルを初期化 |
REFRESH | REFRESH itab. | REFRESH itab.:内部テーブル部分のみ初期化 ※CLEAR itab[].と同様 ※ヘッダー部分は初期化されない | ※非推奨 内部テーブルのみ初期化 |
FREE | FREE itab. | FREE itab. ※ヘッダー部分は初期化されない | 内部テーブルのメモリを解放 変数・構造はCLEAR命令と同じ動作 |
完璧じゃ!
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!
SAPラボのライターの特徴
・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!
SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。
募集要項
・SAP導入や運用保守プロジェクトへの参画経験1年以上
ご応募/お問合せ先
info@sap-labo.com
少しでもご興味ある方、ぜひお気軽にご連絡下さい!
新卒でSAPエンジニアとしてABAPでの新規開発や保守業務を担当。
業務内容としてはロジ系(MM/SD)がメインで、ABAPの開発が最も得意。