Усатый шаблонизатор
Большинство современных шаблонизаторов в web (и также в ABAP) работают по одному простому принципу
Данные + Шаблон = Готовый документ
Так чем отличается XTT от своих аналогов?
Нисколько не умаляя достоинства более популярных библиотек для генерации отчетов, давайте сравним XTT c основными из них:
- XLSX Workbench использует специальный редактор для настройки шаблона
- abap2xlsx использует класс ZCL_EXCEL_READER_2007 для считывания шаблона
- ZWWW использует привычный WYSIWYG MS Excel или Word редактор.
В ворде также нужны закладки (2 предыдущих специализируются на формате Excel)
XTT - Xml template toolkit
Данный опус в большей степени походит на последнюю разработку и максимально использует возможности самого WYSIWYG редактора.
Для передачи данных также как и в XLSX Workbench используется понятие контекста
Все что нужно сделать чтобы объединить данные с шаблоном это вызвать метод MERGE
Контекст IS_BLOCK (обычно ABAP структура) соответствует структуре документа.
Корневая метка (обычно ‘R’) является опциональным параметром и скорее нужна если данные объединяются с шаблоном несколько раз.
Так как сигнатура MERGE максимальна проста, основная сложность может возникнуть с самим шаблоном
Надеюсь, по причине своей очевидности, в большинстве случаев изучение {усатого синтаксиса} не потребуется.
Структура документа везде будет выглядеть приблизительно одинаково
" Document structure
BEGIN OF ts_root,
header TYPE string,
t TYPE tt_rand_data, " internal flat table ( In template {R-T} )
date TYPE d, " 8
datetime TYPE char14, " date(8) + time(6)
END OF ts_root.
MS Excel
MS Word
Adobe LiveCycle
Директивы
Все специальные возможности (директивы) всегда указываются {внутри фигурных скобок}
Их, весьма условно, можно разделить на 3 основных группы:
- 1) Относящиеся к выводу 1-го значения
- 2) Уточнение для всей таблицы или дерева
- 3) Блочные директивы
Давайте рассмотрим каждое из них по отдельности:
1) Директивы вывода 1-го значения
1-1) ‘;type=’ Тип данных
Первая часть из них относится к уточнению типа данных {;type=}
В общем случае, желательно оставлять тип как есть, не преобразуя в другие.
Если в отчете есть числа, то их не надо преобразовывать в строки. Если надо вывести пусто вместо 0, проще воспользоваться изменением самого формата.
Ctrl+1 - > Специальный формат -> 0;-0;;@Для дат преобразование в строки также не желательно. Если в отчете вышло число вроде 43964 вместо даты, просто измените формат самой ячейки на дату
Но есть и исключения:
{;type=boolean} и {;type=datetime} тк их по сути нет в самом языке ABAP
{;type=mask} если нужен аналог
WRITE TO
(к примеру СПП элемент){;type=integer} чтобы преобразовать из типа CHAR
Если вы уверены на все 100% что в символах будут только числа (но и в этом случае желательно объявить тип как NUMC для отчета)
С уточнением типа (BTRTL) и без него (WERKS)
Результат
1-2) ‘;cond=’ Условный вывод
Дополнение ‘;cond=’ позволяет написать простое условие для вывода 1-го или другого значения с использованием String Templates или любого другого оператора ABAP (SWITCH, COND, VALUE) который возвращает лишь одно результирующее значение
1-3) ‘;func=’ Встроенные функции
Другая часть связана с функциями агрегации ;func= SUM | AVG | COUNT | FIRST которые работают совместно с 3-2) директивами вывода дерева.
Для более сложных случаев есть специальное событие в ABAP
Для простых итогов в Excel можно воспользоваться стандартными средствами
Но если нужен универсальный способ который работает в Word и Pdf можно воспользоваться данными функциями
2) Уточнения таблицы или дерева
В отличии от предыдущих директив которые находились непосредственно в самой ячейке, данный вид директив можно располагать в любом месте шаблона и они относится ко всей таблице или дереву целиком
2-1) ‘;direction=column’
{;direction=column} работает только в классе ZCL_XTT_EXCEL_XLSX
и уточняет как нужно вывести таблицу. По умолчанию таблицы и деревья выводятся по строкам.
Если вам нужна динамическая таблица которая расширяется как по строкам, так и по столбцам посмотрите пожалуйста на данный пример
2-2) ‘;group=’
Позволяет сгруппировать табличные данные в иерархическую структуру на подобие дерева.
Для преобразования таблицы в дерево можно воспользоваться и двумя программными методами zcl_xtt_replace_block=>tree_create и zcl_xtt_replace_block=>tree_create_relat.
Но сделав подобное объявление группы в самом шаблоне, позволяет дать ясную картину того что таблица была трансформирована в дерево.
Вместо tree_create => {;group=Поля таблицы через запятую}.
Для подитогов с БЕ {R-T;group=BUKRS}Вместо tree_create_relat => {;group=Поля РОДИТЕЛЬ-ДОЧЕРНИЙ через тире}
Для дерева орг единиц по ИТ 1001 {R-T;group=OBJID-SOBID}
В самом простом случае нужно создать простые подитоги,
level=0 (итого по всем) в котором есть level=1 c данными самой таблицы
Если нам нужны подитоги по БЕ {;group=BUKRS} у нас получится 3 уровня (0,1,2)
level=0 Итого по всем БЕ
level=1 Итого по 1-й БЕ
level=2 Данные таблицы
В классе ZCL_XTT_EXCEL_XLSX
объявление дерева на уровне страницы дает возможность вывода одной и той же таблицы на разных листах с разными группировками
В данном примере таблица {R-T} выводится по разному в зависимости от объявления на конкретном листе
3) Блочные директивы
3-1) ‘;type=block’ Блок по условию
Дополнение ‘;type=block;’ совместно с дополнение ‘;cond=’ предназначено для условного вывода 1-го блока.
То есть оно работает аналогично ‘show_if’ для дерева. Но предназначено лишь для однократного выполнения. ‘show_if’ работает для каждой строки таблицы и их подитогов на разных уровнях
3-2) Директивы вывода дерева
После того как таблица была преобразована в дерево, можно задать границы и условия вывода каждого уровня.
- ;level= Уточняет для какого уровня предназначена данная строка (столбец)
- ;top=X Говорит о том что вывод будет осуществлен до нижестоящего уровня (пусто или ‘;top=’ что после)
- ;show_if= и ;hide_if= позволяют указать условие вывода того или иного уровня
Условие пишется на языке ABAP и имеет специальное зарезервированное имя row для ссылки на текущую строку в дереве
Данный пример с группировкой по 1 полю
Результат
Более подробно про директивы level, top, show_if, hide_if