Link Search Menu Expand Document

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, но они акцентируют внимание на ключевых данных и делают чтение таблиц намного удобнее.