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

Jag*_*ger 5 sap abap

我发现了使用分层SALV(类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.
Run Code Online (Sandbox Code Playgroud)

正确的等级

但是,如果set_data_row在方法末尾使用method main,则结果完全出乎意料。

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.
Run Code Online (Sandbox Code Playgroud)

等级不正确

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

小智 4

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

在第一个示例中,您始终先设置mandt,然后再添加节点。如果你反过来做,你也会得到“一层深”的树。