ABAP Memory Management: EXPORT, IMPORT, Shared Memory

Category
ABAP-Statements
Published
Author
Johannes

Memory Management in ABAP enables data exchange between programs. There are various memory areas: ABAP Memory, SAP Memory, Database Cluster and Shared Objects.

Memory Areas

AreaLifetimeUsage
ABAP MemorySession (Call Stack)Between CALL TRANSACTION
SAP MemoryUser SessionBetween Transactions
Database ClusterPersistentAcross Sessions
Shared ObjectsApplication ServerBetween Users

Examples

1. ABAP Memory (EXPORT/IMPORT TO MEMORY)

" Program 1: Export data
DATA: ls_customer TYPE kna1,
lt_orders TYPE TABLE OF vbak.
" Prepare data
ls_customer-kunnr = '0000001000'.
ls_customer-name1 = 'Mustermann GmbH'.
" Export to ABAP Memory
EXPORT customer = ls_customer
orders = lt_orders
TO MEMORY ID 'ZCUSTOMER_DATA'.
" Program 2: Import data (after CALL TRANSACTION)
DATA: ls_customer TYPE kna1,
lt_orders TYPE TABLE OF vbak.
IMPORT customer = ls_customer
orders = lt_orders
FROM MEMORY ID 'ZCUSTOMER_DATA'.
IF sy-subrc = 0.
WRITE: / 'Customer:', ls_customer-name1.
ENDIF.
" Release memory
FREE MEMORY ID 'ZCUSTOMER_DATA'.

2. SAP Memory (SET/GET PARAMETER)

" SAP Memory for field pre-population
" Parameter IDs are defined in Data Dictionary
" Set value
SET PARAMETER ID 'KUN' FIELD '0000001000'.
SET PARAMETER ID 'BUK' FIELD '1000'.
" Read value
DATA: lv_kunnr TYPE kunnr,
lv_bukrs TYPE bukrs.
GET PARAMETER ID 'KUN' FIELD lv_kunnr.
GET PARAMETER ID 'BUK' FIELD lv_bukrs.
WRITE: / 'Customer:', lv_kunnr,
/ 'Company Code:', lv_bukrs.
" Call transaction with pre-populated values
SET PARAMETER ID 'KUN' FIELD '0000001000'.
CALL TRANSACTION 'XD03' AND SKIP FIRST SCREEN.

3. Database Cluster (EXPORT/IMPORT TO DATABASE)

" Persistent storage across sessions
" Table: INDX or custom cluster table
DATA: ls_settings TYPE ty_settings.
ls_settings-user = sy-uname.
ls_settings-variant = 'DEFAULT'.
ls_settings-values = lt_values.
" Save to database
EXPORT settings = ls_settings
TO DATABASE indx(zs) " Table INDX, Area 'ZS'
ID |SETTINGS_{ sy-uname }|. " Unique key
" Read later
DATA: ls_settings TYPE ty_settings.
IMPORT settings = ls_settings
FROM DATABASE indx(zs)
ID |SETTINGS_{ sy-uname }|.
IF sy-subrc = 0.
" Settings found
WRITE: / 'Variant:', ls_settings-variant.
ENDIF.
" Delete
DELETE FROM DATABASE indx(zs)
ID |SETTINGS_{ sy-uname }|.

4. Custom Cluster Table

" Create table in SE11:
" Name: ZCUSTOM_CLUSTER
" Fields:
" - RELID (CHAR 2) - Area
" - SRTFD (CHAR 40) - ID/Key
" - Cluster fields (CLUSTR, CLUSTD)
" Usage
EXPORT data = ls_data
TO DATABASE zcustom_cluster(AA)
ID lv_key.
IMPORT data = ls_data
FROM DATABASE zcustom_cluster(AA)
ID lv_key.

5. Shared Objects (Application Server Cache)

" 1. Define area class (SE24)
CLASS zcl_shared_area DEFINITION
PUBLIC FINAL
CREATE PUBLIC
SHARED MEMORY ENABLED.
PUBLIC SECTION.
INTERFACES: if_shm_build_instance.
DATA: mt_customers TYPE HASHED TABLE OF kna1 WITH UNIQUE KEY kunnr.
METHODS: load_customers.
ENDCLASS.
CLASS zcl_shared_area IMPLEMENTATION.
METHOD if_shm_build_instance~build.
" Called when area is built
DATA(lo_area) = CAST zcl_shared_area( bound_memory ).
lo_area->load_customers( ).
ENDMETHOD.
METHOD load_customers.
SELECT * FROM kna1
INTO TABLE mt_customers
UP TO 10000 ROWS.
ENDMETHOD.
ENDCLASS.
" 2. Create Shared Memory Area in SHMA
" Name: ZSM_CUSTOMER_CACHE
" Root Class: ZCL_SHARED_AREA
" 3. Usage
DATA: lo_area TYPE REF TO zcl_shared_area,
lo_handle TYPE REF TO zcl_sm_customer_cache.
TRY.
" Read access
lo_handle = zcl_sm_customer_cache=>attach_for_read( ).
lo_area = CAST zcl_shared_area( lo_handle->root ).
" Use data
READ TABLE lo_area->mt_customers INTO DATA(ls_customer)
WITH KEY kunnr = '0000001000'.
lo_handle->detach( ).
CATCH cx_shm_attach_error INTO DATA(lx_error).
" Area doesn't exist yet -> build
TRY.
zcl_sm_customer_cache=>build(
EXPORTING
inst_name = zcl_sm_customer_cache=>default_instance
).
CATCH cx_shm_build_error.
ENDTRY.
ENDTRY.

6. Memory Between CALL TRANSACTION

" Main program
DATA: ls_order TYPE vbak.
ls_order-vbeln = '0000000001'.
ls_order-kunnr = '0000001000'.
" Provide data for called program
EXPORT order = ls_order TO MEMORY ID 'ZORDER_EDIT'.
" Call transaction
CALL TRANSACTION 'ZORDER_CHANGE'.
" After return: Read changed data
IMPORT order = ls_order FROM MEMORY ID 'ZORDER_EDIT'.
FREE MEMORY ID 'ZORDER_EDIT'.
" Called program (ZORDER_CHANGE)
DATA: ls_order TYPE vbak.
IMPORT order = ls_order FROM MEMORY ID 'ZORDER_EDIT'.
" Processing...
" Return changed data
EXPORT order = ls_order TO MEMORY ID 'ZORDER_EDIT'.
LEAVE PROGRAM.

7. Memory Helper Class

CLASS zcl_memory_helper DEFINITION.
PUBLIC SECTION.
" ABAP Memory
CLASS-METHODS: export_to_memory
IMPORTING iv_id TYPE clike
iv_data TYPE any.
CLASS-METHODS: import_from_memory
IMPORTING iv_id TYPE clike
EXPORTING ev_data TYPE any
RETURNING VALUE(rv_found) TYPE abap_bool.
CLASS-METHODS: free_memory
IMPORTING iv_id TYPE clike.
" SAP Memory
CLASS-METHODS: set_parameter
IMPORTING iv_id TYPE clike
iv_value TYPE clike.
CLASS-METHODS: get_parameter
IMPORTING iv_id TYPE clike
RETURNING VALUE(rv_value) TYPE string.
" Database Cluster
CLASS-METHODS: save_to_db
IMPORTING iv_id TYPE clike
iv_data TYPE any.
CLASS-METHODS: load_from_db
IMPORTING iv_id TYPE clike
EXPORTING ev_data TYPE any
RETURNING VALUE(rv_found) TYPE abap_bool.
CLASS-METHODS: delete_from_db
IMPORTING iv_id TYPE clike.
ENDCLASS.
CLASS zcl_memory_helper IMPLEMENTATION.
METHOD export_to_memory.
EXPORT data = iv_data TO MEMORY ID iv_id.
ENDMETHOD.
METHOD import_from_memory.
IMPORT data = ev_data FROM MEMORY ID iv_id.
rv_found = xsdbool( sy-subrc = 0 ).
ENDMETHOD.
METHOD free_memory.
FREE MEMORY ID iv_id.
ENDMETHOD.
METHOD set_parameter.
SET PARAMETER ID iv_id FIELD iv_value.
ENDMETHOD.
METHOD get_parameter.
GET PARAMETER ID iv_id FIELD rv_value.
ENDMETHOD.
METHOD save_to_db.
DATA(lv_id) = CONV indx_srtfd( iv_id ).
EXPORT data = iv_data TO DATABASE indx(zm) ID lv_id.
COMMIT WORK.
ENDMETHOD.
METHOD load_from_db.
DATA(lv_id) = CONV indx_srtfd( iv_id ).
IMPORT data = ev_data FROM DATABASE indx(zm) ID lv_id.
rv_found = xsdbool( sy-subrc = 0 ).
ENDMETHOD.
METHOD delete_from_db.
DATA(lv_id) = CONV indx_srtfd( iv_id ).
DELETE FROM DATABASE indx(zm) ID lv_id.
COMMIT WORK.
ENDMETHOD.
ENDCLASS.
" Usage
" ABAP Memory
zcl_memory_helper=>export_to_memory(
iv_id = 'MY_DATA'
iv_data = ls_data
).
IF zcl_memory_helper=>import_from_memory(
iv_id = 'MY_DATA'
IMPORTING ev_data = ls_data
) = abap_true.
" Data found
ENDIF.
" Database
zcl_memory_helper=>save_to_db(
iv_id = |USER_{ sy-uname }_SETTINGS|
iv_data = ls_settings
).

8. User-Specific Settings

CLASS zcl_user_settings DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_settings,
layout TYPE string,
pagesize TYPE i,
filters TYPE string,
END OF ty_settings.
METHODS: constructor
IMPORTING iv_program TYPE sy-repid DEFAULT sy-repid.
METHODS: load
RETURNING VALUE(rs_settings) TYPE ty_settings.
METHODS: save
IMPORTING is_settings TYPE ty_settings.
METHODS: delete.
PRIVATE SECTION.
DATA: mv_id TYPE indx_srtfd.
ENDCLASS.
CLASS zcl_user_settings IMPLEMENTATION.
METHOD constructor.
mv_id = |{ iv_program }_{ sy-uname }|.
ENDMETHOD.
METHOD load.
IMPORT settings = rs_settings
FROM DATABASE indx(us)
ID mv_id.
IF sy-subrc <> 0.
" Defaults
rs_settings-pagesize = 100.
ENDIF.
ENDMETHOD.
METHOD save.
EXPORT settings = is_settings
TO DATABASE indx(us)
ID mv_id.
COMMIT WORK.
ENDMETHOD.
METHOD delete.
DELETE FROM DATABASE indx(us) ID mv_id.
COMMIT WORK.
ENDMETHOD.
ENDCLASS.
" Usage
DATA(lo_settings) = NEW zcl_user_settings( ).
DATA(ls_settings) = lo_settings->load( ).
" Change settings
ls_settings-pagesize = 50.
lo_settings->save( ls_settings ).

9. Cross-Session Cache

" Shared Memory for frequently needed master data
" Area Root Class
CLASS zcl_material_cache DEFINITION
PUBLIC FINAL
CREATE PUBLIC
SHARED MEMORY ENABLED.
PUBLIC SECTION.
INTERFACES: if_shm_build_instance.
TYPES: ty_materials TYPE HASHED TABLE OF mara WITH UNIQUE KEY matnr.
DATA: mt_materials TYPE ty_materials,
mv_loaded_at TYPE timestampl.
METHODS: get_material
IMPORTING iv_matnr TYPE matnr
RETURNING VALUE(rs_material) TYPE mara.
METHODS: is_expired
RETURNING VALUE(rv_expired) TYPE abap_bool.
ENDCLASS.
CLASS zcl_material_cache IMPLEMENTATION.
METHOD if_shm_build_instance~build.
DATA(lo_root) = CAST zcl_material_cache( bound_memory ).
SELECT * FROM mara
INTO TABLE lo_root->mt_materials
WHERE mtart IN ('FERT', 'HALB', 'ROH').
GET TIME STAMP FIELD lo_root->mv_loaded_at.
ENDMETHOD.
METHOD get_material.
READ TABLE mt_materials INTO rs_material
WITH KEY matnr = iv_matnr.
ENDMETHOD.
METHOD is_expired.
DATA: lv_now TYPE timestampl.
GET TIME STAMP FIELD lv_now.
" Invalidate cache after 1 hour
rv_expired = xsdbool(
lv_now - mv_loaded_at > 3600
).
ENDMETHOD.
ENDCLASS.
" Usage
DATA: lo_handle TYPE REF TO zcl_sm_material,
lo_cache TYPE REF TO zcl_material_cache.
TRY.
lo_handle = zcl_sm_material=>attach_for_read( ).
lo_cache = lo_handle->root.
" Check cache validity
IF lo_cache->is_expired( ).
lo_handle->detach( ).
zcl_sm_material=>invalidate_instance( ).
" Rebuilt on next access
ELSE.
DATA(ls_material) = lo_cache->get_material( lv_matnr ).
lo_handle->detach( ).
ENDIF.
CATCH cx_shm_attach_error.
" Fallback: Direct from DB
SELECT SINGLE * FROM mara
WHERE matnr = @lv_matnr
INTO @ls_material.
ENDTRY.

10. EXPORT/IMPORT with Compression

" For large data volumes: Compression
DATA: lt_big_table TYPE TABLE OF vbak,
lv_xstring TYPE xstring.
" Data to compressed XString
EXPORT data = lt_big_table
TO DATA BUFFER lv_xstring
COMPRESSION ON.
" Save to DB
UPDATE zcache SET data = lv_xstring
WHERE id = lv_id.
" Load again
SELECT SINGLE data FROM zcache
WHERE id = @lv_id
INTO @lv_xstring.
IMPORT data = lt_big_table
FROM DATA BUFFER lv_xstring.

11. Free Memory on Error

" TRY-CLEANUP for clean cleanup
DATA: lv_memory_id TYPE c LENGTH 30 VALUE 'ZTEMP_DATA'.
TRY.
EXPORT data = ls_data TO MEMORY ID lv_memory_id.
" Processing that may fail
process_data( ).
" Release normally
FREE MEMORY ID lv_memory_id.
CATCH cx_root INTO DATA(lx_error).
" Release also on error
FREE MEMORY ID lv_memory_id.
RAISE EXCEPTION lx_error.
ENDTRY.
" Or with CLEANUP
TRY.
EXPORT data = ls_data TO MEMORY ID lv_memory_id.
process_data( ).
CLEANUP.
" Executed automatically on exception
FREE MEMORY ID lv_memory_id.
ENDTRY.

12. Data Transfer to Report

" Main program: Pass data to report
DATA: lt_selections TYPE TABLE OF rsparams.
" Export data
EXPORT selections = lt_selections
TO MEMORY ID 'ZREPORT_DATA'.
" Call report
SUBMIT zreport_process AND RETURN.
" Get result
DATA: lt_results TYPE ty_result_tab.
IMPORT results = lt_results
FROM MEMORY ID 'ZREPORT_RESULTS'.
FREE MEMORY ID 'ZREPORT_DATA'.
FREE MEMORY ID 'ZREPORT_RESULTS'.
" Report (ZREPORT_PROCESS)
DATA: lt_selections TYPE TABLE OF rsparams,
lt_results TYPE ty_result_tab.
" Data from caller
IMPORT selections = lt_selections
FROM MEMORY ID 'ZREPORT_DATA'.
" Processing...
" Return result
EXPORT results = lt_results
TO MEMORY ID 'ZREPORT_RESULTS'.

Memory Area Overview

MethodSyntaxArea
EXPORT TO MEMORYID ‘xyz’ABAP Memory
SET PARAMETERID ‘PAR’SAP Memory
EXPORT TO DATABASEindx(xx) ID ‘xyz’DB Cluster
EXPORT TO DATA BUFFERxstringVariable
Shared MemoryCL_SHM_AREAApplication Server

Important Notes / Best Practice

  • Call FREE MEMORY when data is no longer needed.
  • Use unique IDs (e.g., with program/user).
  • ABAP Memory only within a call stack.
  • SAP Memory for field pre-population (Parameter IDs).
  • Database Cluster for persistent data.
  • Shared Objects for server-wide caching.
  • COMPRESSION ON for large data volumes.
  • CLEANUP for cleanup on exceptions.
  • Memory IDs not too long (max 72 characters).
  • Combine with Background Jobs for data transfer.