Стандартная панель инструментов исчезает после применения пользовательской

У меня есть сетка ALV в модальном диалоговом окне, которая выглядит следующим образом:

введите здесь описание изображения

Я попытался добавить панель инструментов в ALV следующим образом:

Класс события:

CLASS lcl_evt_task_user_cmd IMPLEMENTATION.
  METHOD handle_toolbar.
    e_object->mt_toolbar = VALUE ttb_button(
                           ( butn_type = 3 )
                           ( function = 'EDIT' icon = icon_edit_file butn_type = 0 )
                           ).
  ENDMETHOD.
  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'EDIT'.
    ENDCASE.
*    cl_gui_cfw=>set_new_ok_code('DUMMY').
  ENDMETHOD.
ENDCLASS. 

и способ, как я регистрирую панель инструментов:

METHOD show.
    FIELD-SYMBOLS <lt_table> TYPE STANDARD TABLE.
    IF c_go_provider->c_go_grid IS INITIAL.
      DATA(lt_fieldcat) = me->get_fieldcat( c_go_provider->c_gv_struname ).
      c_go_provider->c_go_container = NEW cl_gui_custom_container( container_name = co_grid_name ).
      c_go_provider->c_go_grid = NEW cl_gui_alv_grid( i_parent = c_go_provider->c_go_container ).
      ASSIGN c_go_provider->c_gt_data->* TO <lt_table>.
      me->register_event( ).
      c_go_provider->c_go_grid->set_table_for_first_display(
       EXPORTING
          is_variant = VALUE disvariant( report = sy-repid )
          i_save = 'A'
          is_layout = VALUE lvc_s_layo( sel_mode = 'A' )
        CHANGING
          it_outtab = <lt_table>
          it_fieldcatalog = lt_fieldcat
       ).
      c_go_provider->c_go_grid->set_toolbar_interactive( ).
    ENDIF.
    c_go_provider->c_go_grid->refresh_table_display( ).
  ENDMETHOD.
  METHOD register_event.
    me->c_go_event = NEW lcl_evt_task_user_cmd( ).
    SET HANDLER  me->c_go_event->handle_toolbar
                 me->c_go_event->handle_user_command
        FOR  c_go_provider->c_go_grid.
  ENDMETHOD.

После этого стандартная панель инструментов исчезла:

введите здесь описание изображения

Что я делаю не так?


person softshipper    schedule 08.01.2019    source источник
comment
Код ABAP e_object-›mt_toolbar = ЗНАЧЕНИЕ ttb_button( ( butn_type = 3 ) ( function = 'EDIT' icon = icon_edit_file butn_type = 0 ) ). не является правильным.   -  person Umar Abdullah    schedule 09.01.2019
comment
Ключевое слово значения удаляет существующие элементы панели инструментов, а затем вставляет новый элемент. Если вы не хотите удалять существующие элементы с панели инструментов, вам необходимо использовать базовое ключевое слово значения.   -  person Umar Abdullah    schedule 09.01.2019
comment
Вопрос также задан в SCN: answers.sap.com/questions/722700/   -  person Sandra Rossi    schedule 09.01.2019


Ответы (1)


Вы использовали оператор значения с внутренней таблицей. Он сначала удаляет существующее содержимое внутренней таблицы, а затем добавляет новое содержимое. По этой причине существующие элементы панели инструментов не отображаются. У меня есть следующие два решения, чтобы решить проблему.

Решение 1.

Замените следующий код.

   e_object->mt_toolbar = VALUE ttb_button(
                           ( butn_type = 3 )
                           ( function = 'EDIT' icon = icon_edit_file butn_type = 0 )
                           ).

С помощью приведенного ниже кода новый элемент панели инструментов будет добавлен на панель инструментов. Это поможет вам обновить логику в соответствии с вашими требованиями.

DATA: l_toolbar LIKE LINE OF e_object->mt_toolbar.

  l_toolbar-function   = 'EDIT'.
  l_toolbar-icon       = icon_edit_file.
  l_toolbar-quickinfo  = 'Custom Edit'.
  l_toolbar-disabled   = space.
  l_toolbar-butn_type = 0.

  APPEND l_toolbar TO e_object->mt_toolbar.

Вы также можете обновить существующий код, добавив ключевое слово BASE в значение.

Решение 2.

Вы можете использовать тот же оператор значения с добавлением BASE. Когда вы используете BASE с оператором VALUE, он сохраняет существующее содержимое и добавляет новое содержимое с правой стороны оператора.

Ниже приведен код ABAP, использующий оператор **VALUE с добавлением BASE. Элементы панели инструментов не будут удалены.**

e_object->mt_toolbar = VALUE ttb_button( BASE e_object->mt_toolbar
                       ( function = 'EDIT' icon = icon_edit_file butn_type = 0 )
                       ).
person Umar Abdullah    schedule 09.01.2019
comment
мы можем вывести решение, только прочитав ваш код, вам лучше указать причину проблемы явно, например: вся панель инструментов (т.е. все кнопки) передается в событие TOOLBAR, поэтому, если вы просто хотите добавить одну кнопку, вы не должны заменять всю панель инструментов своей кнопкой, а вместо этого добавлять кнопку. - person Sandra Rossi; 09.01.2019
comment
@SandraRossi: я также обновил ответ с объяснением. - person Umar Abdullah; 09.01.2019