Текущее время: Ср, июл 23 2025, 14:00

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Получение выделенных узлов в дереве CL_SALV_TREE
СообщениеДобавлено: Пн, июл 02 2012, 12:03 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Всем добрый день! Может все просто, но что-то никак не получается. Дерево построено на классе cl_salv_tree. Хочу получить выделенные строки...
Code:
  DATA:
    lo_selections TYPE REF TO cl_salv_selections_tree,
    lt_nodes       TYPE salv_t_nodes.

  lo_selections = go_alv_tree->get_selections( ).
  lt_nodes = lo_selections->get_selected_nodes( ).


В первый раз когда вызывается - все ок, в lt_nodes складываются выделенные строки... А второй выделяешь другие узлы - в lt_nodes тоже самое, что отобралось в первый раз, короче всегда то что отобралось в первый раз)... А причина в том, что в методе GET_SELECTED_NODES после первого выполнения
в private-атрибут node_rec записывается X... И второй раз выделенные строки тупо не отбираются... Хелпа по SALV нормального не нашел, поэтому прошу помочь - как правильно получать выделенные строки? И зачем этот долбанный крыжик node_rec придуман? Если в отладке его очистить - то все ок, отбирается так как надо.... И как поменять для SALV selection_mode не пойму...
Code:
method GET_SELECTED_NODES .

if node_rec = abap_false.
   data: tree_adapter type ref to cl_salv_tree_adapter_base.
   tree_adapter ?= me->r_tree_controller->r_adapter.
   cl_salv_controller_metadata=>get_tree_selected_nodes(
        r_adapter     = tree_adapter
        r_selections  = me ).
   node_rec = abap_true.
endif.

  value = me->t_selected_nodes.
endmethod.


На всякий случай, дерево создаю так:
Code:
  METHOD create_tree.
    TRY.
        cl_salv_tree=>factory(
          EXPORTING
            r_container = go_splitter_1->top_left_container
          IMPORTING
            r_salv_tree = go_alv_tree
          CHANGING
            t_table     = gt_tree ).
      CATCH cx_salv_error.
        MESSAGE e151(ZMSG).
    ENDTRY.
  ENDMETHOD.                    "create_tree


Последний раз редактировалось lestat Вт, июл 03 2012, 10:27, всего редактировалось 2 раз(а).

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

Зарегистрирован:
Ср, янв 18 2012, 16:49
Сообщения: 30
Пол: Мужской
Скорее всего узлы не верно заполняете (присвоение ключей) покажите эту часть.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Получение выделенных узлов в дереве CL_SALV_TREE
СообщениеДобавлено: Пн, июл 02 2012, 16:41 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Code:
METHOD create_nodes.
    DATA:
     lo_nodes         TYPE REF TO cl_salv_nodes,
     lo_node          TYPE REF TO cl_salv_node,
     lv_carrid_key    TYPE lvc_nkey,
     lo_settings      TYPE REF TO cl_salv_tree_settings,
     lv_carrid        TYPE spfli-carrid,
     lt_projects      TYPE TABLE OF PROJ,
     lt_prhi          TYPE TABLE OF PRHI,
     ls_key           LIKE LINE OF gt_keys,
     lv_hier_icon     TYPE SALV_DE_TREE_IMAGE,
     ls_prhi          TYPE PRHI.

    FIELD-SYMBOLS:
      <fs_proj> TYPE PROJ,
      <fs_prhi> TYPE PRHI.

    lv_hier_icon = icon_tree.

    lo_settings = go_alv_tree->get_tree_settings( ).
    lo_settings->set_hierarchy_header( 'СПП-Элемент' ).
    lo_settings->set_hierarchy_size( 40 ).
    lo_settings->set_hierarchy_icon( lv_hier_icon ).

    "Получаем ссылку на экземпляр класса упрвления узлами дерева
    lo_nodes = go_alv_tree->get_nodes( ).

    SELECT * FROM PROJ
      INTO CORRESPONDING FIELDS OF TABLE lt_projects
      WHERE pspnr IN so_pspnr.

    CLEAR gt_keys[].

    LOOP AT lt_projects ASSIGNING <fs_proj>.

      PERFORM get_hierarchy TABLES lt_prhi
                            USING  <fs_proj>-pspnr.

      SORT lt_prhi ASCENDING BY posnr up.
      LOOP AT lt_prhi ASSIGNING <fs_prhi>.

        READ TABLE gt_keys WITH KEY posnr = <fs_prhi>-up INTO ls_key.

        IF sy-subrc = 0.
          PERFORM add_node USING ls_key-key
                                 <fs_prhi>-posnr.
        ELSEIF <fs_prhi>-up IS NOT INITIAL.
          "Вышестоящий элемент еще не добавлен в дерево
          READ TABLE lt_prhi WITH KEY posnr = <fs_prhi>-up INTO ls_prhi.
          IF sy-subrc = 0.
            READ TABLE gt_keys WITH KEY posnr = ls_prhi-up INTO ls_key.
            IF sy-subrc = 0.
              PERFORM add_node USING ls_key-key
                                     ls_prhi-posnr.
              READ TABLE gt_keys WITH KEY posnr = <fs_prhi>-up INTO ls_key.
              IF sy-subrc = 0.
                PERFORM add_node USING ls_key-key
                                   <fs_prhi>-posnr.
                DELETE lt_prhi WHERE posnr = <fs_prhi>-up.
              ENDIF.
            ENDIF.
          ENDIF.
        ELSE.
          "Строка является верхним уровнем
          PERFORM add_node USING ''
                                 <fs_prhi>-posnr.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  ENDMETHOD.                    "create_nodes


Code:
FORM ADD_NODE  USING iv_key   TYPE LVC_NKEY
                     iv_posnr TYPE PRHI-posnr.

  DATA:
    lo_nodes         TYPE REF TO cl_salv_nodes,
    lo_node          TYPE REF TO cl_salv_node,
    lv_carrid_key    TYPE lvc_nkey,
    ls_key           LIKE LINE OF gt_keys,
    ls_line          TYPE t_tree_projects,
    lv_text          TYPE LVC_VALUE,
    lv_expand_icon   TYPE SALV_DE_TREE_IMAGE,
    lv_collapse_icon TYPE SALV_DE_TREE_IMAGE.

  lv_expand_icon = icon_expand.
  lv_collapse_icon = icon_collapse.

  CLEAR ls_line.
  PERFORM prepare_hierarchy_line USING iv_posnr
                                 CHANGING lv_text ls_line-post1.
  APPEND ls_line TO gt_tree.

  "Получаем ссылку на экземпляр класса упрвления узлами дерева
  lo_nodes = go_alv_tree->get_nodes( ).

  TRY.
      lo_node = lo_nodes->add_node(
                                  related_node   = iv_key
                                  relationship   = cl_gui_column_tree=>relat_last_child
                                  data_row       = ls_line
                                  collapsed_icon = lv_expand_icon
                                  expanded_icon  = lv_collapse_icon
                                  row_style      = IF_SALV_C_TREE_STYLE=>emphasized_a
                                  text           = lv_text ).
      lv_carrid_key = lo_node->get_key( ).
      ls_key-posnr = iv_posnr.
      ls_key-key   = lv_carrid_key.
      APPEND ls_key TO gt_keys.
    CATCH cx_salv_msg.
  ENDTRY.
ENDFORM.                    " ADD_NODE


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Получение выделенных узлов в дереве CL_SALV_TREE
СообщениеДобавлено: Вт, июл 03 2012, 09:44 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, янв 30 2007, 10:59
Сообщения: 61
Если бы узлы неверно были заполнены, то скорее всего программа выдала бы ошибку.
Может быть нужно перед каждым вызовом lt_nodes = lo_selections->get_selected_nodes( ) выполнять lo_selections = go_alv_tree->get_selections( )?

_________________
Блаженны прыгающие, ибо они допрыгаются.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Получение выделенных узлов в дереве CL_SALV_TREE
СообщениеДобавлено: Вт, июл 03 2012, 10:17 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
SMak написал(а):
Если бы узлы неверно были заполнены, то скорее всего программа выдала бы ошибку.
Может быть нужно перед каждым вызовом lt_nodes = lo_selections->get_selected_nodes( ) выполнять lo_selections = go_alv_tree->get_selections( )?


Так именно так я и делаю.... (см.1-е сообщение)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Получение выделенных узлов в дереве CL_SALV_TREE
СообщениеДобавлено: Вт, июл 03 2012, 10:56 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Цитата:
А причина в том, что в методе GET_SELECTED_NODES после первого выполнения
в private-атрибут node_rec записывается X... И второй раз выделенные строки тупо не отбираются..


Помогает двойной щелчок мышью... Если два раза клацнуть в дереве, потом опять выбрать узлы - в lt_nodes опять попадает то что нужно... И содержимое lt_nodes не изменяется пока опять даблклик не сделать... Что за хрень?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Получение выделенных узлов в дереве CL_SALV_TREE  Тема решена
СообщениеДобавлено: Вт, июл 03 2012, 11:12 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Всем спасибо за участие, всем спасибо! :) Разобрался!

Нужно в PAI-логике вызывать метод GET_METADATA для объекта дерева, т.е.
Code:
CALL METHOD go_alv_tree->get_metadata.


ТЕМА ЗАКРЫТА.


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

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


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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