Small SAP Talk. Сохранение и передача параметров между ABAP программами
Нередки ситуации, в которых бывает очень нужно передать какие-то значения из одной ABAP разработки в другую. Например, у вас есть две ABAP программы: в одной из них вы считываете какие-то данные или готовите набор этих данных для последующей передачи в другую программу, в которой, в результате выполненного анализа, должно произойти что-то очень важное.
Стоит также оговориться, что задача оперативного сохранения какого-то набора параметров актуальна не только для ситуаций с двумя ABAP программами, но также актуальна и для жизненного цикла одной программы, в которой вам может потребоваться оперативно сохранить какие-то данные для последующей экстракции и анализа. Итак, какие тут могут быть варианты?
Вариант 1. Конструкция IMPORT/EXPORT TO 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 - 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.
Проверяю