2016-04-27 25 views
4

CL_SALV_TREEのインスタンスにユーザ定義関数を追加することはできますか?このインスタンスが使用されているレポートにGUIステータスをコピーする必要はありませんか?GUIステータスをコピーせずにCL_SALV_TREEにユーザ定義関数を追加することはできますか?

私がしようとしているのは、add_functionメソッドでカスタム関数を追加することです。

REPORT zzy. 

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

CLASS lcl_main IMPLEMENTATION. 
    METHOD main. 
    DATA: lt_table TYPE STANDARD TABLE OF t000. 
    TRY . 
     cl_salv_tree=>factory(
     IMPORTING 
      r_salv_tree = DATA(lo_salv_tree) 
     CHANGING 
      t_table = lt_table 
    ). 
     DATA(lo_salv_functions) = lo_salv_tree->get_functions(). 
     lo_salv_functions->add_function(
     name = 'EXPORT_TO_EXCEL' 
     icon = '@[email protected]' 
     tooltip = 'Export as Excel' 
     position = if_salv_c_function_position=>right_of_salv_functions 
    ). 
     lo_salv_functions->set_all(abap_true). 

     lo_salv_tree->display(). 
    CATCH cx_salv_error. 
     ASSERT 0 = 1. 
    ENDTRY. 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

ただし、ボタンは表示されません。

No button

私はCL_SALV_TABLEでいくつかの時間前にそれを実行しようとしましたとadd_functionを使用しているとき、私は明示的に例外を得たことを覚えておいてください。

私が戻ってきたのは、

REPORT zzy. 

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

CLASS lcl_main IMPLEMENTATION. 
    METHOD main. 
    DATA: lt_table TYPE STANDARD TABLE OF t000. 
    TRY . 
     cl_salv_table=>factory(
     IMPORTING 
      r_salv_table = DATA(lo_salv_table) 
     CHANGING 
      t_table = lt_table 
    ). 
     DATA(lo_salv_functions) = lo_salv_table->get_functions(). 
     lo_salv_functions->add_function(
     name = 'EXPORT_TO_EXCEL' 
     icon = '@[email protected]' 
     tooltip = 'Export as Excel file' 
     position = if_salv_c_function_position=>right_of_salv_functions 
    ). 
     lo_salv_functions->set_all(abap_true). 

     lo_salv_table->display(). 
    CATCH cx_salv_error. 
     ASSERT 0 = 1. 
    ENDTRY. 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

それは処理されない例外CX_SALV_METHOD_NOT_SUPPORTEDによって引き起こさダンプ短いで終わります。私はSAP標準コードで参照することは、1つは、オブジェクトIF_SALV_C_TABLE_OBJECTS=>TREEためadd_function方法で新しい機能を追加することが可能であると仮定でき、コードのこの部分から

if lr_controller->r_model->get_display_object() 
         ne IF_SALV_C_TABLE_OBJECTS=>GRID 
    and lr_controller->r_model->get_display_object() 
         ne IF_SALV_C_TABLE_OBJECTS=>TREE. 
    text = text-001. 
    l_name = name. 
    raise exception type CX_SALV_METHOD_NOT_SUPPORTED 
     exporting class = 'CL_SALV_FUNCTIONS' 
       method = 'ENABLE_FUNCTION' 
       object = l_name 
       key = text. 
endif. 

です。

これまでのところ、次の回避策を使用しました。

REPORT zzy. 

CLASS lcl_controller DEFINITION FINAL. 
    PUBLIC SECTION. 
    INTERFACES: 
     if_salv_csqt_content_manager. 
    METHODS: 
     constructor. 
    DATA: 
     mo_salv_tree TYPE REF TO cl_salv_tree, 
     mt_table TYPE STANDARD TABLE OF t000. 
ENDCLASS. 

CLASS lcl_controller IMPLEMENTATION. 
    METHOD constructor. 
    CALL FUNCTION 'SALV_CSQT_CREATE_CONTAINER' 
     EXPORTING 
     r_content_manager  = me 
     title     = 'Workaround'. 
    ENDMETHOD. 

    METHOD if_salv_csqt_content_manager~fill_container_content. 
    TRY . 
     cl_salv_tree=>factory(
     EXPORTING 
      r_container = r_container 
     IMPORTING 
      r_salv_tree = DATA(mo_salv_tree) 
     CHANGING 
      t_table = mt_table 
    ). 
     DATA(lo_tree_settings) = mo_salv_tree->get_tree_settings(). 
     lo_tree_settings->set_hierarchy_header(`Hierarchy`). 
     lo_tree_settings->set_hierarchy_size(30). 
     lo_tree_settings->set_header(|{ sy-title }|). 

     DATA(lo_salv_functions) = mo_salv_tree->get_functions(). 
     lo_salv_functions->add_function(
     name = 'EXPORT_TO_EXCEL' 
     icon = '@[email protected]' 
     tooltip = 'Export as Excel file' 
     position = if_salv_c_function_position=>right_of_salv_functions 
    ). 
     lo_salv_functions->set_all(abap_true). 

     DATA(lo_salv_nodes) = mo_salv_tree->get_nodes(). 
     DATA(lo_root) = lo_salv_nodes->add_node(
     related_node = space 
     relationship = if_salv_c_node_relation=>last_child 
     data_row = VALUE t000(mandt = '100') 
     text = `Test` 
    ). 

     lo_salv_nodes->add_node(
     related_node = lo_root->get_key() 
     relationship = cl_gui_column_tree=>relat_last_child 
     data_row = VALUE t000(mandt = '200') 
     text = `Test2` 
    ). 

     mo_salv_tree->display(). 
    CATCH cx_salv_error. 
     ASSERT 0 = 1. 
    ENDTRY. 
    ENDMETHOD. 
ENDCLASS. 

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

CLASS lcl_main IMPLEMENTATION. 
    METHOD main. 
    DATA(lo_controller) = NEW lcl_controller(). 
    ENDMETHOD. 
ENDCLASS. 

START-OF-SELECTION. 
    lcl_main=>main(). 

残念ながら、ボタンは直接、ツリーの前ではなく、ステータスバーに、別の場所でそのような場合に表示されます。

Buttons not in the status bar

答えて

2

短い答えは - いいえ、あなたは、あなたがGUIステータス(CUAD)を必要とすることはできません。実行時に関数を隠すことはできますが、実行時に新しい関数を追加することはできません。

関連する問題