5

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( ).

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

ステータスバーにないボタン

4

1 に答える 1

3

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

于 2016-04-29T06:48:12.910 に答える