Работа с SALV Hierseq Table

Для отображения иерархической таблицы с двумя уровнями иерархии (главный и подчиненный) в SALV модели используется класс — cl_salv_hierseq_table.

Примером подобной иерархии может служить заказ на закупку, который состоит из заголовочной части и позиций заказа. Связь в этой иерархии осуществляется с помощью ключевого поля «номер заказа» в заголовке и позиции заказа.

Таблица создается с помощью фабрично-статического метода factory(). При его вызове необходимо передать две таблицы с данными и таблицу, в которой прописана связь между ними с типом salv_t_hierseq_binding. В данной таблице указываются ключевые поля которые связывают таблицы, но не более 5 полей. Если у вас больше создавайте составные ключи в технических полях.
Следующий пример покажет, как вывести иерархическую таблицу закупочных заказов с позициями:

Результат работы программы:

Настройка функций


Как и в случае с cl_salv_table, в полноэкранном режиме для установки GUI статуса необходимо использовать метод SET_SCREEN_STATUS, параметр REPORT отвечает за то из какой программы будет взят GUI статус, PFSTATUS – имя GUI статуса, SET_FUNCTIONS – определяет какие стандартные функции будут использованы в программе.
Может принимать значения: C_FUNCTIONS_DEFAULT – сортировки, фильтры, выбор формата. C_FUNCTIONS_ALL – все функции ALV, C_FUNCTIONS_NONE – по умолчанию, только пользовательские функции. Константы определены в классе: CL_SALV_MODEL_BASE.
Стандартный GUI статус можно взять в группе функций: SALV_METADATA_STATUS – статус: SALV_TABLE_STANDARD или SALV_TABLE_STDPOPUP, скопировать в свою программу и расширить необходимыми функциями.
Для того чтобы динамически исключить какую либо функцию можно применить класс cl_salv_functions, но вместо метода remove_function использовать метод set_function, параметр name определяет какую функцию будем скрывать, boolean — определяет скрыта она или нет, если скрываем, ставим в abap_true. Метод remove_function не работает для полно экранного режима.
Пример настройки функций через класс (когда используется контейнер):

Настройка через GUI статус:

Результат:

Настройка колонок


Настройка колонок работает так же как и с cl_salv_table, за исключением того что для настройки колонок используются классы – cl_salv_columns_hierseq и cl_salv_column_hierseq. Кроме того колонки настраиваются относительно уровня иерархии, при получении ссылки на экземпляр класса cl_salv_columns_hierseq необходимо указать уровень в иерархии.
В настройке колонок можно настроить сворачивание иерархии, для этого в структуры необходимо добавить поле expand с типом char1. И в настройке колонок верхнего уровня указать колонку, отвечающую за эту логику через метод set_expand_column.
Для того чтобы иерархия была развернута необходимо получить ссылку на экземпляр уровня иерархии представленный классом cl_salv_hierseq_level и вызвать метод – set_items_expanded. Для получения экземпляра данного класса необходимо использовать метод get_level (уровень) класса cl_salv_hierseq_table.

Пример настройки колонок:

Результат:

Настройка сортировок


Настройка сортировок как и в классе cl_salv_table происходит через класс cl_salv_sorts, за исключением того что ссылку на него мы получаем указывая уровень иерархии.
Пример настройки сортировок:

Результат:

Обработка событий


За обработку событий отвечает класс CL_SALV_EVENTS_HIERSEQ, он позволяет обработать следующие события:

  • TOP_OF_PAGE – обработка заголовка
  • END_OF_PAGE – обработка подвала
  • BEFORE_SALV_FUNCTION – событие срабатывает до стандартной функции
  • AFTER_SALV_FUNCTION – событие срабатывающее после стандартной функции
  • ADDED_FUNCTION – событие срабатывающее на нажатие своих функций
  • DOUBLE_CLICK – двойной щелчок
  • LINK_CLICK – обработка нажатий на активные элементы (в иерархической таблице только hotspot)

Как видно из примера выше поле EBELN мы сделали активным элементом (hotspot), допустим нам необходимо, чтобы при нажатии на него открывалась транзакция на просмотр заказа. Первое что нужно сделать, это создать обработчик события. Объявление метода:

Его реализация:

Далее необходимо зарегистрировать обработчик события:

Напоследок код программы целиком: