SAPфорум.RU https://sapboard.ru/forum/ |
|
cl_salv_tree событие сворачивания ветки https://sapboard.ru/forum/viewtopic.php?f=13&t=94068 |
Страница 1 из 1 |
Автор: | its_andrusha [ Пн, ноя 21 2016, 18:06 ] |
Заголовок сообщения: | cl_salv_tree событие сворачивания ветки |
Коллеги, доброго времени суток. Экран поделен на две части - слева дерево, справа грид. В дереве выводятся заголовки, а в гриде подробная инфа по ним. Соотношение один к одному. Соответственно при раскрытии или сворачивании ветки в дереве нужно перерисовывать грид (добавлять/удалять строки). Пока нашел только событие раскрытия пустой ветки. Есть ли возможность перехватить раскрытия/сворачивания непустых веток? Использую cl_salv_tree. Но это не критично, могу заменить на другой инструмент. Если такой возможности нет, то наверное придется использовать только дерево, и всю инфу выводить в нем. Но будут ли работать все функции грида? Например фильтр, суммирование и т.д.? |
Автор: | Igor_34_rus [ Пт, ноя 25 2016, 10:07 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
its_andrusha написал: Соотношение один к одному. а почему не писать строку сразу(как в примере программа - SALV_DEMO_TREE_SIMPLE) , зачем нужно ALV? как
|
Автор: | its_andrusha [ Вс, дек 04 2016, 17:38 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
Так и сделал, но работает очень медленно из-за большого количества столбцов. |
Автор: | its_andrusha [ Ср, дек 14 2016, 16:13 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
Проблема в быстродействии осталась, и она критична. Причем, как я заметил, дерево тормозит именно в момент добавления новых узлов. Я их добавляю по событию разворачивания вышестоящего узла (по другому никак - иерархия очень глубокая). Например 10 узлов добавляются секунд 5(!!). Думаю, проблема в том, что дерево перерисовывается после каждого вызова метода ADD_NODE(). Но способа это исправить не нашел =( Кто-нибудь сталкивался с подобным? Может, лучше всё-таки использовать класс CL_GUI_ALV_TREE? |
Автор: | LAT [ Ср, дек 14 2016, 23:34 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
По мотивам личного опыта. cl_salv_tree имеет смысл использовать, если дерево нужно только просто для отображения данных иерархической структуры. При разворачивании дерева или при изменении иерархии узлов внутри этого класса происходят какие-то подозрительно излишние обновления фронтэнда. Если дерево должно быть интерактивным, предпочтительнее использование cl_gui_alv_tree. Но это имхо. |
Автор: | LAT [ Ср, дек 14 2016, 23:36 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
И вообще. SALV-классы (и для грида, и для дерева) делали какие-то вредители. |
Автор: | Sam Stone [ Чт, дек 15 2016, 07:45 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
its_andrusha написал: Проблема в быстродействии осталась, и она критична. Причем, как я заметил, дерево тормозит именно в момент добавления новых узлов. Я их добавляю по событию разворачивания вышестоящего узла (по другому никак - иерархия очень глубокая). Например 10 узлов добавляются секунд 5(!!). Думаю, проблема в том, что дерево перерисовывается после каждого вызова метода ADD_NODE(). Но способа это исправить не нашел =( Кто-нибудь сталкивался с подобным? Может, лучше всё-таки использовать класс CL_GUI_ALV_TREE? Тормозит именно добавление узлов или выборка данных для этих узлов? У меня есть большое дерево и тоже добавляю узлы при разворачивании, но все работает очень быстро. К моменту работы все данные лежат во внутренней таблице, поэтому нет никаких селектов. Да, программа в таком варианте жрет больше памяти. Зато работает быстрее. |
Автор: | its_andrusha [ Пт, дек 16 2016, 10:53 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
LAT написал(а): И вообще. SALV-классы (и для грида, и для дерева) делали какие-то вредители. Я тоже так думаю, но почему-то в нашей компании есть требование использовать именно их =( |
Автор: | its_andrusha [ Пт, дек 16 2016, 10:55 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
Sam Stone написал(а): Тормозит именно добавление узлов или выборка данных для этих узлов? У меня есть большое дерево и тоже добавляю узлы при разворачивании, но все работает очень быстро. К моменту работы все данные лежат во внутренней таблице, поэтому нет никаких селектов. Да, программа в таком варианте жрет больше памяти. Зато работает быстрее. Да, смотрел в анализе производительности - 90% времени отрисовка дерева... Можно увидеть ваш код создания дерева, добавления узла? |
Автор: | Sam Stone [ Пт, дек 16 2016, 11:55 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
its_andrusha написал: Да, смотрел в анализе производительности - 90% времени отрисовка дерева... Можно увидеть ваш код создания дерева, добавления узла? В создании ничего волшебного (скрытие лишних столбцов и установку обработчиков событий опустил) Code: cl_salv_tree=>FACTORY( exporting R_CONTAINER = cont2 " Abstract Container for GUI Controls HIDE_HEADER = abap_true " Do Not Show Header importing R_SALV_TREE = SALV_TREE_FIAS " ALV: Tree Model changing T_TABLE = SALV_TREE_FIAS_DATA ). Потом делаю первый уровень дерева Code: METHOD BUILD_ADDRESS_TREE. SELECT * INTO TABLE @DATA(lt) FROM zfiasaddrobj WHERE aolevel = 1 AND actstatus = 1 AND regioncode in @me->r_regio order by offname. DATA(nodes) = me->SALV_TREE_FIAS->GET_NODES( ). DATA tree_row LIKE LINE OF me->salv_tree_fias_data. LOOP AT lt ASSIGNING FIELD-SYMBOL(<fs>). CLEAR tree_row. MOVE-CORRESPONDING <fs> TO tree_row. DATA(node) = nodes->ADD_NODE( RELATED_NODE = '' RELATIONSHIP = cl_gui_column_tree=>relat_last_child DATA_ROW = tree_row EXPANDER = abap_true FOLDER = abap_true ). ENDLOOP. ENDMETHOD. Потом при разворачивании добавляю узлы Code: METHOD ON_EXPAND_EMPTY_FOLDER.
DATA(node) = me->SALV_TREE_FIAS->GET_NODES( )->GET_NODE( NODE_KEY ). TRY. node->GET_FIRST_CHILD( ). return. CATCH cx_salv_msg. ENDTRY. FIELD-SYMBOLS <table> TYPE STANDARD TABLE. DATA(data_row) = node->GET_DATA_ROW( ). ASSIGN data_row->* TO FIELD-SYMBOL(<data_row>). CHECK sy-subrc = 0. ASSIGN COMPONENT 'AOGUID' OF STRUCTURE <data_row> TO FIELD-SYMBOL(<field>). CHECK <field> IS ASSIGNED. DATA t_addrobj TYPE STANDARD TABLE OF zfiasaddrobj. t_addrobj = FILTER #( me->T_ADDROBJ_CITIES USING KEY key2 WHERE parentguid = <field> ). DATA(t_addrobj2) = FILTER #( me->T_ADDROBJ_STREETS USING KEY key2 WHERE parentguid = <field> ). APPEND LINES OF t_addrobj2 TO t_addrobj. sort t_addrobj by offname. ASSIGN t_addrobj TO <table>. IF sy-subrc <> 0 or lines( t_addrobj ) = 0. DATA t_house TYPE STANDARD TABLE OF zfiashouse. t_house = FILTER #( me->T_HOUSES USING KEY key1 WHERE aoguid = <field> ). sort t_house by housenum buildnum strucnum. ASSIGN t_house TO <table>. ENDIF. IF <table> IS NOT ASSIGNED or lines( <table> ) = 0. node->SET_EXPANDER( abap_false ). RETURN. ELSE. DATA(nodes) = me->SALV_TREE_FIAS->GET_NODES( ). DATA ls like LINE OF me->SALV_TREE_FIAS_DATA. LOOP AT <table> ASSIGNING FIELD-SYMBOL(<line>). CLEAR ls. MOVE-CORRESPONDING <line> TO ls. IF ls-OFFNAME = space. ASSIGN COMPONENT 'FORMALNAME' OF STRUCTURE <line> TO <field>. IF sy-subrc = 0. ls-offname = <field>. ENDIF. ENDIF. node = nodes->ADD_NODE( RELATED_NODE = node_key RELATIONSHIP = cl_gui_column_tree=>relat_last_child DATA_ROW = ls EXPANDER = xsdbool( ls-houseguid = space ) FOLDER = xsdbool( ls-houseguid = space ) ). ENDLOOP. ENDIF. ENDMETHOD. |
Автор: | its_andrusha [ Вт, май 02 2017, 18:36 ] |
Заголовок сообщения: | Re: cl_salv_tree событие сворачивания ветки |
События разворачивания узла увы нет ни в одном инструменте. Переход на CL_GUI_ALV_TREE и отключение опции автоподбора ширины на порядок увеличило быстродействие. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |