Текущее время: Пт, апр 20 2018, 18:37

Часовой пояс: 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
Сообщения: 247
По мотивам личного опыта. cl_salv_tree имеет смысл использовать, если дерево нужно только просто для отображения данных иерархической структуры. При разворачивании дерева или при изменении иерархии узлов внутри этого класса происходят какие-то подозрительно излишние обновления фронтэнда. Если дерево должно быть интерактивным, предпочтительнее использование cl_gui_alv_tree. Но это имхо.


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

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


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

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 103
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
Сообщения: 103
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.


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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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