Найти в Дзене
rustabapclub

Использование RTTI для шаблонов на основе sap-script текстов

В одной из предыдущих статей мы разбирали работу с транзакцией SO10 (ведение sap-script длинных текстов): как можно вести текстовый шаблон, как можно копировать и использовать глобальные переменные для вставки значений. Однако, зачастую для вставки значений переменных используют простой find and replace – подход. Этим способом можно вставлять как элементарные переменные, так и табличные. Давайте его рассмотрим.

Сделаем через SO10 простой текст и укажем название переменных, которые мы будет подменять. Однако для переменных мы будем следовать нескольким правилам:

1) Элементарные переменные «обнимем» значком $, то есть если у нас компонент корневой структуры имеет имя KUNNR, то подготовленная для него переменная в шаблоне будет $KUNNR$. Выделено синим на скриншоте (рис.1).

2) Для табличных переменных укажем переменную с квадратной скобкой в начале части шаблона, к которому нужно применять каждую строку таблицы и в конце шаблона.
Компонент входной структуры, в котором есть внутренняя таблица имеет имя
ORDER_LINES. Тогда перед строкой таблицы у нас будет переменная $[ORDER_LINES$ (переменная «обнята» значком $ и имеет открывающуюся квадратную скобку вначале), а после строки шаблона будет переменная $ORDER_LINES]$. (квадратная открывающаяся скобка). Таким образом, мы поймем, где для внутренней таблицы начинается шаблон, а где он завершается. (выделено фиолетовым на рис1.).

3) Для вложенных структур переменную будут вида $STRUCT_NAME-$VAR_IN_STRUCT$ , то есть значок $ вначале имени структуры и «обнимает» переменную в структуре. Выделено оранжевым на рис1.

Шаблон для текста ZC8A017_TEMPL_ORD1 (рис.1)
Шаблон для текста ZC8A017_TEMPL_ORD1 (рис.1)

Текстовое содержание шаблона доступно на github.

Теперь рассмотрим, как мы можем это использовать. Пусть у нас есть информация по заказу клиента, как показано ниже. Есть заголовок, есть позиции и есть вложенная структура. ((полный код указан здесь).)

Структура для отображения информации по заказу клиента.
Структура для отображения информации по заказу клиента.

Теперь же с помощью нашего источника данных и шаблона с подготовленными переменными заполним шаблон по сути в 3 строки.

Наполнение шаблона с помощью RTTI внутри.
Наполнение шаблона с помощью RTTI внутри.

В основе заполнения шаблона лежит простой принцип: имя переменной из внутренней структуры «обнимается» значком $ слева и справа и подаётся в replace для строки.

А компоненты структуры мы получаем через RTTI-класс CL_ABAP_DATADESCR.

Листинг. Чтение компонентов через RTTI.
Листинг. Чтение компонентов через RTTI.

(полный код на github)

Обнимание переменной с помощью значка $ для экранирования.
Обнимание переменной с помощью значка $ для экранирования.

А затем мы просто подменяем переменные в шаблоне. (полный код на github)

Подмена переменных
Подмена переменных

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

Результат заполнения шаблона из структуры
Результат заполнения шаблона из структуры

Как видно это простой для применения и подготовки способ.