Обзор
Форма с отдельной клеточкой для каждой буквы быстро превращает обычное имя в длинный список вспомогательных полей. Первая буква, вторая, третья. Знакомая картина.
Демо 131 сохраняет имя целиком в ABAP и извлекает символы в шаблоне. Данные сотрудников предоставляет ZCL_XTT_DEMO_131; шаблоны XLSX и DOCX показывают разные применения сокращения ;cond=.
Двоеточие вместо ;cond=
Эти маркеры запрашивают одинаковое значение:
{R;cond=value-NACHN+0(1)}
{R:v-NACHN+0(1)}
Краткая форма заменяет ;cond= на : и использует v для текущего значения. Смысл выражения не меняется, и новый синтаксис ABAP от этого не становится доступным на старой системе.
Демо передаёт таблицу сотрудников как корень R. В каждой повторяемой форме v относится к текущей записи.
Данные отчёта
Класс объявляет такую строку корня:
TYPES:
BEGIN OF ts_root,
pernr TYPE pernr_d,
nachn TYPE c LENGTH 40,
vorna TYPE c LENGTH 40,
midnm TYPE c LENGTH 40,
gesch TYPE c LENGTH 1,
gbdat TYPE d,
perid TYPE c LENGTH 20,
photo TYPE xstring,
s_photo TYPE string,
END OF ts_root,
tt_root TYPE STANDARD TABLE OF ts_root WITH DEFAULT KEY.
_GET_ROOT читает действующие на текущую дату, незаблокированные записи PA0002, упорядоченные по табельному номеру и ограниченные контекстом экрана. Перед передачей в отчёт имена переводятся в верхний регистр.
Затем регистрируется вся таблица:
DATA lt_root TYPE tt_root.
lt_root = _get_root( ls_screen_context ).
mo_report->merge_add_one( lt_root ).
Повторение формы соответствует обработке корневой таблицы для выбранного формата документа.
По символу в клетку
В Excel соседние ячейки получают последовательные подстроки:
{R:v-NACHN+0(1)}
{R:v-NACHN+1(1)}
{R:v-NACHN+2(1)}
Смещения ABAP начинаются с нуля. Тот же приём используется для VORNA и MIDNM: шаблон содержит клетки для первых 19 символов каждого имени.
Поля имеют фиксированную длину, поэтому незанятые позиции содержат пробелы. Если замените их строками переменной длины, проверяйте фактическую длину перед извлечением подстроки.
Для даты рождения берутся позиции внутреннего представления YYYYMMDD:
{R:v-GBDAT+6(1);type=integer}
{R:v-GBDAT+7(1);type=integer}
В этих двух клетках находятся цифры дня. Месяц извлекается из позиций 4 и 5, год - из позиций от 0 до 3.
Явный целый тип делает результат каждой ячейки Excel числовым. Подходит ли это другому идентификатору - отдельный вопрос. Не теряйте значащие ведущие нули только потому, что в примере используются клетки для цифр.
Небольшие выражения, разные макеты
Коды пола в шаблоне преобразуются через SWITCH:
{R:SWITCH #( v-GESCH WHEN '1' THEN 'M' WHEN '2' THEN 'F' ELSE 'U' )}
Это соответствие из демонстрационного примера. Подписи и обработку кодов адаптируйте к требованиям своей формы.
В Excel также показана смена регистра:
{R:to_upper( |{ v-NACHN } { v-VORNA } { v-MIDNM }| )}
{R:to_lower( |{ v-NACHN } { v-VORNA } { v-MIDNM }| )}
{R:to_mixed( |{ v-NACHN }_{ v-VORNA }_{ v-MIDNM }| )}
Word использует дату рождения в пользовательском формате и число дней с момента рождения:
{R:|{ v-GBDAT DATE = USER }|}
{R:sy-datum - v-GBDAT}
Отдельных полей для этих представлений нет. Здесь сокращённая запись действительно полезна.
Фотографии и тестовые данные
Excel-шаблон объявляет {R-PHOTO;type=image}. Эта часть описана на странице изображений из двоичных данных.
В обычном режиме _GET_PHOTO ищет связи BDS для класса PREL, выбирает документы HRICOLFOTO или HRIEMPFOTO, читает содержимое через SCMS_DOC_READ и преобразует его в XSTRING.
В тестовом режиме декодируется base64 из S_PHOTO. Максимальное число записей берётся из счётчика строк демо; сами записи по-прежнему получает _GET_ROOT.
Адаптация для HR-системы
В предоставленном классе есть незавершённая часть: _GET_SCREEN_CONTEXT имеет пустую реализацию. Вне тестового режима он возвращает начальный контекст, и SET_MERGE_INFO завершается до регистрации данных.
При адаптации реализуйте выборку параметров. Контекст содержит диапазон табельных номеров S_PERNR и ограничение количества P_MAX_COUNT.
Динамическое имя ('PA0002') убирает статическую зависимость из исходного кода, но не создаёт HR-данные на системе без этой таблицы. Выражения дат, подстрок и форматирования можно переиспользовать; чтение данных нужно связать со своим приложением.