メモリ領域の使用
24.2 メモリ領域の使用
SAPメモリとABAPメモリ
プログラムを作ると、「別の処理(別プログラム)に値を渡したい」場面が出てきます。
そのときに使えるのが「メモリ領域」です。メモリ領域を使うと、ファイル出力やDB更新をせずに、値を一時的に引き継ぐことができます。
ABAPで扱う代表的なメモリには、次の2種類があります。
●SAPメモリ
●ABAPメモリ
SAPメモリ
SAPメモリは、SAP GUI上の複数セッション(複数モード)から参照できるメモリ領域です。
初心者の段階では、次の理解で十分です。
・主な用途:選択画面の値(入力値)を保持・引き継ぐ
・代表例:PARAMETERS/SELECT-OPTIONS の MEMORY ID
・代表命令:SET PARAMETER / GET PARAMETER
たとえば、選択画面で入力した会社コードなどを「次回も初期値として出したい」「別画面でも同じ値を使いたい」といった目的に向いています。
ABAPメモリ
ABAPメモリは、同一ユーザセッション内で、プログラム間のデータ受け渡しに使えるメモリ領域です。「あるプログラムで作ったデータを、別のプログラム側で受け取りたい」という場面で利用します。
ABAPメモリでは、主に次の命令を使います。
・EXPORT:データをABAPメモリに保存する
・IMPORT:ABAPメモリからデータを読み込む
また、SUBMIT で別プログラムを呼び出す場合に、オプションを使わずに値を受け渡したいときにABAPメモリが利用できます。
実装の考え方としては、次のように分けます。
・呼び出し元プログラム:EXPORT までを書く
・呼び出し先プログラム:IMPORT 以降を書く
SAPメモリとABAPメモリの使い分け
メモリはどちらも「一時的に値を保持する」点は同じですが、目的が少し違います。
・SAPメモリ:選択画面などの「入力値」を保持して、次回も使いやすくする(初期値・引き継ぎ)
・ABAPメモリ:プログラム同士で「処理用データ」を受け渡す(EXPORT/IMPORT で渡す)
サンプルコードで、「メモリ領域」を使って値を一時的に引き継ぐ方法を確認します。
メモリを使うと、ファイル出力やDB更新を行わずに、別のタイミング/別のプログラムで同じ値を再利用できます。
ABAPでよく扱うメモリは、次の2種類です。
・SAPメモリ:主に「選択画面の入力値」を次回以降に引き継ぐための仕組み
・ABAPメモリ:プログラム間でデータを受け渡すための仕組み(EXPORT/IMPORT)
ここでは、それぞれを最小構成のサンプルで体験します。
■ サンプルコード:SAPメモリ(GET/SET PARAMETER)のサンプル
*&---------------------------------------------------------------------* *& Report Z_SAMPLE242_SAPMEMORY *&---------------------------------------------------------------------* *& 概要:SAPメモリ(SET/GET PARAMETER) *&---------------------------------------------------------------------* REPORT Z_SAMPLE242_SAPMEMORY. "※IDは例です(実務ではプロジェクトで決めたIDを使います) PARAMETERS P_BUKRS TYPE BUKRS. INITIALIZATION. "前回保存した値があれば初期値として取り出す GET PARAMETER ID 'ZBUK' FIELD P_BUKRS. START-OF-SELECTION. "今回入力した値をSAPメモリに保存する(次回起動時に使える) SET PARAMETER ID 'ZBUK' FIELD P_BUKRS. WRITE: / '入力された会社コード:', P_BUKRS. WRITE: / 'SAPメモリに保存しました(次回の初期値になります)'.
「GET PARAMETER」は、以前に保存した値があれば取り出して初期値に設定します。
そのため、プログラム起動直後に実行されるINITIALIZATIONに書くのが基本です。
「SET PARAMETER」は、今回入力した値をSAPメモリに保存します。
この処理を行うことで、次回起動時に「GET PARAMETER」で同じ値を初期表示できます。
SAPメモリは「入力値を引き継ぐ」用途に向いており、選択画面の使い勝手を上げる目的で利用されます。
■ サンプルコード:SAPメモリ(GET/SET PARAMETER)のサンプル
*&---------------------------------------------------------------------* *& Report Z_SAMPLE242_ABAPMEMORY_SEND *&---------------------------------------------------------------------* *& 概要:ABAPメモリにEXPORTして別レポートへ渡す(送信側) *&---------------------------------------------------------------------* REPORT Z_SAMPLE242_ABAPMEMORY_SEND. PARAMETERS P_TEXT TYPE STRING. START-OF-SELECTION. "ABAPメモリにデータを保存(IDで箱を識別) EXPORT P_TEXT = P_TEXT TO MEMORY ID 'ZTXT'. "別レポートを呼び出す(同一セッション内) SUBMIT Z_SAMPLE242_ABAPMEMORY_IMPORT AND RETURN.
*&---------------------------------------------------------------------*
*& Report Z_SAMPLE242_ABAPMEMORY_IMPORT
*&---------------------------------------------------------------------*
*& 概要:ABAPメモリからIMPORTして受け取る(受信側)
*&---------------------------------------------------------------------*
REPORT Z_SAMPLE242_ABAPMEMORY_IMPORT.
DATA GV_TEXT TYPE STRING.
START-OF-SELECTION.
"ABAPメモリからデータを取り出す
IMPORT P_TEXT = GV_TEXT FROM MEMORY ID 'ZTXT'.
IF GV_TEXT IS INITIAL.
WRITE: / 'ABAPメモリにデータがありません。'.
ELSE.
WRITE: / '受け取った文字列:', GV_TEXT.
ENDIF.
ABAPメモリは プログラム間のデータ受け渡しに使います。
送信側で「EXPORT」、受信側で「IMPORT」を行うことで、同じセッション内で値を引き継げます。
「MEMORY ID」は、「保存先の名前」です。
送信側(EXPORT)と受信側(IMPORT)は、同じIDを指定する必要があります。
受信側では、データが存在しない場合もあるため、IMPORT後は初期値(空)かどうかを確認してから使うと安全です。
ABAPメモリは便利ですが、使いすぎると処理の流れが追いにくくなるため、「プログラム間の受け渡しが本当に必要な場合」に限定して使うのがコツです。
・SAPメモリ:選択画面の入力値を次回に引き継ぐ(GET/SET PARAMETER)
・ABAPメモリ:プログラム間でデータを渡す(EXPORT/IMPORT)
この2つを区別できれば、メモリを「便利な道具」として安全に使えるようになります。