ZCL_EUI_ALV_STYLE
Стилизация стандартных ALV-таблиц в ABAP может быть весьма утомительной. Построчный обход таблицы стилей, ручное управление битовыми операциями и редактирование ячеек по одной — занятие, в котором легко наделать ошибок.
Этот вспомогательный класс из библиотеки EUI берет на себя всю грязную работу по стилизации и объединению ячеек ALV, предоставляя чистый, цепочечный API, основанный на правилах. Давайте разберемся, что он делает, как работает под капотом и как его использовать.
Что он делает на самом деле
На практике ZCL_EUI_ALV_STYLE работает как «движок стилизации» для уже существующего CL_GUI_ALV_GRID. Вместо того чтобы изменять саму таблицу стилей, вы предоставляете классу набор правил:
- Выбор цели изменения: «Применить этот стиль к Колонке A» или «Применить этот стиль к Строке 4».
- Условное форматирование: «Покрасить ячейку в красный, если ее значение равно
X» или «Сделать конкретные ячейки со значением---недоступными для редактирования». - Динамическое объединение: «Объединить все смежные по вертикали ячейки в Колонке B с одинаковыми значениями».
Концептуальная магия
Внутри себя ZCL_EUI_ALV_STYLE получает ссылку на таблицу стилей и таблицу данных напрямую из инстанса ALV-грида. Когда вы вызываете его основной метод, он вычисляет пересечения. Если передать колонку и строку, он найдет конкретную ячейку на их пересечении. Класс обрабатывает побитовые операции (BIT-OR), поэтому если для строки задано «Жирный», а для колонки — «Красный», ячейка на пересечении станет «Жирной И Красной» без перезаписи какого-либо из стилей.
Если вы хотите явно перезаписать стиль, а не добавлять его к текущему, просто передайте iv_add = abap_false в метод set_style.
Вы также можете передать значения для статического объединения по вертикали и горизонтали без каких-либо условий. Более того, класс содержит специальный движок объединения ячеек, который итерируется по таблице стилей. Он динамически определяет и сопоставляет строки (по точному значению, шаблону или даже регулярным выражениям), чтобы бесшовно выполнять сложные горизонтальные и вертикальные мерджи.
Методы
API сделан минималистичным:
CONSTRUCTOR( io_grid )
Вы создаете инстанс объекта стилей, передавая ему ссылку на стандартный cl_gui_alv_grid (да, он работает с любыми стандартными ALV, а не только с ZCL_EUI_ALV).
SET_PROPERTY( ... )
Обертка для прямой установки свойств фронтенд-грида — например, для фиксации строк в ALV.
SET_STYLE( ... )
Основа основ этого класса. Принимает опциональные таблицы it_columns, it_rows и it_values (для динамического мерджа). Поскольку метод возвращает собственный инстанс (самого себя), вы можете легко выстраивать цепочку вызовов.
Примеры ABAP
Давайте посмотрим, как использовать всё это с современным синтаксисом ABAP.
Базовая стилизация колонок и строк
DATA(lo_style) = NEW zcl_eui_alv_style( io_grid = lo_grid ).
lo_style->set_style(
" Делаем всю колонку FIELD09 цветом 'Total' и выравниваем по центру
it_columns = VALUE #( ( column = 'FIELD09'
style = alv_style_color_total BIT-OR alv_style_align_center_center ) )
)->set_style(
" Делаем 4-ю строку зеленой и курсивом
it_rows = VALUE #( ( row_id = 4
style = alv_style_color_positive BIT-OR alv_style_font_italic ) )
).
Условная стилизация (пересечения)
Допустим, у вас есть колонка статуса (FIELD08), и вы хотите сделать ячейку недоступной для редактирования, если ее значение равно желтой LED-иконки.
lo_style->set_style(
it_columns = VALUE #( ( column = 'FIELD08'
style = alv_style_disabled ) )
it_values = VALUE #( ( value = icon_led_yellow ) ) " Правило применяется только к этому значению!
).
Динамическое объединение ячеек
Ручное объеденение ячеек приносит одни страдания. Поэтому вы просто задаете поведение объединения с помощью констант этого класса.
lo_style->set_style(
" Целевые колонки 1 и 2
it_columns = VALUE #( style = alv_style_align_center_center BIT-OR alv_style_font_bold
( column = 'FIELD01' )
( column = 'FIELD02' ) )
" Объединяем одинаковые значения и по горизонтали, И по вертикали
it_values = VALUE #( ( merge_mode = zcl_eui_alv_style=>c_merge_mode-equal
+ zcl_eui_alv_style=>c_merge_mode-merge_horizontal
+ zcl_eui_alv_style=>c_merge_mode-merge_vertical ) )
).
Разбираемся с merge_mode: Объединение можно применять по горизонтали (merge_horizontal), по вертикали (merge_vertical) или даже в обоих направлениях одновременно. Вы можете комбинировать эти направления со специфичными правилами сопоставления:
equal: объединяет строго идентичные значения (вероятно, самое частое правило).value_and_empty: объединяет идентичные значения И идущие за ними пустые ячейки.contains_pattern: использует стандартный ABAP-операторCP(требует передачи строки в параметрvalue).regex: использует регулярные выражения для сложного сопоставления (требует передачи regex-шаблона в параметрvalue).
Фиксация строк
Используем вспомогательный метод, чтобы зафиксировать 2 верхние строки:
lo_style->set_property(
iv_property = 'FixedRows'
iv_value = 2
).
Демо-приложение: ZEUI_TEST_ALV_STYLES
Если хотите увидеть всё это в действии, запустите демо-программу ZEUI_TEST_ALV_STYLES.
Что она демонстрирует:
- Создает фиктивную таблицу инструментов/материалов с различными строковыми шаблонами, числами и стандартными LED-иконками SAP.
- Подключается к событию
change_styles(которое триггерится через классZCL_EUI_ALV), чтобы применить стили ровно в тот момент, когда грид готов. - Вы увидите несколько различных примеров перекрестного объединения ячеек.
- Сохраняя всю логику стилизации в одной длинной цепочке вызовов (используя современный синтаксис ABAP), пример показывает, насколько чище может выглядеть стилизация ALV в старом добром SAP GUI.
Подводим итоги
ZCL_EUI_ALV_STYLE — пример изоляции шаблонного UI-кода. Если вынести работу со стилями в отдельный класс с правилами, отчёты становятся гораздо более удобными и приятными для пользователей. Да, это всего лишь визуальные трюки в ALV, но они акцентируют внимание на ключевых данных и делают чтение таблиц намного удобнее.