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

Шаблонизация на основе длинных (сапскрипт) текстов

В SAP NetWeaver есть функционал для использования длинных текстов (более 100 символов и даже более 1000 😊). более технически корректное название sapscript text или, иногда, стандартные тексты. Длинный текст может использоваться в качестве шаблонов в письмах, печатных формах, формировании договоров и любых других сущностей, где может быть «многабукав». В одной из следующих статей мы детально разберем, как можно использовать шаблонизацию (это было пожелание одного из слушателей ABAP FIleOS) для писем на основе длинных текстов, а в этой статей покажем, как можно создать длинный текст с вложенными частями и как их прочитать в ABAP (по сути, базовые операции с сапскрипт). Итак, пусть у нас имеется следующий текст, разделенный на логические части (а точнее 4 части). ---------------------------------------------------------- Вводная часть текста, поясняющая про чего этот текст (например, тип договора и предмет договора; приветствие в письме и т.д.). ~~~~~~~ Какой-то блок, который по форм
Оглавление

В SAP NetWeaver есть функционал для использования длинных текстов (более 100 символов и даже более 1000 😊). более технически корректное название sapscript text или, иногда, стандартные тексты.

Длинный текст может использоваться в качестве шаблонов в письмах, печатных формах, формировании договоров и любых других сущностей, где может быть «многабукав».

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

Итак, пусть у нас имеется следующий текст, разделенный на логические части (а точнее 4 части).

----------------------------------------------------------

Вводная часть текста, поясняющая про чего этот текст (например, тип договора и предмет договора; приветствие в письме и т.д.).

~~~~~~~

Какой-то блок, который по форме одинаков для многих текстов, но отличается лишь некоторыми данными (например, участники договора купли-продажи; письмо, содержащее информацию о заказе/клиенте и т.д.)

~~~~~~~

Поясняющая часть (которая может быть вообще разная для разных даже однотипных текстов).

~~~~~~~

Завершающая часть в тексте, которая может повторяться для нескольких текстов.

----------------------------------------------------------

Работа с составным длинным текстом (INCLUDE и копирование текстов)

Теперь я сделаю длинный текст в транзакции SO10, разбив текст также на 4 части. Для этого запускаю транзакцию SO10. Текст назову ZSD_MAIL_ORDER_CREATED_ALL.

Рис. 1 Создание текста в транзакции SO10
Рис. 1 Создание текста в транзакции SO10

Для наполнения содержим я буду использовать старый редактор (и, да я считаю его очень удобным для данных целей). Чтобы сменить/установить редактор используйте пункт меню Goto -> Change Editor/Configure Editor.

Рис. 2 Установка/смена редактора для ведения длинного текста
Рис. 2 Установка/смена редактора для ведения длинного текста

Для разделения текста на части я использую команду :/ (двоеточие и слэш) и укажу тексты, которые будут являться составными частями моего составного текста (самих текстов еще нет; я их сделаю следующим шагом также через транзакцию SO10).

Рис. 3 Составные части длинного текста, включенные с помощью INCLUDE
Рис. 3 Составные части длинного текста, включенные с помощью INCLUDE

Следующим шагом я создам каждый из указанных текстов через транзакцию SO10: ZSD_MAIL_ORDER_CREATED_01, ZSD_MAIL_ORDER_CREATED_02, ZSD_MAIL_ORDER_CREATED_03, ZSD_MAIL_ORDER_CREATED_04. На скриншотах ниже показано наполнение каждого из этих текстов.

Рис. 4 Длинный текст-include ZSD_MAIL_ORDER_CREATED_01
Рис. 4 Длинный текст-include ZSD_MAIL_ORDER_CREATED_01
Рис. 5 Длинный текст-include ZSD_MAIL_ORDER_CREATED_02
Рис. 5 Длинный текст-include ZSD_MAIL_ORDER_CREATED_02
Рис. 6  Длинный текст-include ZSD_MAIL_ORDER_CREATED_03
Рис. 6 Длинный текст-include ZSD_MAIL_ORDER_CREATED_03
Рис. 7 Длинный текст-include ZSD_MAIL_ORDER_CREATED_04
Рис. 7 Длинный текст-include ZSD_MAIL_ORDER_CREATED_04

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

Для вставки текста из файла, меню: Text -> Upload/Download

Рис. 8 Загрузка/выгрузка текста из файла
Рис. 8 Загрузка/выгрузка текста из файла

Для загрузки текста из другого стандартного текста, меню: Insert -> Text -> Standard

Рис. 9 Вставка текста из другого ( или других) длинных текстов
Рис. 9 Вставка текста из другого ( или других) длинных текстов

Затем указываем параметры текста (можем вставить как ссылку на текст, так и его содержимое через галку «Expand Immediately»).

Рис. 10 Возможность вставки как содержимого текста так и ссылки на него
Рис. 10 Возможность вставки как содержимого текста так и ссылки на него

С помощью кнопки Выделить / F2, мы можем выделить строки текста и отправить его в буфер (в один из 5 буферов – то есть мы можем сделать за один раз сразу 5 выделений текста – ворду и не снилось…; относительно недавно с этим начала справляться windows и то только с помощью доп.ПО 😊 ).

Рис. 11 Кнопка Выделить в стандартном тексте для выделения строк в тексте и отправки их в буфер
Рис. 11 Кнопка Выделить в стандартном тексте для выделения строк в тексте и отправки их в буфер

После выделения нужных строк – они посинеют (цвет SAP). И их можно запомнить в буфере.

Рис. 12 Отправка строк текста в один из 5 буферов
Рис. 12 Отправка строк текста в один из 5 буферов

А затем (в другом тексте) мы можем извлечь скопированные строки из буфера

Рис. 13 Вставка скопированного текста из буфера
Рис. 13 Вставка скопированного текста из буфера

Просмотреть общий итог всего составного текста можно через предпросмотр.

Рис. 14 Предпросмотр длинного текста (в том числе составного)
Рис. 14 Предпросмотр длинного текста (в том числе составного)

Видим, что система отображает именно содержимое вложенных текстов, а не INCLUDE с командами. И это полезно.

Рис. 15 Результат предпросмотра составного текста
Рис. 15 Результат предпросмотра составного текста

Чтение составных длинных текстов через ABAP

Итак, мы сделали составной текст, а также наполнили каждую часть содержимым. Как считать этот текст через ABAP/4 ?

Полный текст программы. Нам нужно 3 шага:

1) Считаем длинные тексты при помощи функ.модуля READ_TEXT

2) Заменим INCLUDE в составном тексте через функц.модуль TEXT_INCLUDE_REPLACE

3) Затем заменим управляющие конструкции (если таковые есть) с помощью ФМа TEXT_CONTROL_REPLACE.

На экран выведем получившуюся строку через CL_ABAP_BROWSER.

-----------------------------------------------------------------------

~~ Листинг1. Общий подход к чтению стандартных текстов

-16

----------------------------------------------------------------------

-----------------------------------------------------------------------

~~ Листинг2. Замена INCLUDE и управляющих конструкций в сапскрипте

-17

-----------------------------------------------------------------------

Также хотел бы обратить внимание на конвертацию длинного текста в формат HTML. Если HTML – это то, для чего Вы хотите использовать шаблон, то можете использовать ФМ CONVERT_ITF_TO_HTML. Подстановку и замену управляющих конструкций этот ФМ делает автоматически (при указании параметра 😊 ) (листинг3).

-----------------------------------------------------------------------

~~ Листинг3. Конвертация составного текста в HTML

-18

-----------------------------------------------------------------------

Установка переменных

Конечно, никакие шаблоны не используются как статичные тексты. Одна из важных причин существования шаблонов (а в данном случае мы рассматриваем сапскрипт как шаблоны) – это возможность наполняться переменными данными. Давайте попробуем наполнить наш текст переменными. Переменные в текстах сапскрипт бывают трёх видов: системные, программные (класс, группа функций, исполняемая программа – это программы) и стандартные.

Давайте добавим в наш текст переменные. Синтаксис символов-переменных такой &SOME_VAR&. (подробнее тут). При использовании переменных полезно иметь ввиду опции форматирования: опции позволяют использовать нужный формат даты, времени; не выводить пустые переменные, добавлять пре- и пост- тексты к переменным и другие возможности (подробнее тут).

Добавим в текст ZSD_MAIL_ORDER_CREATED_02 переменные:

Рис. 16 Стандартный текст, содержащий переменные
Рис. 16 Стандартный текст, содержащий переменные

В данном тексте мы вывели дату через переменную &DATE& (она доступна в любом тексте); вывели имя отчета через &SY-REPID&, а также вывели значения переменных из той, программы, которая будет читать текст.

-20

Обратим внимание, что для замены именно переменных мы используем функциональный модуль: TEXT_SYMBOL_REPLACE. В качестве параметра передаем ему имя той программы (как правило, вызывающей, которая содержит переменные для шаблона).

Листинг4. Программа, которая вызывает шаблон и содержит переменные для него.
Листинг4. Программа, которая вызывает шаблон и содержит переменные для него.

Код класса ZCL_C8A014_LONG_TEXT доступен по ссылке. Текст программе в той же папке на github.

Таким образом, мы можем использовать длинные тексты в качестве шаблона.

Рис. 17 Результат использования шаблона с переменными
Рис. 17 Результат использования шаблона с переменными

Перенос текстов через транспортный запрос

Длинные тексты автоматически не вносятся в запрос. Однако в случае необходимости, их можно положить в запрос принудительно, сделав следующую запись в транспортном запросе.

R3TR TEXT TEXT, ZSD_MAIL_ORDER_CREATED_02,ST,R

Рис. 18 Запись добавленная вручную в транспортный запрос для переноса текста sapscript
Рис. 18 Запись добавленная вручную в транспортный запрос для переноса текста sapscript

В документации также, в качестве альтернативы ручному добавлению, обозначены две программы ( RSTXR3TR и RSTXSCRP) и рекомендация обратиться к справке.

Заключение

Сапскрипт-тексты можно использовать в качестве шаблонов. С их помощью можно сделать вложенный шаблон, наполнить его переменными и условными конструкциями. Однако, не стоит забывать про перенос текстов – автоматически тексты в запрос не добавляются. А также факт того, что сапскрипт-тексты хранятся в неструктурированном виде в рамках оперативной базы. В следующих статьях мы рассмотрим, как можно нарисовать «стилизованное письмо с картинками» на основе сапскрипта, а также альтернативы сапскрипту для ведения шаблонов.