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.

### ABAP ALV 数据显示变更方法 在ABAP中,ALV(Application List Viewer)是一种用于展示和操作表格数据的强大工具。为了实现在ALV中的数据更改功能,通常需要通过事件处理机制来捕获用户的输入并将其反映到内部表中。 以下是实现数据更改功能的关键步骤及其解释: #### 1. 设置 ALV 的可编辑属性 为了让用户能够直接在 ALV 表格中修改数据,必须先配置 ALV 的布局参数 `LVC_S_LAYO` 中的相关字段。具体来说,可以通过设置 `EDIT[]` 参数为 `'X'` 来启用特定列的编辑功能[^1]。 ```abap DATA: ls_layout TYPE lvc_s_layo. ls_layout-edit = 'X'. " 启用整行的编辑功能 ``` 如果仅希望某些列可以被编辑,则可以在定义 ALV 字段目录时单独指定每列的编辑状态。 --- #### 2. 处理数据变化事件 当用户在 ALV 表格中完成数据修改后,这些改动并不会自动同步回原始内表。因此,需要注册一个事件处理器来捕捉这种变化,并手动将更新后的数据写入内表。 此过程涉及以下两个主要类和方法: - **cl_alv_grid**: 提供对 ALV 网格对象的操作接口。 - **cl_alv_changed_data_protocol**: 负责记录已发生的数据变动情况。 下面是一个典型的例子,展示了如何创建自定义模块以响应 `DATA_CHANGED` 事件[^2]: ```abap FORM handle_data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol. DATA: lt_modif_id TYPE STANDARD TABLE OF alv_modification, lv_index TYPE sy-tabix, lw_fieldcat LIKE LINE OF gt_fieldcatalog. FIELD-SYMBOLS: <fs_change> TYPE alv_modification. * 获取所有发生变化的记录索引号列表 CALL METHOD p_er_data_changed->get_modified_rows IMPORTING et_modifications = lt_modif_id. LOOP AT lt_modif_id INTO lv_index. READ TABLE gt_output INDEX lv_index ASSIGNING FIELD-SYMBOL(<fs_record>). * 遍历每一项具体的改变细节 CALL METHOD p_er_data_changed->get_changes_for_row EXPORTING i_row_no = lv_index IMPORTING et_row_changes = DATA(lt_row_changes). LOOP AT lt_row_changes ASSIGNING <fs_change>. CASE <fs_change>-operation. WHEN if_salv_c_operation=>co_insert OR co_update. MODIFY gt_input FROM <fs_record>. " 将新值保存至源表 WHEN if_salv_c_operation=>co_delete. DELETE gt_input INDEX lv_index. " 删除对应条目 ENDCASE. ENDLOOP. ENDLOOP. ENDFORM. ``` 上述代码片段实现了如下逻辑: - 使用 `p_er_data_changed->get_modified_rows` 方法获取所有受影响的行编号; - 对于每一行调用 `p_er_data_changed->get_changes_for_row` 进一步提取其详细的变化信息; - 根据不同的操作类型 (`INSERT`, `UPDATE`, 或者 `DELETE`) 更新底层存储结构 (即原生内表)。 --- #### 3. 注册事件监听器 最后,在初始化阶段需确保正确绑定目标事件与其对应的回调函数。这可通过实例化网格控件之后立即执行以下语句达成目的[^3][^4]: ```abap SET HANDLER event_receiver->handle_toolbar FOR go_grid. SET HANDLER event_receiver->handle_data_changed FOR go_grid. ``` 这里假设已经预先声明了一个名为 `event_receiver` 的全局变量指向某包含必要业务逻辑的对象实例;而后者则负责实际接收来自界面层的消息通知并向应用层传递进一步指示。 --- ### 注意事项 尽管本文提供了基本框架指导,但在真实项目开发过程中仍有许多其他因素值得考虑,例如性能优化、异常处理以及用户体验设计等方面均可能影响最终效果呈现质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值