В SAP NetWeaver есть функционал для использования длинных текстов (более 100 символов и даже более 1000 😊). более технически корректное название sapscript text или, иногда, стандартные тексты.
Длинный текст может использоваться в качестве шаблонов в письмах, печатных формах, формировании договоров и любых других сущностей, где может быть «многабукав».
В одной из следующих статей мы детально разберем, как можно использовать шаблонизацию (это было пожелание одного из слушателей ABAP FIleOS) для писем на основе длинных текстов, а в этой статей покажем, как можно создать длинный текст с вложенными частями и как их прочитать в ABAP (по сути, базовые операции с сапскрипт).
Итак, пусть у нас имеется следующий текст, разделенный на логические части (а точнее 4 части).
----------------------------------------------------------
Вводная часть текста, поясняющая про чего этот текст (например, тип договора и предмет договора; приветствие в письме и т.д.).
~~~~~~~
Какой-то блок, который по форме одинаков для многих текстов, но отличается лишь некоторыми данными (например, участники договора купли-продажи; письмо, содержащее информацию о заказе/клиенте и т.д.)
~~~~~~~
Поясняющая часть (которая может быть вообще разная для разных даже однотипных текстов).
~~~~~~~
Завершающая часть в тексте, которая может повторяться для нескольких текстов.
----------------------------------------------------------
Работа с составным длинным текстом (INCLUDE и копирование текстов)
Теперь я сделаю длинный текст в транзакции SO10, разбив текст также на 4 части. Для этого запускаю транзакцию SO10. Текст назову ZSD_MAIL_ORDER_CREATED_ALL.
Для наполнения содержим я буду использовать старый редактор (и, да я считаю его очень удобным для данных целей). Чтобы сменить/установить редактор используйте пункт меню Goto -> Change Editor/Configure Editor.
Для разделения текста на части я использую команду :/ (двоеточие и слэш) и укажу тексты, которые будут являться составными частями моего составного текста (самих текстов еще нет; я их сделаю следующим шагом также через транзакцию SO10).
Следующим шагом я создам каждый из указанных текстов через транзакцию SO10: ZSD_MAIL_ORDER_CREATED_01, ZSD_MAIL_ORDER_CREATED_02, ZSD_MAIL_ORDER_CREATED_03, ZSD_MAIL_ORDER_CREATED_04. На скриншотах ниже показано наполнение каждого из этих текстов.
В моем случае было удобно вводить текст простым вводом, однако полезно иметь ввиду функцию загрузки и выгрузки текста из файла, из другого текста и из буфера.
Для вставки текста из файла, меню: Text -> Upload/Download
Для загрузки текста из другого стандартного текста, меню: Insert -> Text -> Standard
Затем указываем параметры текста (можем вставить как ссылку на текст, так и его содержимое через галку «Expand Immediately»).
С помощью кнопки Выделить / F2, мы можем выделить строки текста и отправить его в буфер (в один из 5 буферов – то есть мы можем сделать за один раз сразу 5 выделений текста – ворду и не снилось…; относительно недавно с этим начала справляться windows и то только с помощью доп.ПО 😊 ).
После выделения нужных строк – они посинеют (цвет SAP). И их можно запомнить в буфере.
А затем (в другом тексте) мы можем извлечь скопированные строки из буфера
Просмотреть общий итог всего составного текста можно через предпросмотр.
Видим, что система отображает именно содержимое вложенных текстов, а не INCLUDE с командами. И это полезно.
Чтение составных длинных текстов через ABAP
Итак, мы сделали составной текст, а также наполнили каждую часть содержимым. Как считать этот текст через ABAP/4 ?
Полный текст программы. Нам нужно 3 шага:
1) Считаем длинные тексты при помощи функ.модуля READ_TEXT
2) Заменим INCLUDE в составном тексте через функц.модуль TEXT_INCLUDE_REPLACE
3) Затем заменим управляющие конструкции (если таковые есть) с помощью ФМа TEXT_CONTROL_REPLACE.
На экран выведем получившуюся строку через CL_ABAP_BROWSER.
-----------------------------------------------------------------------
~~ Листинг1. Общий подход к чтению стандартных текстов
----------------------------------------------------------------------
-----------------------------------------------------------------------
~~ Листинг2. Замена INCLUDE и управляющих конструкций в сапскрипте
-----------------------------------------------------------------------
Также хотел бы обратить внимание на конвертацию длинного текста в формат HTML. Если HTML – это то, для чего Вы хотите использовать шаблон, то можете использовать ФМ CONVERT_ITF_TO_HTML. Подстановку и замену управляющих конструкций этот ФМ делает автоматически (при указании параметра 😊 ) (листинг3).
-----------------------------------------------------------------------
~~ Листинг3. Конвертация составного текста в HTML
-----------------------------------------------------------------------
Установка переменных
Конечно, никакие шаблоны не используются как статичные тексты. Одна из важных причин существования шаблонов (а в данном случае мы рассматриваем сапскрипт как шаблоны) – это возможность наполняться переменными данными. Давайте попробуем наполнить наш текст переменными. Переменные в текстах сапскрипт бывают трёх видов: системные, программные (класс, группа функций, исполняемая программа – это программы) и стандартные.
Давайте добавим в наш текст переменные. Синтаксис символов-переменных такой &SOME_VAR&. (подробнее тут). При использовании переменных полезно иметь ввиду опции форматирования: опции позволяют использовать нужный формат даты, времени; не выводить пустые переменные, добавлять пре- и пост- тексты к переменным и другие возможности (подробнее тут).
Добавим в текст ZSD_MAIL_ORDER_CREATED_02 переменные:
В данном тексте мы вывели дату через переменную &DATE& (она доступна в любом тексте); вывели имя отчета через &SY-REPID&, а также вывели значения переменных из той, программы, которая будет читать текст.
Обратим внимание, что для замены именно переменных мы используем функциональный модуль: TEXT_SYMBOL_REPLACE. В качестве параметра передаем ему имя той программы (как правило, вызывающей, которая содержит переменные для шаблона).
Код класса ZCL_C8A014_LONG_TEXT доступен по ссылке. Текст программе в той же папке на github.
Таким образом, мы можем использовать длинные тексты в качестве шаблона.
Перенос текстов через транспортный запрос
Длинные тексты автоматически не вносятся в запрос. Однако в случае необходимости, их можно положить в запрос принудительно, сделав следующую запись в транспортном запросе.
R3TR TEXT TEXT, ZSD_MAIL_ORDER_CREATED_02,ST,R
В документации также, в качестве альтернативы ручному добавлению, обозначены две программы ( RSTXR3TR и RSTXSCRP) и рекомендация обратиться к справке.
Заключение
Сапскрипт-тексты можно использовать в качестве шаблонов. С их помощью можно сделать вложенный шаблон, наполнить его переменными и условными конструкциями. Однако, не стоит забывать про перенос текстов – автоматически тексты в запрос не добавляются. А также факт того, что сапскрипт-тексты хранятся в неструктурированном виде в рамках оперативной базы. В следующих статьях мы рассмотрим, как можно нарисовать «стилизованное письмо с картинками» на основе сапскрипта, а также альтернативы сапскрипту для ведения шаблонов.