Link Search Menu Expand Document

Усатый шаблонизатор

   Большинство современных шаблонизаторов в web (и также в ABAP) работают по одному простому принципу

Данные + Шаблон = Готовый документ
Так чем отличается XTT от своих аналогов?

image





   Нисколько не умаляя достоинства более популярных библиотек для генерации отчетов, давайте сравним XTT c основными из них:

  • XLSX Workbench использует специальный редактор для настройки шаблона

image




  • abap2xlsx использует класс ZCL_EXCEL_READER_2007 для считывания шаблона

image




  • ZWWW использует привычный WYSIWYG MS Excel или Word редактор.
    В ворде также нужны закладки (2 предыдущих специализируются на формате Excel)

image





XTT - Xml template toolkit

   Данный опус в большей степени походит на последнюю разработку и максимально использует возможности самого WYSIWYG редактора.
Для передачи данных также как и в XLSX Workbench используется понятие контекста

   Все что нужно сделать чтобы объединить данные с шаблоном это вызвать метод MERGE
Контекст IS_BLOCK (обычно ABAP структура) соответствует структуре документа.
Корневая метка (обычно ‘R’) является опциональным параметром и скорее нужна если данные объединяются с шаблоном несколько раз.

image





   Так как сигнатура MERGE максимальна проста, основная сложность может возникнуть с самим шаблоном

image




Надеюсь, по причине своей очевидности, в большинстве случаев изучение {усатого синтаксиса} не потребуется.
Структура документа везде будет выглядеть приблизительно одинаково

    " 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

image

MS Word

image

Adobe LiveCycle

image





Директивы

   Все специальные возможности (директивы) всегда указываются {внутри фигурных скобок}
Их, весьма условно, можно разделить на 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)

image

Результат

image




1-2) ‘;cond=’ Условный вывод

    Дополнение ‘;cond=’ позволяет написать простое условие для вывода 1-го или другого значения с использованием String Templates или любого другого оператора ABAP (SWITCH, COND, VALUE) который возвращает лишь одно результирующее значение

1-3) ‘;func=’ Встроенные функции

   Другая часть связана с функциями агрегации ;func= SUM | AVG | COUNT | FIRST которые работают совместно с 3-2) директивами вывода дерева.

Для более сложных случаев есть специальное событие в ABAP

Для простых итогов в Excel можно воспользоваться стандартными средствами

image

Но если нужен универсальный способ который работает в Word и Pdf можно воспользоваться данными функциями

image



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 данными самой таблицы

image


 Если нам нужны подитоги по БЕ {;group=BUKRS} у нас получится 3 уровня (0,1,2)
level=0 Итого по всем БЕ
level=1 Итого по 1-й БЕ
level=2 Данные таблицы

В классе ZCL_XTT_EXCEL_XLSX объявление дерева на уровне страницы дает возможность вывода одной и той же таблицы на разных листах с разными группировками

В данном примере таблица {R-T} выводится по разному в зависимости от объявления на конкретном листе

image




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 полю

image

Результат

image

 Более подробно про директивы level, top, show_if, hide_if