2016-04-23 6 views
2

階層的なSALV(クラスCL_SALV_TREE)を使って、非常に奇妙な振る舞いを見つけました。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: [email protected]' 
     expanded_icon = '@3T\QStatus: [email protected]' 
     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\[email protected]'). 

    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. 

Correct hierarchy

私は私の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: [email protected]' 
     expanded_icon = '@3T\QStatus: [email protected]' 
     row_style = if_salv_c_tree_style=>emphasized_positive 
     text = '100' 
    ). 
    lo_root_node->get_hierarchy_item()->set_icon('@0V\[email protected]'). 

    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. 

Incorrect hierarchy

これは、このコンポーネントのバグですか?私はこの奇妙な振る舞いを説明する文書を見つけることができませんでした。

+1

質問をして再現可能な例を提供する優れた方法です! – vwegert

+0

あなたはどのバージョンを実行していますか? –

+0

@BryanCain SAP_BASISおよびSAP_ABAは、リリース740、SPレベル0006、サポートパッケージSAPKB74006およびSAPKA74006の各バージョンにあります。 – Jagger

答えて

0

set_data_rowメソッドを呼び出すと、子関係を含むすべての生データが上書きされます。

最初の例では、常にmandtを最初に設定し、後でノードを追加します。あなたはそれを逆にするなら、あなたはまた、「一レベル深い」木を得るだろう。

関連する問題