2016-04-23 12 views
2

Ich entdeckte einige sehr seltsame Verhalten mit hierarchischen SALV (Klasse CL_SALV_TREE).Gibt es einen Fehler in CL_SALV_TREE?

Wenn ich die set_data_row Methode direkt nach dem Erstellen der Knoteninstanz verwenden, dann erhalte ich die richtige Hierarchie.

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

Allerdings, wenn ich set_data_row Methode am Ende meiner main Methode verwenden, dann ist das Ergebnis völlig unerwartet.

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

Ist das ein Fehler in dieser Komponente? Ich konnte keine Dokumentation finden, die dieses seltsame Verhalten erklären würde.

+1

Ausgezeichnete Art, eine Frage zu stellen und ein reproduzierbares Beispiel zu liefern! – vwegert

+0

In welcher Version laufen Sie? –

+0

@BryanCain SAP_BASIS und SAP_ABA haben die folgende Version: Release 740, SP-Level 0006, Support Package SAPKB74006 bzw. SAPKA74006. – Jagger

Antwort

0

Durch den Aufruf set_data_row Methode überschreiben Sie alle Rohdaten, einschließlich untergeordneten Beziehungen.

Im ersten Beispiel setzen Sie immer zuerst mrtt und fügen Sie Knoten später hinzu. Wenn du es anders herum tun würdest, würdest du auch einen tiefen Baum bekommen.