[recovery mode] ABAP: Выборка значений справочных значений по их ключам БЫСТРО
Написал не так давно метод для выборки во внутреннюю таблицу справочных значений по их ключам с помощью создания динамической программы. К сожалению, исходный код приложить не получится, так как начальство запретило это делать. Так что ограничусь общим описанием теории.К примеру есть у нас внутренняя таблица:
DATA:
begin of it_BUKRS occurs 0,
BE type T001-BUKRS,
BENAME type T001-BUTXT,
end of it_BUKRS
.
В таблице заполнено поле BE и нам нужно выбрать из T001 значение BUTXT по соответствующему BE и заполнить поле BENAME. Как это нужно сделать «правильно» (т.е. с минимальными затратами памяти и максимально быстро).Выберем уникальные значения поля BE;
Сделаем FOR ALL ENTRIES из T001;
Пройдем по внутренней таблице и для каждого BE найдем соответствующее значение в выбранных из T001 данных. (Само собой используем HASH-таблицу для ускорения поиска)
И эта последовательность всегда одна и та же.Вот код этого процесса
чтобы не писать код вручную самому просто привожу код, который генерируется моим методом:
TYPES:
BEGIN OF s_k1,
BUKRS type T001-BUKRS,
END OF s_k1
.
DATA:
it_k1 TYPE SORTED TABLE OF s_k1 WITH UNIQUE KEY
BUKRS
, wa_k1 like line of it_k1.
FIELD-SYMBOLS:
'T001{BUKRS=BE}{BUTXT>BENAME}' .Передаем в метод строку, указанную выше + нашу внутреннюю таблицу. И после вызова метода поле BENAME будет заполнено соответствующими значениями из T001-BUTXT. Мы сократили наш код, к тому же другому программисту достаточно иметь под рукой справку по методу и он быстро поймет что делает данная строка. При этом весь алгоритм укладывается в небольшую строку.Для полноценной работы метода добавим в него возможность указывать константы и системные переменные (к примеру sy-langu часто требуется для выборки текстов). Также добавим возможность указания списка команд — тогда мы сможем последовательно выбирать данные.
Как это работает? — с помощью динамических программ. Т.е. метод анализирует переданные через строку параметры, генерирует динамическую программу и запускает её. Добавление программы происходит через «INSERT REPORT l_repid FROM CODE.» чтобы не ограничиваться количеством созданных программ.
P.S. Особо я рад этому методу когда приходится выбирать много значений и периодически уже в процессе работы от постановщика приходит указание на добавление новых поле для выборки.