Инлайновая декларация в ABAP стала доступна начиная с версии ABAP 7.4. В предыдущих использовались старые варианты записи. Вот, например, варианты декларации внутренних таблиц в старом и новом вариантах. Существует множество вариантов использования инлайн декларирования, но они не заменят полностью обычный вид определения переменных. Они только дадут возможность для некоторых случаев заменить его на новый вид записи.
Инлайновая декларация ABAP в SAP программах на примерах.
Важно знать про инлайновую декларации ABAP:
- Инлайновые переменные определяются только локально
- Тип переменной определяется в момент компиляции,
а не в момент создания переменной - Переменная, определённая инлайн внутри какой-либо конструкции, например, LOOP или CASE и др. Остаётся доступной и вне этих конструкции ниже по коду ABAP программы.
Определение ABAP переменной в любой момент
+ Удобно при создании переменной, сразу произвести её заполнение нужными данными. После определения/заполнения на уже готова к использованию без лишних строк кода.
– В недостаток некоторые указывают снижение читабельности кода, но, по моему мнению, это спорный вопрос.
1 2 3 4 5 6 |
" Создаём структуру DATA(ls_scar) = VALUE scarr( carrid = 'AA' carrname = 'American Air' ). " Создаём таблицу DATA(lt_scar) = VALUE scarr_t( ( carrid = 'AA' carrname = 'American Air' ) ). |
Считывание данных во внутреннюю таблицу определённую инлайн
+ Удобно считывать данные из таблицы базы данных во внутреннюю таблицу определённую инлайн. В этом случае программа сама сформирует таблицу со столбцами, указанными после оператора SELECT. При этом, не нужно предварительно определять тип внутренней таблицы или считывать лишние данные в неё.
– Недостаток этого варианта в том, что таблица, которая определена инлайн, всегда стандартная (STANDART TABLE). А работа со стандартными таблицами при большом объёме данных – это не оптимальный вариант. Более оптимально использовать сортированные или хешированные таблицы, в зависимости от определённого случая.
1 2 3 4 |
SELECT carrid, carrname INTO TABLE @DATA(lt_scarr) FROM scarr UP TO 5 ROWS. |
Получение строки или ссылки на строку внутренней таблицы
+ Удобно без определения дополнительных переменных пробежаться по внутренней таблице и, например, изменить значения в строках. Или считать данные с использованием конструкции READ TABLE и поместить ссылку в инлайн переменную.
– Недостатком этого варианта называют то, что если одну переменную использовать два раза в одинаковых циклах, то не получится поменять их местами без дополнительных правок кода. Также, слышал комментарии о том, что данный вариант определения снижает читабельность кода. По моему мнению, этот вариант удобен и я не вижу у него каких-то реальных минусов.
1 2 3 4 5 6 7 8 |
LOOP AT lt_scarr REFERENCE INTO DATA(lr_scarr). "Получаем ссылку ENDLOOP. LOOP AT lt_scarr INTO DATA(ls_scarr). "Получаем копию строки ENDLOOP. "Аналогично определяется преременная при READ TABLE READ TABLE lt_data REFERENCE INTO DATA(lr_data). |
Инлайновая декларация ABAP при вызове методов во входных и выходных параметрах
+ Удобно в момент вызова метода, например, определить таблицу или структуру и передать её в метод. При этом даже не создавая отдельной переменной с наименованием. Например,
таблицу “VALUE #( ( day = ’22’ year = ‘2020’ ) )” или
структуру “VALUE #( day = ’22’ year = ‘2020’ )”, заполнив только необходимые для нас поля.
Также, мы можем непосредственно при вызове метода поместить результат его выполнения в переменную определённую инлайн.
– Ограничения этого способа в том, что мы не можем передать инлайн переменную в метод или получить её непосредственно, при вызове, если параметр имеет родовой тип DATA (RV_RESULT Returning Type Ref To DATA). Также, мы не можем, по понятным причинам, определить переменные CHANGING инлайн. Важным ограничением является то, что мы не можем использовать инлайновое декларирование непосредственно при вызове ФМ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cl_salv_table=>factory( EXPORTING t_table = VALUE #( ( day = '22' year = 2020 ) ) IMPORTING r_salv_table = DATA(lr_grid) ). " Ограничения ФМ DATA: lv_new_day TYPE SCAL-INDICATOR. CALL FUNCTION 'DATE_COMPUTE_DAY' EXPORTING DATE = CONV sy-datum( |20200322| ) IMPORTING DAY = lv_new_day. " Таким образом получить параметр из ФМ нельзя CALL FUNCTION 'DATE_COMPUTE_DAY' EXPORTING DATE = sy-datum IMPORTING DAY = DATA(lv_day). |