Abap 添加用户命令后,工具消失

Abap 添加用户命令后,工具消失,abap,Abap,在模态对话框中有一个ALV网格,如下所示: 我尝试将工具栏添加到ALV,如下所示: 事件类: CLASS lcl_evt_task_user_cmd IMPLEMENTATION. METHOD handle_toolbar. e_object->mt_toolbar = VALUE ttb_button( ( butn_type = 3 ) ( function =

在模态对话框中有一个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.
方法显示。
字段符号类型标准表。
如果c_go_provider->c_go_grid为初始值。
数据(lt_fieldcat)=me->get_fieldcat(c_go_provider->c_gv_struname)。
c_go_提供者->c_go_容器=新的cl_gui_自定义_容器(容器名称=co_网格名称)。
c_go_provider->c_go_grid=NEW cl_gui_alv_grid(i_parent=c_go_provider->c_go_容器)。
将c_go_provider->c_gt_data->*分配给。
me->注册事件()。
c_go_provider->c_go_grid->set_table_for_first_display(
出口
is_variant=值disvariant(报告=sy repid)
i_save='A'
is_布局=值lvc_s_布局(选择模式='A')
改变
it_outtab=
it_fieldcatalog=lt_fieldcat
).
c_go_provider->c_go_grid->set_toolbar_interactive()。
恩迪夫。
c_go_提供程序->c_go_网格->刷新表格显示()。
ENDMETHOD。
方法注册事件。
me->c\u go\u事件=新lcl\u evt\u任务\u用户\u命令()。
设置处理程序me->c_go_事件->处理工具条
me->c_go_事件->处理用户命令
对于c_go_提供者->c_go_网格。
ENDMETHOD。
此后,标准工具栏消失:


我做错了什么?

您对内部表使用了值运算符。它首先删除内部表的现有内容,然后添加新内容。这就是现有工具栏项不显示的原因。我有以下两种解决方案来解决这个问题

解决方案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 in Value关键字来更新现有代码

解决方案2:

可以将相同的值运算符与基数相加。使用带值运算符的BASE时,它会保留现有内容,并从运算符右侧添加新内容

以下是使用**VALUE运算符并添加BASE的ABAP代码。工具栏项目不会被删除**

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

ABAP代码e_对象->mt_工具栏=值ttb_按钮((butn_类型=3)(函数='EDIT'图标=图标编辑文件butn_类型=0))。不正确。Value关键字是删除现有工具栏项,然后插入新项。如果不想从工具栏中删除现有项,则必须使用base with Value关键字。SCN中还提出了一个问题:我们只能通过阅读代码推断出解决方案,您最好明确说明问题的原因,例如:整个工具栏(即所有按钮)被传输到事件
工具栏
,因此,如果您只想添加一个按钮,则不能用按钮替换整个工具栏,而是添加按钮。@SandraRossi:我也更新了答案,并给出了解释。