ABAP ALV 回车事件

 定义 事件 event

DATA:stbl   TYPE lvc_s_stbl,
     g_grid TYPE REF TO cl_gui_alv_grid,

     it_event      TYPE slis_t_event. "不能有表头,否则会RUNTIME ERROR

*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       类定义
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION."类定义
  PUBLIC SECTION.
    METHODS:
      handle_data_changed FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING e_modified et_good_cells.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*       类实现
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION."类实现
  METHOD handle_data_changed.
    PERFORM handle_data_changed ."具体处理数据事件
    IF e_modified = 'X'.
      stbl-row = 'X'." 基于行的稳定刷新
      stbl-col = 'X'." 基于列稳定刷新
      CALL METHOD g_grid->refresh_table_display
        EXPORTING
          is_stable = stbl.
    ENDIF.
  ENDMETHOD.
ENDCLASS. "lcl_event_handler IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Form  register_events
*&---------------------------------------------------------------------*
*       注册回车事件
*----------------------------------------------------------------------
FORM frm_register_events USING e_grid TYPE slis_data_caller_exit.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = g_grid.
*
  DATA: gr_event_handler TYPE REF TO lcl_event_handler.
  CREATE OBJECT gr_event_handler.
*
  CALL METHOD g_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.

  SET HANDLER gr_event_handler->handle_data_changed FOR g_grid.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM. "register_events
FORM handle_data_changed .  "  回车后操作
 ……………………
ENDFORM.

*&BEGIN------------------------------------------------------------------*
*& 增加ALV事件
*&创建时间:15.07.2024 10:10:33
*&创建人:
*&END--------------------------------------------------------------------*
FORM frm_set_event.
  DATA ls_event TYPE slis_alv_event.
  ls_event-name = 'CALLER_EXIT'.
  ls_event-form = 'FRM_REGISTER_EVENTS'.
  APPEND ls_event TO it_event.
ENDFORM.

 ALV展示

FORM frm_display_alv.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout                = iw_layout
      it_fieldcat              = it_fieldcat
      i_callback_pf_status_set = 'ALV_PF_STATUS'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      it_sort                  = i_sort[]
      it_events                = it_event
    TABLES
      t_outtab                 = gt_alv[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.

调用实现

PERFORM frm_set_event.

PERFORM frm_display_alv.

<think>好的,用户想了解ABAPALV回车事件的触发机制和示例代码。我需要先回顾相关的引用资料,看看里面提到了哪些关键点。 根据引用[1],在REUSE_ALV_GRID_DISPLAY_LVC函数中,IT_EVENTS表需要添加CALLER_EXIT事件,并且FORM名称要对应。引用[2]提到需要注册事件类定义,特别是IT_EVENTS中的CALLER_EXIT参数,name必须正确。引用[3]中的代码示例展示了如何添加事件到IT_EVENTS,并指定FORM处理程序。 首先,用户可能需要知道如何配置IT_EVENTS表,包括事件的名称和对应的FORM。然后,回车事件可能涉及DATA_CHANGED或DATA_CHANGED_FINISHED事件,需要引用[2]提到的DATA_CHANGED_FINISHED实现。 接下来,要分步骤说明:注册事件、创建事件处理FORM、实现具体逻辑。注意代码中的字段检查,比如在回车时检查字段值是否合法,可能需要使用CL_GUI_ALV_GRID的方法。 用户可能还需要示例代码的结构,包括函数模块调用、事件定义和FORM的实现。需要确保代码中的事件名称正确,例如CALLER_EXIT和DATA_CHANGED_FINISHED的区别。同时,提醒用户注意事件触发的顺序和调试方法,比如设置断点或使用调试器。 另外,引用[2]提到监控自动带出事件,可能涉及到数据变更后的处理,比如赋值或其他字段的更新。在示例代码中应该包含这些部分的演示,比如修改其他字段的值。 最后,需要检查是否有遗漏的步骤,比如事件类的注册,或者在FORM中如何获取变更的数据。确保所有引用中的关键点都被涵盖,并且示例代码正确无误,符合ABAP语法规范。</think>### ABAP ALV 回车事件触发机制及示例代码 #### 一、触发机制说明 在ABAP ALV中实现回车事件触发,主要通过以下步骤: 1. **事件注册**:在调用ALV函数时需通过`IT_EVENTS`参数注册`CALLER_EXIT`事件[^1][^2] 2. **事件关联**:将事件名称与具体FORM处理程序绑定,例如`DATA_CHANGED_FINISHED`用于响应数据变更完成后的动作[^2] 3. **字段级控制**:通过`CL_GUI_ALV_GRID`类的方法实现字段值校验和自动赋值[^2] #### 二、实现步骤与示例代码 ```abap * 定义事件表 DATA: gt_events TYPE slis_t_event, gs_event TYPE slis_alv_event. * 注册回车触发的事件 gs_event-name = 'DATA_CHANGED_FINISHED'. " 数据变更完成事件 gs_event-form = 'HANDLE_ENTER_EVENT'. " 关联处理FORM APPEND gs_event TO gt_events. * 调用ALV显示函数 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_user_command = 'USER_COMMAND' it_events = gt_events TABLES t_outtab = gt_data. * 事件处理FORM FORM handle_enter_event USING p_cl_data TYPE REF TO cl_salv_model_data. DATA: lo_grid TYPE REF TO cl_gui_alv_grid, lt_mod_cells TYPE lvc_t_modi. " 获取ALV Grid对象 lo_grid ?= p_cl_data. " 获取修改过的单元格 lo_grid->get_changed_cells( IMPORTING et_good_cells = lt_mod_cells ). " 遍历修改记录 LOOP AT lt_mod_cells ASSIGNING FIELD-SYMBOL(<fs_mod>). IF <fs_mod>-fieldname = 'MATNR'. " 检查物料字段 " 实现业务逻辑(如自动带出物料描述) PERFORM validate_material USING <fs_mod>. ENDIF. ENDLOOP. ENDFORM. ``` #### 三、关键实现要点 1. **事件类型选择**: - `CALLER_EXIT`:用于注册自定义事件入口[^1][^3] - `DATA_CHANGED_FINISHED`:专用于数据修改完成后的触发[^2] 2. **数据获取方法**: ```abap lo_grid->get_changed_cells( ) " 获取所有修改单元格 lo_grid->check_changed_data( ) " 强制提交修改数据 ``` 3. **字段校验示例**: ```abap FORM validate_material USING is_mod_cell TYPE lvc_s_modi. SELECT SINGLE maktx INTO gt_data-maktx FROM makt WHERE matnr = gt_data-matnr AND spras = sy-langu. IF sy-subrc <> 0. MESSAGE e398(00) WITH '无效物料号' DISPLAY LIKE 'E'. ENDIF. ENDFORM. ``` 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值