Работа с 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 примером обработки событий и обхода дочерних узлов:

13 комментариев

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *