Обзор
Отдельный лист для каждого подразделения, переменное число месяцев по горизонтали и столько строк, сколько нужно конкретному подразделению. Три направления повторения в одной книге.
Демо 091 объединяет динамическую таблицу с внешним повторяемым блоком. Класс - ZCL_XTT_DEMO_091, шаблон - ZXXT_DEMO_091-XLSX.
Одна внешняя строка описывает лист
Используются типы из ZCL_XTT_DEMO_090:
TYPES:
BEGIN OF lts_merge,
title TYPE string,
c TYPE tt_column,
t TYPE REF TO data,
END OF lts_merge,
ltt_merge TYPE STANDARD TABLE OF lts_merge WITH DEFAULT KEY.
C содержит описания столбцов. T ссылается на динамическую таблицу с полями вроде SUM1 и SUM2. Объедините их с заголовком во внешней таблице, и каждая её строка будет содержать полный набор данных для листа.
Порядок полезно держать перед глазами: заголовок, столбцы, строки. Проход по столбцам вставляет маркеры, которые заполняет проход по строкам.
Повторное использование построителя
В SET_MERGE_INFO метод GET_ONE_MERGE вызывается для каждого запрошенного блока:
DATA lt_merge TYPE zcl_xtt_demo_090=>ltt_merge.
DO mo_report->mv_b_cnt TIMES.
DATA lv_index TYPE string.
lv_index = sy-index.
CONDENSE lv_index.
DATA ls_merge TYPE zcl_xtt_demo_090=>lts_merge.
ls_merge = zcl_xtt_demo_090=>get_one_merge( mo_report ).
CONCATENATE 'Sheet' lv_index INTO ls_merge-title SEPARATED BY space.
APPEND ls_merge TO lt_merge.
ENDDO.
mo_report->merge_add_one( lt_merge[] ).
Это код демонстрационной программы: mo_report предоставляет счётчики и случайные данные. В приложении постройте такую же внешнюю структуру для нужных отчётных единиц.
В корень регистрируется вся таблица. В демо 090 были отдельные корни C и R для двух проходов; здесь столбцы и строки относятся к каждой записи корня R.
Маркеры внутри книги
Шаблон содержит лист Info и повторяемый лист с именем {R-TITLE}. На повторяемом листе используются следующие маркеры:
| Маркер | Назначение |
|---|---|
{R-TITLE} |
Название создаваемого листа |
{R-C;direction=column} |
Горизонтальное повторение описаний столбцов |
{R-C-MON}, {R-C-MON_NAME} |
Номер месяца и заголовок |
{R-C-COL_NAME} |
Текст маркера для последующей подстановки строк |
{R-T;group=GROUP} |
Группировка детальных данных |
{R-T;level=0} |
Общие итоги |
{R-T;level=1;top=X} |
Заголовки групп перед строками |
{R-T;level=2} |
Детальные строки |
Например, описание столбца передаёт {R-T-SUM1;func=SUM}. Этот текст становится частью шаблона до обработки R-T.
В этом и приём. Отдельную копию шаблона для каждого будущего листа готовить не нужно.
Сначала небольшая книга
В демо доступны число блоков, столбцов и строк. Начните с двух блоков, двух столбцов и нескольких строк: так границы проще проследить, чем в двадцати почти одинаковых листах.
На листе Info также записан старый обходной приём для проблем предварительного просмотра печати: оставить начальный статический лист либо открыть и пересохранить книгу в Excel. Это заметка для показанного случая. Обычная генерация не требует макроса.
Если неверны границы листа, вернитесь к вложенным блокам. Если в ячейке остался маркер, проверьте порядок «столбцы перед строками» из демо 090.