[abap] 'REUSE_ALV_GRID_DISPLAY_LVC' 的用法

本文介绍如何使用 REUSE_ALV_GRID_DISPLAY_LVC 实现 ABAP 中 ALV Grid 的显示及交互功能,包括数据准备、字段属性设置、自定义事件处理等关键步骤。
部署运行你感兴趣的模型镜像

说明:REUSE_ALV_GRID_DISPLAY_LVC 的用法

REPORT  XXXX.
TYPE-POOLS: slis.
INCLUDE <icon>.

 DATA: u_command TYPE slis_formname VALUE 'USER_COMMAND'.
 DATA: ok_code LIKE sy-ucomm.

  *ALV data declarations
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: it_fieldcat TYPE lvc_t_fcat,     "slis_t_fieldcat_alv WITH HEADER LINE,
      wa_fieldcat TYPE lvc_s_fcat,

      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE lvc_s_layo,     "slis_layout_alv,
      gd_repid     LIKE sy-repid.

 

* itab definition

TYPES: BEGIN OF t_display.
        INCLUDE STRUCTURE ZTFICO_PPS.
TYPES:   SEL,
        ZNUM TYPE ZNUM,
        field_style TYPE LVC_T_STYL, "FOR DISABLE
      END OF t_display.

 DATA: it_display TYPE STANDARD TABLE OF t_display  WITH HEADER LINE,
      wa_display TYPE t_display.

 

* 屏幕设计略。

* 主程序。

Start-OF-SELCTION.

      SORT it_display by ZNUM EBELN EBELP.   " it_display 为结果输出内表
      PERFORM set_specific_field_attributes.     "  特性设置
      PERFORM build_fieldcatalog CHANGING  it_fieldcat.  " 字段列举
      PERFORM frm_alv_output_data.                " ALV输出

 

* 子程序————————————————————————————————
*&根据条件设置字段是否可编辑
form set_specific_field_attributes .
  DATA ls_stylerow TYPE lvc_s_styl .
  DATA lt_styletab TYPE lvc_t_styl .
  LOOP AT it_display .
    IF it_display-ZFLAG_ZF NE ''.
      ls_stylerow-fieldname = 'ZFLAG_ZF' .
      ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled.
      "set field to disabled
      APPEND ls_stylerow  TO it_display-field_style.
*可以按上面的代码添加多个字段的是否可修改
      MODIFY it_display .
    ENDIF.
  ENDLOOP.
endform.  

 * 字段列举

 FORM build_fieldcatalog CHANGING  it_fieldcat TYPE lvc_t_fcat.
  PERFORM  frm_fieldcat_init TABLES it_fieldcat
                                USING  'ZNUM' '序号' '0' '6' 'X' '' '' '' 'X'.
  PERFORM  frm_fieldcat_init TABLES it_fieldcat
                                USING  'ZNAME' '供应商名称' '1' '30' 'X' '' '' '' 'X'.
  PERFORM  frm_fieldcat_init TABLES it_fieldcat
                                USING  'EBELN' '采购订单号' '2' '10' 'X' '' '' '' 'X'.
  PERFORM frm_fieldcat_init TABLES it_fieldcat
                                USING 'EBELP' '行项目' '3' '5' 'X' '' '' '' 'X'.
*……

  PERFORM  frm_fieldcat_init TABLES it_fieldcat
                                USING  'ZFLAG_ZF' '支付标识' '19' '1' '' '' 'X' 'X' ''.
ENDFORM.                    "build_fieldcatalog

 

* 字段属性设置

 FORM frm_fieldcat_init TABLES t_fieldcat TYPE lvc_t_fcat
                       USING fieldname TYPE C           " 字段名
                             scrtext_m TYPE C           " 标题
                             col_pos   TYPE I           " 所在列
                             outputlen TYPE I           " 输出长度
                             emphasize TYPE C            " 高亮显示
                             key       TYPE C            " 主键
                             checkbox  TYPE C
                             edit      TYPE C
                             fix_column TYPE C           " 固定列
                               .
  DATA: ls_fieldcat TYPE lvc_s_fcat.
  ls_fieldcat-fieldname   = fieldname.
  ls_fieldcat-scrtext_m   = scrtext_m.
  ls_fieldcat-col_pos     = col_pos.
  ls_fieldcat-outputlen   = outputlen.
  ls_fieldcat-emphasize   = emphasize.
  ls_fieldcat-key         = key.
  ls_fieldcat-checkbox    = checkbox.
  ls_fieldcat-edit        = edit.
  ls_fieldcat-fix_column  = fix_column.
  APPEND ls_fieldcat TO t_fieldcat.
  CLEAR  ls_fieldcat.
ENDFORM.                    "frm_fieldcat_init

 

* ALV输出

 FORM frm_alv_output_data.
  GD_LAYOUT-box_fname  = 'SEL'.
  GD_LAYOUT-stylefname = 'FIELD_STYLE'.
*   GD_LAYOUT-zebra      = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_SET_STATUS'   " 激活标准ALV的GUI状态

      i_callback_user_command  = 'USER_COMMAND'
      i_grid_title             = 'PO采购付款计划表'
      it_fieldcat_LVC          = IT_FIELDCAT
      IS_LAYOUT_LVC            = GD_LAYOUT
      i_save                   = 'X'
*      i_structure_name         = 'ZTFICO_PPS'   " 如果允许,则不用再列举字段,直接显示全部表内容
    TABLES
      t_outtab                 = it_display
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    "frm_alv_output_data


*激活自定义状态栏
FORM frm_set_status USING rt_extab TYPE slis_t_extab.
  CLEAR: rt_extab.
  REFRESH: rt_extab.
  SET PF-STATUS '9001' EXCLUDING rt_extab.
ENDFORM.                    "FRM_SET_STATUS

 

* 用户自定义事件

FORM user_command USING ucomm    TYPE sy-ucomm
                        selfield TYPE slis_selfield.

  data: lo_guid type ref to cl_gui_alv_grid.
  DATA: lr_grid type ref to cl_gui_alv_grid.
  DATA :   lt_index_rows TYPE lvc_t_row.
  DATA : flag_save  TYPE i.
  DATA : lv_index TYPE I.
  CASE ucomm.
    WHEN '&F03' OR 'EXIT' OR 'CANCLE'.
      LEAVE TO SCREEN 0.
    WHEN '&DATA_SAVE'." 保存按钮
*  取得当前alv的grid
      call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = lo_guid.
* 更新数据到内表 (checkbox打钩)
      call method lo_guid->check_changed_data.
*      selfield-refresh = 'X'.
      flag_save = 0.
      LOOP AT it_display WHERE ZFLAG_ZF = 'X' .
        READ TABLE  it_display_save with key  EBELN = it_display-EBELN
                                                                       EBELP = it_display-EBELP
                                                                       BLDAT = it_display-BLDAT
                                                                       ZNUM  = it_display-ZNUM
                                                                       ZFLAG_ZF = ''.
        if sy-subrc = 0 .
          UPDATE ZTFICO_PPS SET ZFLAG_ZF = 'X'
                            WHERE EBELN = it_display-EBELN
                            AND EBELP = it_display-EBELP
                            AND BLDAT = it_display-BLDAT.
          flag_save = flag_save + 1.
        ENDIF.
      ENDLOOP.
      if flag_save > 0 .
        COMMIT WORK.
        MESSAGE '设置支付标识成功!' TYPE 'S'.
      ELSE.
        ROLLBACK WORK.
        MESSAGE '没有修改支付标识或者数据保存失败!' TYPE 'E'.
      ENDIF.
    WHEN '&IC1'.   " 双击显示PO  ME23N
*        取得当前alv的grid
      call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = lr_grid.
      CALL METHOD lr_grid->get_current_cell
        IMPORTING
          e_row     = lv_index.
*      PERFORM frm_click2 USING selfield-fieldname selfield-value..   "根据选择的行字段进行输出
     PERFORM frm_click2 USING lv_index.   "根据选择的行进行输出
  ENDCASE.
ENDFORM.

 

 * 双击行中指定字段,读取到指定的Parameter ID 中。

 *FORM frm_click2  USING    p_selfield_fieldname
*                         p_selfield_value.
*  IF p_selfield_fieldname CS 'EBELN'."双击的字段 采购订单号
*    SET PARAMETER ID 'BES'  FIELD p_selfield_value."字段的参数ID
*    CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.        "要调用的T_code.
*  ENDIF.
*ENDFORM.                    " FRM_CLICK

 

 * 双击行中任意位置,根据行号读取内表指段到指定的Parameter ID 中。
FORM  frm_click2 USING lv_index_c.
    READ TABLE it_display index lv_index_c.
    if sy-subrc = 0.
    SET PARAMETER ID 'BES'  FIELD it_display-EBELN."字段的参数ID
    CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.        "要调用的T_code.
    ENDIF.
ENDFORM.
 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在处理一个关于SAP ABAP中REUSE_ALV_GRID_DISPLAY_LVC函数模块的事件处理问题,特别是数据变更完成事件(datachangefinished)。根据用户提供的引用和问题,我们可以推断用户希望了解如何在REUSE_ALV_GRID_DISPLAY_LVC中处理数据变更完成事件。 在SAP ABAP中,REUSE_ALV_GRID_DISPLAY_LVC是一个用于显示ALV报表的函数模块。它支持多种事件,其中数据变更完成事件(data_changed_finished)是当用户在ALV网格中修改数据并完成编辑(例如按下回车或离开编辑的单元格)时触发的事件。 为了处理这个事件,我们需要以下步骤: 1. 在调用REUSE_ALV_GRID_DISPLAY_LVC之前,定义一个事件处理程序(event handler)方法来处理data_changed_finished事件。 2. 在函数模块的调用参数中,将事件处理程序方法注册到相应的事件上。 但是,需要注意的是,REUSE_ALV_GRID_DISPLAY_LVC函数模块内部使用了一个ALV对象(CL_GUI_ALV_GRID的实例)。因此,我们需要在函数调用之后获取这个ALV对象实例,然后才能注册事件。然而,REUSE_ALV_GRID_DISPLAY_LVC并没有直接返回ALV对象实例,所以我们需要使用另一种方法:在函数调用时通过I_CALLBACK_PROGRAM参数指定回调程序,然后使用SET HANDLER语句在程序中注册事件处理程序。 然而,更常见且推荐的做法是使用面向对象的ALV(即直接创建CL_GUI_ALV_GRID的实例),这样可以更灵活地控制事件。但用户要求使用REUSE_ALV_GRID_DISPLAY_LVC,因此我们需要在函数调用之后获取网格对象。 我们可以通过以下方式获取网格对象: - 在调用REUSE_ALV_GRID_DISPLAY_LVC之后,使用CL_GUI_ALV_GRID=>get_metadata( )方法获取网格实例?但是这种方法并不直接。 - 实际上,在调用REUSE_ALV_GRID_DISPLAY_LVC时,我们可以通过传递一个容器(container)来显示ALV,然后从容器中获取网格对象。但如果不使用容器,则函数模块会在屏幕上创建一个网格。 另一种方法是使用函数模块返回的网格对象。REUSE_ALV_GRID_DISPLAY_LVC有一个导出参数E_GRID,它返回网格对象。因此,我们可以使用这个参数来获取网格实例,然后注册事件。 具体步骤: 1. 定义事件处理程序方法,例如:handle_data_changed_finished,该方法需要定义在类中(局部类或全局类)。 2. 在调用函数之前,创建一个事件处理程序实例(即类的实例)。 3. 调用REUSE_ALV_GRID_DISPLAY_LVC,并确保获取E_GRID参数(即网格对象)。 4. 使用SET HANDLER语句将事件处理程序方法注册到网格对象的事件上。 注意:事件data_changed_finished是在类CL_GUI_ALV_GRID中定义的,因此我们可以在网格对象上注册这个事件。 下面是一个示例代码框架: ```abap REPORT ztest_alv_event. * 定义局部类来处理事件 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid IMPORTING e_modified et_good_cells. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed_finished. " 在这里处理数据变更完成事件 " e_modified 表示数据是否被修改 " et_good_cells 包含成功修改的单元格信息 ENDMETHOD. ENDCLASS. DATA: go_grid TYPE REF TO cl_gui_alv_grid, go_event_handler TYPE REF TO lcl_event_handler. START-OF-SELECTION. " 准备数据内表等 " 创建事件处理程序实例 CREATE OBJECT go_event_handler. " 调用函数模块显示ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid " 其他必要的参数,如结构、布局等 IMPORTING e_grid = go_grid " 获取网格对象 TABLES t_outtab = it_data " 你的数据内表 EXCEPTIONS program_error = 1 OTHERS = 2. IF sy-subrc = 0 AND go_grid IS BOUND. " 注册事件 SET HANDLER go_event_handler->handle_data_changed_finished FOR go_grid. ENDIF. ``` 但是,请注意:REUSE_ALV_GRID_DISPLAY_LVC函数模块在调用后,网格已经显示,并且事件注册必须在网格显示之前完成?实际上,事件注册可以在网格显示之后,因为事件是未来触发的。但是,为了确保在用户操作之前事件处理程序已经注册,我们通常在显示之前注册事件。然而,由于我们只能在函数调用后获得网格对象,所以只能在之后注册。 另外,在函数模块REUSE_ALV_GRID_DISPLAY_LVC中,有一个参数I_GRID_SETTINGS,其中有一个属性NO_EDIT(用于控制是否可编辑)。如果我们需要编辑,则不能设置NO_EDIT为'X'。同时,我们还需要在布局(layout)中设置字段为可编辑(在field catalog中设置EDIT属性)。 因此,为了支持编辑,我们需要: - 在field catalog中为需要编辑的字段设置EDIT属性为'X'。 - 在布局中设置STYLEFNAME属性(如果使用单元格级编辑)或者直接允许整个字段编辑。 此外,我们还需要注册编辑事件(edit event),以便在用户开始编辑时触发,但这里我们只关注数据变更完成事件。 注意:在函数模块REUSE_ALV_GRID_DISPLAY_LVC中,我们可能还需要在调用之前设置一些其他参数,比如设置编辑模式(使用I_GRID_EDIT属性)?实际上,在SAP的较新版本中,可能需要使用I_GRID_SETTINGS-EDIT_MODE来设置编辑模式。 但是,在REUSE_ALV_GRID_DISPLAY_LVC中,编辑功能的启用还需要在布局中设置EDIT_MODE(例如,设置EDIT_MODE为'X')?实际上,在布局参数(IS_LAYOUT)中有一个EDIT属性,但它是整个网格的编辑模式。我们通常设置IS_LAYOUT-EDIT = 'X'。 总结步骤: 1. 定义字段目录(field catalog),为需要编辑的字段设置EDIT属性。 2. 设置布局(layout)的EDIT属性为'X'(允许编辑)。 3. 调用函数模块,获取网格对象。 4. 注册事件处理程序。 注意:事件data_changed_finished是在用户完成编辑后触发的,它提供了修改的单元格信息。 另外,用户提到的引用[2]中提到了注册编辑事件(CL_GUI_ALV_GRID=>MC_EVT_MODIFIED),这个事件是当数据被修改时触发的,与data_changed_finished不同。data_changed_finished是在用户完成编辑(例如,按回车或离开单元格)时触发,而modified事件是在数据被修改(每次修改)时触发。 因此,根据用户的需求,我们提供了data_changed_finished事件的处理方法。 如果用户希望使用REUSE_ALV_GRID_DISPLAY_LVC,并且处理datachangefinished事件,那么上述代码示例可以作为一个起点。 但是,请注意,在SAP ABAP中,事件处理程序必须在一个类的方法中实现,因此我们使用了局部类。 最后,我们生成相关问题:</think>### SAP ABAP REUSE_ALV_GRID_DISPLAY_LVC 数据变更完成事件处理 在 SAP ABAP 中,`REUSE_ALV_GRID_DISPLAY_LVC` 函数模块用于显示 ALV 报表,处理数据变更完成事件(`DATA_CHANGED_FINISHED`)需要结合面向对象 ALV 的事件处理机制。以下是完整实现步骤: #### 1. **核心实现步骤** ```abap *-- 1. 定义事件处理类 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS: handle_data_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid IMPORTING e_modified et_good_cells. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_finished. " 数据变更完成后的处理逻辑 IF e_modified = abap_true. " 1. 获取修改的单元格数据 " 2. 执行数据验证/更新数据库 " 3. 刷新ALV显示 ENDIF. ENDMETHOD. ENDCLASS. *-- 2. 在调用ALV前初始化 DATA: go_grid TYPE REF TO cl_gui_alv_grid, go_handler TYPE REF TO lcl_event_handler. START-OF-SELECTION. CREATE OBJECT go_handler. " 创建事件处理实例 *-- 3. 调用ALV函数获取网格对象 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = ls_layout " 设置布局EDIT模式 it_fieldcat_lvc = lt_fieldcat " 字段目录 IMPORTING e_grid = go_grid " 关键:获取网格对象 TABLES t_outtab = lt_data. " 显示的数据表 *-- 4. 注册数据变更完成事件 IF go_grid IS BOUND. " 启用编辑事件 CALL METHOD go_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. " 注册数据完成事件 SET HANDLER go_handler->handle_data_finished FOR go_grid. ENDIF. ``` #### 2. **关键配置说明** 1. **布局设置**:在 `ls_layout` 中启用编辑模式 ```abap ls_layout-edit = 'X'. " 允许网格编辑 ``` 2. **字段目录设置**:为可编辑字段设置属性 ```abap lt_fieldcat-edit = 'X'. " 指定字段可编辑 ``` 3. **事件参数说明**: - `e_modified`:标识数据是否被修改(`ABAP_TRUE/ABAP_FALSE`) - `et_good_cells`:包含修改后数据的单元格集合(类型 `LVC_T_MODI`) #### 3. **事件处理中的典型操作 ```abap METHOD handle_data_finished. LOOP AT et_good_cells ASSIGNING FIELD-SYMBOL(<fs_modi>). " 获取修改的值 ASSIGN COMPONENT <fs_modi>-fieldname OF STRUCTURE lt_data[<fs_modi>-row_id] TO FIELD-SYMBOL(<fs_field>). " 数据验证示例 IF <fs_modi>-value < 0. MESSAGE '值不能为负数' TYPE 'E'. ELSE. <fs_field> = <fs_modi>-value. ENDIF. ENDLOOP. " 刷新ALV显示 go_grid->refresh_table_display( ). ENDMETHOD. ``` #### 4. **注意事项** 1. 必须在调用 `REUSE_ALV_GRID_DISPLAY_LVC` 后获取 `e_grid` 对象才能注册事件[^1] 2. 使用 `set_ready_for_input(1)` 激活编辑模式[^2] 3. 事件触发条件:用户按 Enter 或离开编辑单元格 4. 如需实时校验,可额外注册 `data_changed` 事件 > **性能提示**:批量操作时建议在 `handle_data_finished` 中使用 `REFRESH_TABLE_DISPLAY` 而非重新调用 ALV 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值