Работа с SALV Tree

Для отображения иерархического дерева состоящего из любого числа уровней иерархии в SALV модели используется класс — cl_salv_tree.

Строки в таком дереве называются узлами. Каждый узел, не важно, на каком он уровне, имеет одинаковую структуру со всеми остальными.

Дерево, как и другие классы SALV модели, создается с помощью фабрично-статического метода factory(). При этом при его вызове необходимо передавать не заполненную таблицу с данными, а пустую. Заполнение данных происходит на этапе определения узлов для созданного дерева. Объект дерева можно создать как в полно экранном режиме, так и в контейнере указав параметр r_container. Кроме того можно спрятать заголовок дерева – передав в параметр hide_header значение abap_true (X).

Пример создания дерева, без иерархии:

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

Создание иерархии

Чтобы создать иерархию, в момент заполнения дерева узлами необходимо определить дочерние и родительские узлы. Для того чтобы их определить необходимо разобраться с методом добавления узла — add_node. Метод имеет следующие параметры:
Параметр Описание
related_node Ключ узла, к которому будем добавлять узел в качестве дочернего (или братского – к тому же родителю что и у него). Для получения узла в классе cl_salv_node существует метод key. Если значение пустое узел добавляется на самый верхний уровень.
relationship Определяет местоположение, которое займет созданный узел, задается константами из класса cl_gui_column_tree: 

  • relat_first_child – узел добавляется первым дочерний
  • relat_last_child – последним дочерним
  • relat_first_sibling – узел добавляется как первый братский
  • relat_last_sibling – узел добавляется как последний братский
  • relat_next_sibling – узел добавляется как следующий братский
  • relat_prev_sibling – узел добавляется как предыдущий братский
data_row Данные узла, с той же структурой что использовалась при создании в фабричном методе.
collapsen_icon Иконка в свернутом состоянии
expanded_icon Иконка в развернутом состоянии
text Определяет текст, который вставляется в колонку иерархии для узла
visible Видимость узла
folder Если поставить в abap_true, узел будет иметь иконку в свернутом состоянии, в случае если нет дочерних элементов
expander Определяет отображать ли флажок разворачивания (сворачивания) уровня иерархии для узла
row_style Задает стиль (цвет) для узла. Виды стилей находятся в определении интерфейса IF_SALV_C_TREE_STYLE и могут принимать следующие значения: 

  • DEFAULT
  • INHERITED
  • INTENSIFIED
  • INACTIVE
  • INTENSIFIED_CRITICAL
  • EMPHASIZED_NEGATIVE
  • EMPHASIZED_POSITIVE
  • EMPHASIZED
  • EMPHASIZED_A
  • EMPHASIZED_B
  • EMPHASIZED_C
Кроме того чтобы созданная иерархия отобразилась на экране необходимо настроить заголовок дерева. За настройку дерева отвечает класс cl_salv_tree_settings. Далее пример измененного метода, для создания иерархии:

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

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

Как и в случае с cl_salv_table, для полноэкранного режима кнопки настраиваются через GUI статус, стандартный можно взять из программы — SALV_DEMO_TREE_SIMPLE. Если дерево отображается в контейнере, то через класс cl_salv_functions_tree .  Однако тут нет явного ограничения на использование GUI статуса в полноэкранном режиме, можно вместо него использовать вышеназванный класс, пример настройки кнопок:

Или:

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

Если вдруг кнопка суммы не будет работать замените ее функцией — &CALC_SUM.

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

Настройка колонок работает так же как и с cl_salv_table, за исключением того что для настройки колонок в дереве используются классы – cl_salv_columns_tree и cl_salv_column_tree. Пример настройки колонок – включение оптимизации:

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

За обработку событий дерева отвечает класс cl_salv_events_tree. Для дерева можно обработать следующие события:

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

Пример обработки этих событий можно посмотреть в стандартной программе  — SALV_DEMO_TREE_EVENTS.

Настройка ячеек узла

Для настройки ячеек в узле используется класс cl_salv_item. С помощью него можно определить стиль ячейки, вид (кнопка, ссылка и т.п.), возможность редактирования, если тип – галочка (checkbox). Получить экземпляр класса для конкретной ячейки можно из узла, с помощью метода get_item( ‘ИмяЯчейки’). Ниже пример измененного метода настройки иерархии:

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

Напоследок исходный код программы целиком, c примером обработки событий и обхода дочерних узлов:

  • eugene

    Вылетает в дамп

    • Leo

      Видимо только у Вас

  • Cerber

    Добрый день. Подскажите, а можно ли сделать, что бы дочерняя структура отличалась от родительской? и можно ли сделать иерархию для нескольких полей, Допустим родительская структура имеет поля ID, Объекты и Участники, и при нажатии на Объекты появлялась иерархия с объектами, а на участники с участниками, спасибо.

    • Astrafox

      Можно попробовать сделать hotspot элементы, при нажатии на которые заменять данные относительно того на что было нажато, но это потребует дополнительной сложности при разработке (динамически обновлять данные, нечто похожее сделано в теме «ненормальное программирование», если конечно я вас правильно понял)

  • jack

    есть возможность обработки события на нажатие по узлу: родительскому и дочернему?….
    надо переход в транзакцию сделать именно при нажатии по узлу….и я так понял…событие LINK_CLICK работает только с ячейками

  • Alexandr Zhuravlev

    DOUBLE_CLICK не отрабатывает если в ячейке нет значения. Не сталкивались?

    • Astrafox

      Добрый день! Увы нет.

  • Михаил Разговоров

    не подскажите как обойти проблему — если для узла сделать
    ls_item_layout-class = cl_gui_column_tree=>item_class_checkbox.

    то не получается отловить двойной клик на узле.

    может можно как то сделать чтобы поле иерархии было не первым в списке.
    вообще задача и отметить строку узела и по двойному клику на ней показать экран

    • К сожалению не сталкивался.

  • Игорь Малязин

    Добрый день. не подскажете, естит ли параметр, чтобы грид выводился сразу с развернутой структурой?

    • Посмотрите в сторону: CL_SALV_NODES->EXPAND_ALL

  • maksim2050

    Для кнопки суммирования отлично работает функция — &CALC_SUM. Не работает кнопка установки фильтра , какую функцию надо подставить ?