SAP ABAP OOALV添加自定义按钮

在SAP报表开发中,为满足不同公司的风格需求,常常需要去掉ALV报表的默认工具栏并添加自定义按钮。这通常通过创建事件处理类来实现,包括添加按钮的方法和响应用户命令的方法。首先创建一个类,如`lcl_event_receiver`,包含`handle_toolbar`和`handle_user_command`两个方法,分别用于添加按钮和处理按钮事件。接着在`set_toolbar`方法中定义按钮,并在`set_handler`中设置事件处理对象。最后,通过`set_toolbar_interactive`设置交互式工具栏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SAP在做报表开发中,不同公司对报表的风格往往各异,为此经常在使用OO方法做ALV报表中需要去掉自带的工具栏而自行添加一些工具按钮,下面将简单介绍一下添加按钮及如何响应的实现方法:
步骤一:创建一个事件处理类
   CLASS lcl_event_receiver DEFINITION.
* public attributes and method
  PUBLIC SECTION.
    METHODS:
     handle_toolbar     FOR EVENT toolbar OF cl_gui_alv_grid
       IMPORTING
         e_object,
     handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
       IMPORTING
         e_ucomm,
ENDCLASS.                    "lcl_event_receiver DEFINITION
注意这个事件处理类中添加了两个方法,第一个方法负责往工具栏上添加按钮,第二个方法用来响应工具栏上按钮的动作
步骤二:类的实现
   CLASS lcl_event_receiver IMPLEMENTATION.

* method toolbar handler
  METHOD handle_toolbar.
   PERFORM set_toolbar CHANGING e_object.
  ENDMETHOD.                    "handle_toolbar
 
    METHOD handle_user_command.
*   Handle own functions defined in the toolbar
    CASE e_ucomm.
      WHEN 'ADD'.
       PERFORM xyz. “这里你想干嘛就可以干嘛
    ENDCASE.

  ENDMETHOD.                    "handle_user_command
 
   ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION
步骤三:在FORM-----set_toolbar 中添加button
   FORM set_toolbar 
CHANGING prf_object TYPE REF TO cl_alv_event_toolbar_set.

  CLEAR prf_object->mt_toolbar.

  CLEAR  gs_toolbar.
  MOVE   'ADD'            TO   gs_toolbar-function.
  MOVE                    TO      gs_toolbar-quickinfo.
  MOVE                    TO   gs_toolbar-text.
  MOVE   ' '              TO   gs_toolbar-disabled.
  INSERT gs_toolbar       INTO prf_object->mt_toolbar INDEX 1.

ENDFORM.                    " set_toolbar1
 
步骤四:创建事件处理对象--这一步一般在  grf_grid->set_table_for_first_display 之后
   SET HANDLER grf_event_receiver->handle_user_command FOR grf_grid.
  SET HANDLER grf_event_receiver->handle_toolbar  FOR grf_grid.
  CALL METHOD grf_grid->set_toolbar_interactive.
 
 
注意:STB_BUTTON结构包含的字段
FUNCTION         UI_FUNC    CHAR 70 0 Function Code
ICON             ICONNAME   CHAR 30 0 Name of an Icon
QUICKINFO        ICONQUICK  CHAR 30 0 Quickinfo for an icon
BUTN_TYPE        TB_BTYPE   INT4 10 0 Toolbar button type
DISABLED         CHAR            1  0 Disabled
TEXT             TEXT40     CHAR 40 0 Text, 40 Characters Long
CHECKED          CHAR             1 0 Printed
TB_BTYPE 的可选择值 ,主要用来决定按钮的类型  
0 Button (normal)
1 Menu and default button
2 Menu
3 Separator
4 Radio button
5 Checkbox
6 Menu entry

<think>好的,我现在需要帮助用户了解如何在ABAPOOALV中实现双屏并创建自定义的保存按钮。首先,我得回忆一下ABAPOOALV的基本结构以及双屏处理的方法。 用户提到的是双屏,也就是主屏和子屏的切换。通常,在OOALV中,主屏幕显示列表,子屏幕用于详细显示或编辑。可能需要用到CL_GUI_DIALOGBOX_CONTAINER或者导航到另一个屏幕。但具体的实现步骤可能需要详细分析。 接下来是自定义保存按钮。用户可能希望在子屏上有一个保存按钮,当用户点击时,将修改的数据保存到数据库。这时候,需要在子屏的PBO和PAI中处理事件,特别是要处理按钮的点击事件,并调用保存逻辑。 首先,可能需要创建两个屏幕:一个主屏幕(比如1000)显示ALV列表,另一个子屏幕(比如2000)显示详细数据。主屏幕的ALV可能需要设置事件处理程序,比如双击事件,以便导航到子屏幕。 然后,在子屏幕上放置自定义容器,比如CL_GUI_CUSTOM_CONTAINER,并在上面创建输入字段或者另一个ALV用于编辑。同时,添加保存按钮到子屏幕的GUI状态或者直接作为按钮控件。 保存按钮的事件处理需要通过USER-COMMAND来处理。当用户点击按钮时,系统会触发PAI事件,并根据sy-ucomm的值执行相应的保存逻辑。这时候,需要从子屏幕的ALV或输入字段中获取修改后的数据,验证数据,然后更新到数据库表中。 需要注意的是,双屏之间的数据传递可能需要使用全局变量或者通过类属性来传递。同时,确保在子屏幕关闭后,主屏幕的ALV能够刷新显示更新后的数据。 可能的难点包括正确处理屏幕流,确保两个屏幕之间的导航顺畅,以及数据的一致性和完整性。此外,保存按钮的事件处理需要与ABAP的对话编程模型结合,正确处理PAI和PBO模块。 另外,关于OOALV的创建,主屏和子屏可能需要分别创建不同的ALV实例,并管理它们的数据对象。在子屏中,可能需要使用可编辑的ALV,允许用户修改数据,然后通过保存按钮触发保存操作。 总结一下,步骤可能包括: 1. 创建主屏幕和子屏幕,定义各自的屏幕编号。 2. 在主屏幕中创建OOALV显示列表,并设置事件处理程序(如双击进入子屏)。 3. 在子屏幕中添加自定义容器和ALV,允许编辑数据。 4. 在子屏幕中添加保存按钮,并处理其USER-COMMAND。 5. 在PAI中处理保存逻辑,更新数据库。 6. 返回主屏幕时刷新ALV数据。 需要验证每一步的具体实现,比如如何导航到子屏幕,如何在子屏幕中布局控件,如何捕获按钮点击事件,以及如何将数据写回数据库。此外,错误处理和数据验证也是关键点,确保用户输入的有效性。 可能还需要参考SAP的标准程序或文档,确认双屏导航的最佳实践,以及如何在OOALV中正确处理用户交互。同时,确保在保存时使用BAPI或直接更新数据库表,并处理可能的异常情况。</think>在ABAP中实现OOALV双屏并创建自定义保存按钮,需遵循以下结构化步骤: --- ### **步骤1:定义屏幕及容器** 1. **主屏幕(如1000)** - 使用`CL_GUI_CUSTOM_CONTAINER`或`CL_GUI_DOCKING_CONTAINER`创建容器。 - 初始化主ALV对象(`CL_SALV_TABLE`),绑定到容器。 - 设置事件处理器(如双击事件`DOUBLE_CLICK`)。 2. **子屏幕(如2000)** - 创建对话框容器`CL_GUI_DIALOGBOX_CONTAINER`或导航至新屏幕。 - 添加可编辑的ALV或输入字段,绑定到子容器。 - 添加自定义GUI状态,包含保存按钮(`SAVE`)。 --- ### **步骤2:实现双屏导航** 1. **主屏跳转子屏** - 在主ALV的`DOUBLE_CLICK`事件中调用子屏: ```abap CALL SCREEN 2000. ``` - 或通过对话框容器动态创建子屏。 2. **子屏返回主屏** - 在子屏的PAI模块中处理`BACK`命令或关闭按钮: ```abap LEAVE TO SCREEN 0. ``` --- ### **步骤3:自定义保存按钮逻辑** 1. **GUI状态添加按钮** - 在子屏的GUI状态(`STATUS`)中定义保存按钮: ```abap SET PF-STATUS 'ZSAVE_STATUS'. ``` - 按钮功能码设为`SAVE`。 2. **处理PAI事件** - 在子屏的PAI模块中捕获`sy-ucomm = 'SAVE'`: ```abap MODULE user_command_2000 INPUT. CASE sy-ucomm. WHEN 'SAVE'. PERFORM save_data. ENDCASE. ENDMODULE. ``` 3. **保存数据逻辑** - 从子屏ALV获取修改后的数据(`GET_CHANGED_DATA`)。 - 验证数据有效性。 - 调用BAPI或直接更新数据库表: ```abap UPDATE ztable SET ... WHERE ... COMMIT WORK. ``` --- ### **步骤4:刷新主屏数据** - 子屏关闭后,在主屏的PBO中调用`REFRESH`方法: ```abap METHOD refresh_main_alv. lo_alv->refresh( ). ENDMETHOD. ``` --- ### **关键代码示例** ```abap " 子屏PAI处理保存 MODULE user_command_2000 INPUT. CASE sy-ucomm. WHEN 'SAVE'. " 获取ALV修改数据 lo_sub_alv->get_changed_data( CHANGING ct_data = lt_modified_data ). " 数据验证及保存 IF validate_data( lt_modified_data ). UPDATE ztarget_table FROM TABLE lt_modified_data. IF sy-subrc = 0. MESSAGE '保存成功' TYPE 'S'. LEAVE TO SCREEN 1000. " 返回主屏 ELSE. MESSAGE '保存失败' TYPE 'E'. ENDIF. ENDIF. ENDCASE. ENDMODULE. ``` --- ### **注意事项** 1. **数据一致性** - 使用事务码`SE11`锁对象或`ENQUEUE`确保并发安全。 2. **错误处理** - 在保存逻辑中捕获异常(如`CX_SALV_ERROR`)。 3. **性能优化** - 批量提交数据(`UPDATE ... FROM TABLE`)。 通过以上步骤,可实现双屏数据编辑及自定义保存功能,确保用户交互流畅且数据可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值