class CL_SALV_TREE 的方法 SET_DATA_ROW 中是否存在错误?

Is there a bug in method SET_DATA_ROW of class CL_SALV_TREE?

我使用分层 SALV (class CL_SALV_TREE) 发现了一些非常奇怪的行为。

如果我在创建节点实例后直接使用 set_data_row 方法,那么我会收到正确的层次结构。

REPORT zzy.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main
        RAISING cx_salv_msg cx_salv_error.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    DATA: lt_data TYPE STANDARD TABLE OF t000.
    cl_salv_tree=>factory(
      IMPORTING
        r_salv_tree = DATA(lo_salv_tree)
      CHANGING
        t_table = lt_data
    ).

    DATA(lo_tree_settings) = lo_salv_tree->get_tree_settings( ).
    lo_tree_settings->set_hierarchy_header( `Hierarchy` ).
    lo_tree_settings->set_hierarchy_size( 30 ).

    DATA(lo_nodes) = lo_salv_tree->get_nodes( ).
    DATA(lo_root_node) = lo_nodes->add_node(
      related_node = space
      relationship = if_salv_c_node_relation=>last_child
      data_row = VALUE t000( mandt = '100' )
      collapsed_icon = '@3S\QStatus: Collapsed@'
      expanded_icon = '@3T\QStatus: Expanded@'
      row_style = if_salv_c_tree_style=>emphasized_positive
      text = '100'
    ).
    lo_root_node->set_data_row( VALUE t000( mandt = '100' ) ).
    lo_root_node->get_hierarchy_item( )->set_icon( '@0V\QOK@' ).

    DATA(lo_node1) = lo_nodes->add_node(
      related_node = lo_root_node->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '200'
    ).
    lo_node1->set_data_row( VALUE t000( mandt = '200' ) ).
    DATA(lo_node2) = lo_nodes->add_node(
      related_node = lo_node1->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '300'
    ).
    lo_node2->set_data_row( VALUE t000( mandt = '300' ) ).

    DATA(lo_node3) = lo_nodes->add_node(
      related_node = lo_node2->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '400'
    ).
    lo_node3->set_data_row( VALUE t000( mandt = '400' ) ).

    lo_salv_tree->display( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY .
    lcl_main=>main( ).
  CATCH cx_salv_msg cx_salv_error.
    ASSERT 0 = 1.
  ENDTRY.

但是,如果我在 main 方法的末尾使用 set_data_row 方法,那么结果完全出乎意料。

REPORT zzy.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main
        RAISING cx_salv_msg cx_salv_error.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
    DATA: lt_data TYPE STANDARD TABLE OF t000.
    cl_salv_tree=>factory(
      IMPORTING
        r_salv_tree = DATA(lo_salv_tree)
      CHANGING
        t_table = lt_data
    ).

    DATA(lo_tree_settings) = lo_salv_tree->get_tree_settings( ).
    lo_tree_settings->set_hierarchy_header( `Hierarchy` ).
    lo_tree_settings->set_hierarchy_size( 30 ).

    DATA(lo_nodes) = lo_salv_tree->get_nodes( ).
    DATA(lo_root_node) = lo_nodes->add_node(
      related_node = space
      relationship = if_salv_c_node_relation=>last_child
      data_row = VALUE t000( mandt = '100' )
      collapsed_icon = '@3S\QStatus: Collapsed@'
      expanded_icon = '@3T\QStatus: Expanded@'
      row_style = if_salv_c_tree_style=>emphasized_positive
      text = '100'
    ).
    lo_root_node->get_hierarchy_item( )->set_icon( '@0V\QOK@' ).

    DATA(lo_node1) = lo_nodes->add_node(
      related_node = lo_root_node->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '200'
    ).

    DATA(lo_node2) = lo_nodes->add_node(
      related_node = lo_node1->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '300'
    ).

    DATA(lo_node3) = lo_nodes->add_node(
      related_node = lo_node2->get_key( )
      relationship = cl_gui_column_tree=>relat_last_child
      text = '400'
    ).

    lo_root_node->set_data_row( VALUE t000( mandt = '100' ) ).
    lo_node1->set_data_row( VALUE t000( mandt = '200' ) ).
    lo_node2->set_data_row( VALUE t000( mandt = '300' ) ).
    lo_node3->set_data_row( VALUE t000( mandt = '400' ) ).

    lo_salv_tree->display( ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  TRY .
    lcl_main=>main( ).
  CATCH cx_salv_msg cx_salv_error.
    ASSERT 0 = 1.
  ENDTRY.

这是此组件中的错误吗?我找不到任何可以解释这种奇怪行为的文档。

通过调用 set_data_row 方法,您将覆盖所有原始数据,包括子关系。

在第一个示例中,您总是先设置 mandt,然后再添加节点。如果你反过来做,你也会得到 'one level deep' 树。