Small SAP Talk. Сохранение и передача параметров между ABAP программами

Нередки ситуации, в которых бывает очень нужно передать какие-то значения из одной ABAP разработки в другую. Например, у вас есть две ABAP программы: в одной из них вы считываете какие-то данные или готовите набор этих данных для последующей передачи в другую программу, в которой, в результате выполненного анализа, должно произойти что-то очень важное.

Стоит также оговориться, что задача оперативного сохранения какого-то набора параметров актуальна не только для ситуаций с двумя ABAP программами, но также актуальна и для жизненного цикла одной программы, в которой вам может потребоваться оперативно сохранить какие-то данные для последующей экстракции и анализа. Итак, какие тут могут быть варианты?

Вариант 1. Конструкция IMPORT/EXPORT TO MEMORY

См. Using the Shared Memory

Приведу пример ABAP программы, в которой произойдет запись в память какого-то значения переменной

REPORT zprogram1.
 
DATA: lv_memory_id     TYPE char10 VALUE \'ZMA_ZPROGRAM1\',
      lv_random_string TYPE string.
 
CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
  EXPORTING
    number_chars  = 10
  IMPORTING
    random_string = lv_random_string.
 
 
EXPORT  lv_random_string FROM lv_random_string TO MEMORY ID lv_memory_id.
 
SUBMIT zprogram2.

В другой программе, я считаю это значение из памяти, и выведу его на экран

REPORT zprogram2.
 
DATA: lv_random_string TYPE string,
      lv_memory_id     TYPE char10 VALUE \'ZMA_ZPROGRAM1\'.
 
 
IMPORT lv_random_string TO lv_random_string FROM MEMORY ID lv_memory_id.
 
FREE MEMORY ID lv_memory_id.
 
WRITE:/ \'Value from memory: \' ,  lv_random_string.    

Проверяем что происходит

Вариант довольно распространенный, но чреват не очень хорошими последствиями, которые известны программистам.

Вариант 2. Конструкция IMPORT/EXPORT TO DATABASE indx(as)

Отличается от Варианта #1 тем, что запись какого-то значения выполняется в кластерную таблицу INDX

См. INDX-like

См. EXPORT - Table Structure

См. EXPORT - medium

Переделаю программу #1 следующим образом

REPORT zprogram1.
 
DATA: lv_memory_id TYPE char10 VALUE 'ZWA_XXX',
lv_random_string TYPE string.
 
CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
EXPORTING
number_chars = 10
IMPORTING
random_string = lv_random_string.
 
 
EXPORT lv_random_string = lv_random_string
TO DATABASE indx(ZA)
CLIENT sy-mandt ID lv_memory_id.
 
SUBMIT zprogram2.

И слегка подретуширую программу #2

REPORT zprogram2.
 
DATA: lv_random_string TYPE string,
lv_memory_id TYPE char10 VALUE 'ZWA_XXX'.
 
IMPORT lv_random_string TO lv_random_string
FROM DATABASE indx(za)
ID lv_memory_id.
IF sy-subrc EQ 0.
WRITE:/ 'Value from INDX table is : ' , lv_random_string.
ENDIF.

Проверяю