CL_SALV_TREE
このインスタンスが使用されているレポートに GUI ステータスをコピーせずに、 のインスタンスにユーザー定義関数を追加することはできますか?
私がやろうとしているのは、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 = '@J2@'
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( ).
ただし、ボタンは表示されません。
少し前に でやろうとしたのを覚えていますが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 = '@J2@'
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 標準コードに表示されるのは
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.
このコード片からadd_function
、 object の method を持つ新しい関数を追加できると推測できますIF_SALV_C_TABLE_OBJECTS=>TREE
。
これまでのところ、次の回避策を使用しました。
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 = '@J2@'
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( ).
残念ながら、このような場合、ボタンはステータス バーではなく、ツリーの直前の別の場所に表示されます。