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

Часовой пояс: 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 часа


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

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


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

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