中几个常用事件)
目录前言一、data_changed 数据变更事件核心能力与常用方法1获取所有被修改过的单元格清单pr_data-mt_mod_cellsa. 是什么b. 关键字段最重要3个c. 作用2取最新编辑值pr_data-get_cell_valuea. 是什么b. 入参出参c. 作用3ALV 单元格级消息提示add_protocol_entrya. 是什么b. 示例代码c. 参数详细说明4标准函数检查字符串是否为数字a. 是什么b. 完整代码c. 参数说明二、data_changed_finished 数据变更事件三、handle_hotspot_click 单击热点事件a. 前置条件b. 实现案例四、handle_onf4 自定义搜索帮助事件a. 事件作用b. 事件定义c. 方法实现五、handle_toolbar 工具栏定制事件a. 事件作用b. 动态工具栏按钮示例c. 动态刷新工具栏六、handle_user_command 用户功能码事件a. 事件定位b. 最佳实践c. 实现案例七、handle_double_click 双击事件a. 事件作用b. 参数说明c. 代码示例前言在 OO ALV 开发中CL_GUI_ALV_GRID基于 SAP Control Framework 采用「事件驱动 回调处理」的交互模式用户在网格上执行编辑、点击、按钮触发等操作时ALV 实例会抛出对应事件如data_changed、 handle_modify、 hotspot_click我们通过自定义事件接收类绑定处理方法即可实现各类业务逻辑。一、 data_changed 数据变更事件用户修改单元格内容、回车 / 切走焦点后立刻触发编辑过程中实时触发。CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. METHODS data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm. ENDCLASS. LCL_EVENT_RECEIVER DEFINITION * CLASS lcl_event_receiver IMPLEMENTATION * 定义方法 * ----------------------------------------------------------------------* CLASS lcl_event_receiver IMPLEMENTATION. METHOD data_changed. PERFORM handle_data_changed USING er_data_changed. ENDMETHOD. ENDCLASS. LCL_EVENT_RECEIVER IMPLEMENTATION核心参数说明er_data_changed变更协议对象类型为CL_ALV_CHANGED_DATA_PROTOCOL是所有校验操作的入口e_onf4本次事件由 F4 搜索帮助触发时为ABAP_TRUE可用于区分触发来源e_ucomm触发事件的功能码例如回车对应ENTER核心能力与常用方法1获取所有被修改过的单元格清单pr_data-mt_mod_cellsa. 是什么系统标准内表 LVC_T_MODI记录所有被修改的单元格明细是遍历校验的数据源。b. 关键字段最重要3个row_idALV 界面行唯一ID关键定位字段fieldname被修改的字段名tabix对应ALV内表真实行号c. 作用用于循环遍历所有改动单元格性能高。FORM handle_data_changed USING pr_data TYPE REF TO cl_alv_changed_data_protocol. LOOP AT pr_data-mt_mod_cells INTO DATA(ls_mod). 被修改单元格清单内表 * 逐行处理每个修改的字段 READ TABLE gt_alv ASSIGNING gfs_alv INDEX ls_mod-row_id. ALV 界面行唯一ID IF sy-subrc 0. ... ENDIF. ENDLOOP. ENDFORM.2取最新编辑值pr_data-get_cell_valuea. 是什么ALV 标准方法专门用来读取界面刚修改、还没刷新到内表的新值。直接读取内表 → 获取旧值调用 get_cell_value → 获取用户最新输入值b. 入参出参i_row_idmt_mod_cells-row_idi_fieldnamemt_mod_cells-fieldnamee_value返回界面最新输入值 单单元格取值 CALL METHOD pr_data-get_cell_value EXPORTING i_row_id ls_mod-row_id i_fieldname ls_mod-fieldname IMPORTING e_value DATA(lv_new_value).c. 作用ALV 回调事件中主内表 gt_alv 里还是旧值peri只要在 DATA_CHANGED 事件里直接读内表 旧值调用 get_cell_value 用户刚输入的新值与上面第一条中获取哪些单元格修改过搭配使用FORM handle_data_changed USING pr_data TYPE REF TO cl_alv_changed_data_protocol. LOOP AT pr_data-mt_mod_cells INTO DATA(ls_mod). * 逐行处理每个修改的字段 READ TABLE gt_alv ASSIGNING gfs_alv INDEX ls_mod-row_id. IF sy-subrc 0. 封装写法 begin PERFORM sub_get_cell_data USING ls_mod-fieldname 被修改的字段名 pr_data 修改单元格清单 ls_mod-row_id ALV 界面行唯一ID CHANGING lv_tsl. 用户修改的值 封装写法 end ENDIF. ENDLOOP. ENDFORM. FORM sub_get_cell_data USING VALUE(p_value) pr_data TYPE REF TO cl_alv_changed_data_protocol VALUE(pv_id) CHANGING pc_value. CALL METHOD pr_data-get_cell_value EXPORTING i_row_id pv_id i_fieldname p_value IMPORTING e_value pc_value. ENDFORM.3ALV 单元格级消息提示add_protocol_entrya. 是什么该方法是 CL_ALV_CHANGED_DATA_PROTOCOL 标准方法专属 DATA_CHANGED 事件用于给指定编辑单元格挂载单元格级警告/错误提示精准定位报错位置。b. 示例代码CALL METHOD pr_data-add_protocol_entry EXPORTING i_msgid 00 i_msgty W i_msgno 001 i_msgv1 输入的批号已在工厂打印请注意包号 i_fieldname ls_mod-fieldname i_row_id ls_mod-row_id.c. 参数详细说明i_msgid消息类00为系统通用基础消息类搭配通用消息号可自定义文本i_msgty消息类型核心区分业务逻辑WWarning 黄色警告仅提示不拦截数据保存可正常提交EError 红色报错单元格标红强制拦截数据保存必须修改后才能提交I信息提示终止程序ALV编辑场景几乎不用i_msgno消息编号配合00通用消息类用于承载自定义提示文本i_msgv1自定义提示文案界面最终展示给用户的提示内容i_fieldname绑定报错字段精准挂载到用户当前编辑的字段上i_row_id绑定报错行精准定位到用户当前编辑的ALV行4标准函数检查字符串是否为数字a. 是什么该函数是SAP标准工具函数用于清洗字符字段、校验纯数值内容专门解决 CHAR 字段带空格、隐形字符、无法数值判断的问题b. 完整代码CALL FUNCTION IF_CA_MAKE_STRING_NUMERICAL EXPORTING input_string 【待校验字符串】 EXCEPTIONS not_numerical 1. IF sy-subrc 0. 包含非数字字符校验不通过 ENDIF.c. 参数说明input_string需要校验的字符型字段EXCEPTIONS-not_numerical存在非数字内容时触发sy-subrc 0纯数字含空格合法sy-subrc 1非法字符不是纯数字注意❌DATA_CHANGED 内禁止直接调用refresh_table_display会导致事件递归触发引发程序 Dump刷新操作请放到 DATA_CHANGED_FINISHED 中执行。二、 data_changed_finished 数据变更事件DATA_CHANGED_FINISHED 是 ALV 网格在用户完成所有单元格编辑后触发的事件用于统一处理所有修改过的数据常配合 ET_GOOD_CELLS 参数逐行检查并响应数据变更。CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: handle_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid IMPORTING e_modified et_good_cells. ENDCLASS. CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_finished. CHECK e_modified EQ abap_true.已修改 READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(ls_cell) INDEX 1. CHECK: sy-subrc EQ 0. READ TABLE gt_out ASSIGNING FIELD-SYMBOL(ls_out) INDEX ls_cell-row_id. ...数据处理逻辑 ENDMETHOD. ENDCLASS.核心参数说明e_modified布尔值本次操作是否有数据被修改et_good_cells校验通过的单元格清单结构同mt_mod_cellset_bad_cells校验不通过的单元格清单这是项目中最常见的需求用户输入物料号自动带出描述、单位输入供应商自动带出名称输入采购订单自动控制字段可编辑性。三、 handle_hotspot_click 单击热点事件a. 前置条件字段目录中对应字段的hotspot属性需设为X字段会显示为蓝色带下划线的链接样式。CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_row_id e_column_id es_row_no. ENDCLASS.参数名类型描述e_row_idint4当前点击行的索引。e_column_idlvc_s_fcat一个包含当前点击列信息的结构。最常用的组件是e_column_id-fieldname它包含了被点击字段的名称。es_row_nolvc_s_roid当前点击行的行信息结构。通常包含es_row_no-row_id用于读取内表中的行。b. 实现案例METHOD handle_hotspot_click. 转换为内表物理行号兼容排序、筛选场景 DATA(lv_tabix) go_alv-get_table_line_index( i_row_id es_row_no-row_id ). CHECK lv_tabix 0. READ TABLE gt_stock ASSIGNING FIELD-SYMBOL(ls_stock) INDEX lv_tabix. CHECK sy-subrc EQ 0. 根据点击字段执行不同逻辑 CASE e_column_id-fieldname. WHEN EBELN. 采购单号跳转ME23N SET PARAMETER ID BES FIELD ls_stock-ebeln. CALL TRANSACTION ME23N AND SKIP FIRST SCREEN. WHEN MATNR. 物料号弹出详情 PERFORM frm_show_material_detail USING ls_stock-matnr. ENDCASE. ENDMETHOD.四、 handle_onf4 自定义搜索帮助事件a. 事件作用覆盖标准搜索帮助实现自定义的取值逻辑例如根据当前行物料限定可选批号范围。b. 事件定义CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid IMPORTING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display. ENDCLASS.c. 方法实现METHOD handle_onf4. CASE e_fieldname. WHEN CHARG. PERFORM frm_open_shlp_dialog USING es_row_no-row_id. ENDCASE. 标记事件已处理阻止标准搜索帮助叠加弹出 er_event_data-m_event_handled abap_true. ENDMETHOD.五、 handle_toolbar 工具栏定制事件a. 事件作用ALV 工具栏渲染前触发用于新增自定义按钮、隐藏标准按钮、动态控制按钮显隐。按钮类型说明butn_type 值类型说明0普通按钮最常用单击触发对应功能码1菜单按钮带下拉箭头可挂载子菜单2分隔线垂直分隔线用于按钮分组3空白分隔空白占位拉开按钮间距b. 动态工具栏按钮示例可以根据不同业务模式新增 / 修改 / 删除 / 查询动态显示不同按钮也可以为分割成不同 alv 的屏幕设置工具按钮CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: 自定义 ALV 工具栏按钮 handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING sender e_object. ENDCLASS. CLASS lcl_event_receiver IMPLEMENTATION. 设置工具栏 METHOD handle_toolbar. 移除本地标准按钮 DELETE e_object-mt_toolbar WHERE function CS |LOCAL|. DATA: ls_toolbar TYPE stb_button. CASE sender. WHEN go_alv1. 采购收货ALV1 专属按钮 APPEND VALUE stb_button( butn_type 3 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function CRE text TEXT-004 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function DEL text TEXT-008 ) TO e_object-mt_toolbar. WHEN go_alv2. 生产投料ALV2 只显示保存 APPEND VALUE stb_button( butn_type 3 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function SAVE text TEXT-007 ) TO e_object-mt_toolbar. WHEN go_alv3. 生产入库ALV3 新增导出 APPEND VALUE stb_button( butn_type 3 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function CRE text TEXT-004 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function EXPORT text 导出入库数据 ) TO e_object-mt_toolbar. WHEN go_alv4. 销售出库ALV4 仅查询按钮 APPEND VALUE stb_button( butn_type 3 ) TO e_object-mt_toolbar. APPEND VALUE stb_button( function QUERY text 重新查询出库 ) TO e_object-mt_toolbar. ENDCASE. ENDMETHOD. ENDCLASS.c.为 ALV 绑定 toolbar 事件CREATE OBJECT go_alv1 EXPORTING i_parent go_cc_alv1. SET HANDLER lcl_event_receiverhandle_toolbar FOR go_alv1.d. 动态刷新工具栏运行中切换模式时调用以下方法可重新触发 toolbar 事件更新按钮状态go_alv-set_toolbar_interactive( ).六、 handle_user_command 用户功能码事件a. 事件定位所有自定义工具栏按钮的点击逻辑都在此事件中处理替代传统列表 ALV 的 AT USER-COMMAND 块。b. 最佳实践方法开头必须调用check_changed_data( )强制将界面上未回车的编辑值同步到内表避免用户改完数据直接点按钮导致修改丢失。c. 实现案例METHOD handle_user_command. 强制同步界面未保存的编辑数据核心最佳实践 DATA(lv_valid) go_alv-check_changed_data( ). IF lv_valid abap_false. MESSAGE 数据校验不通过请修正红色单元格后再操作 TYPE E. ENDIF. 处理行选中标记 PERFORM frm_mark_selection USING 01. CASE e_ucomm. WHEN CRE. PERFORM frm_create. WHEN DEL. PERFORM frm_delete. WHEN SAVE. PERFORM frm_check. 数据业务校验 PERFORM frm_save. 数据保存 WHEN PRINT. PERFORM frm_print_function. ENDCASE. go_alv-refresh_table_display( is_stable VALUE lvc_s_stbl( row abap_true col abap_true ) ). PERFORM frm_mark_selection USING 10. ENDMETHOD.七、 handle_double_click 双击事件a. 事件作用用户双击任意单元格时触发常用于行级详情查看、事务跳转。与热点点击的选型区别热点点击单击触发仅作用于指定字段适合单据号跳转双击事件双击触发作用于整行任意位置适合查看行详情b. 参数说明参数类型说明senderTYPE REF TO cl_gui_alv_grid触发事件的ALV对象。通过此参数可以判断双击发生在哪一个ALV中es_row_nolvc_s_roid包含用户双击行的行ID。后续方法使用es_row_no-row_id从内表中读取对应行的数据c. 代码示例CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: handle_double_click FOR EVENT double_click OF cl_gui_alv_grid IMPORTING sender es_row_no. ENDCLASS. CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_double_click. IF sender go_alv1. PERFORM frm_alv1_link_alv2 USING es_row_no. ELSEIF sender go_alv2. PERFORM frm_alv2_link_alv3 USING es_row_no. ELSEIF sender go_alv3. PERFORM frm_alv3_link_alv4 USING es_row_no. ENDIF. ENDMETHOD. ENDCLASS.写的不完善的地方请多包容欢迎指正本文会持续补充更新~