Текущее время: Пт, июл 21 2017, 10:47

Часовой пояс: UTC + 4 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Пн, ноя 21 2016, 19:06 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
Коллеги, доброго времени суток.

Экран поделен на две части - слева дерево, справа грид. В дереве выводятся заголовки, а в гриде подробная инфа по ним. Соотношение один к одному.
Соответственно при раскрытии или сворачивании ветки в дереве нужно перерисовывать грид (добавлять/удалять строки).
Пока нашел только событие раскрытия пустой ветки.
Есть ли возможность перехватить раскрытия/сворачивания непустых веток?

Использую cl_salv_tree. Но это не критично, могу заменить на другой инструмент.

Если такой возможности нет, то наверное придется использовать только дерево, и всю инфу выводить в нем. Но будут ли работать все функции грида? Например фильтр, суммирование и т.д.?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Пт, ноя 25 2016, 11:07 
Ассистент
Ассистент

Зарегистрирован:
Пн, дек 02 2013, 10:42
Сообщения: 33
its_andrusha писал(а):
Соотношение один к одному.
а почему не писать строку сразу(как в примере программа - SALV_DEMO_TREE_SIMPLE) , зачем нужно ALV? как


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Вс, дек 04 2016, 18:38 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
Так и сделал, но работает очень медленно из-за большого количества столбцов.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Ср, дек 14 2016, 17:13 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
Проблема в быстродействии осталась, и она критична.

Причем, как я заметил, дерево тормозит именно в момент добавления новых узлов. Я их добавляю по событию разворачивания вышестоящего узла (по другому никак - иерархия очень глубокая).

Например 10 узлов добавляются секунд 5(!!).

Думаю, проблема в том, что дерево перерисовывается после каждого вызова метода ADD_NODE(). Но способа это исправить не нашел =(

Кто-нибудь сталкивался с подобным? Может, лучше всё-таки использовать класс CL_GUI_ALV_TREE?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Чт, дек 15 2016, 00:34 
Специалист
Специалист

Зарегистрирован:
Чт, май 12 2011, 17:06
Сообщения: 220
По мотивам личного опыта. cl_salv_tree имеет смысл использовать, если дерево нужно только просто для отображения данных иерархической структуры. При разворачивании дерева или при изменении иерархии узлов внутри этого класса происходят какие-то подозрительно излишние обновления фронтэнда. Если дерево должно быть интерактивным, предпочтительнее использование cl_gui_alv_tree. Но это имхо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Чт, дек 15 2016, 00:36 
Специалист
Специалист

Зарегистрирован:
Чт, май 12 2011, 17:06
Сообщения: 220
И вообще. SALV-классы (и для грида, и для дерева) делали какие-то вредители.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Чт, дек 15 2016, 08:45 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 74
its_andrusha писал(а):
Проблема в быстродействии осталась, и она критична.

Причем, как я заметил, дерево тормозит именно в момент добавления новых узлов. Я их добавляю по событию разворачивания вышестоящего узла (по другому никак - иерархия очень глубокая).

Например 10 узлов добавляются секунд 5(!!).

Думаю, проблема в том, что дерево перерисовывается после каждого вызова метода ADD_NODE(). Но способа это исправить не нашел =(

Кто-нибудь сталкивался с подобным? Может, лучше всё-таки использовать класс CL_GUI_ALV_TREE?


Тормозит именно добавление узлов или выборка данных для этих узлов? У меня есть большое дерево и тоже добавляю узлы при разворачивании, но все работает очень быстро. К моменту работы все данные лежат во внутренней таблице, поэтому нет никаких селектов. Да, программа в таком варианте жрет больше памяти. Зато работает быстрее.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Пт, дек 16 2016, 11:53 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
LAT писал(а):
И вообще. SALV-классы (и для грида, и для дерева) делали какие-то вредители.


Я тоже так думаю, но почему-то в нашей компании есть требование использовать именно их =(


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Пт, дек 16 2016, 11:55 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
Sam Stone писал(а):
Тормозит именно добавление узлов или выборка данных для этих узлов? У меня есть большое дерево и тоже добавляю узлы при разворачивании, но все работает очень быстро. К моменту работы все данные лежат во внутренней таблице, поэтому нет никаких селектов. Да, программа в таком варианте жрет больше памяти. Зато работает быстрее.


Да, смотрел в анализе производительности - 90% времени отрисовка дерева...

Можно увидеть ваш код создания дерева, добавления узла?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки
СообщениеДобавлено: Пт, дек 16 2016, 12:55 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 74
its_andrusha писал(а):
Да, смотрел в анализе производительности - 90% времени отрисовка дерева...

Можно увидеть ваш код создания дерева, добавления узла?

В создании ничего волшебного (скрытие лишних столбцов и установку обработчиков событий опустил)
Код:
    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
    ).


Потом делаю первый уровень дерева
Код:
  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.

Потом при разворачивании добавляю узлы
Код:
  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.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: cl_salv_tree событие сворачивания ветки  Тема решена
СообщениеДобавлено: Вт, май 02 2017, 19:36 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, май 23 2012, 15:38
Сообщения: 30
Пол: Мужской
События разворачивания узла увы нет ни в одном инструменте.

Переход на CL_GUI_ALV_TREE и отключение опции автоподбора ширины на порядок увеличило быстродействие.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: sonics и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB