SAP ooalv各种事件的用法

该程序展示了如何在SAPABAP中创建两个屏幕(1001和1002),并在屏幕上绘制容器。程序详细定义了ALV表格的OK_CODE,工具栏,以及处理按钮点击、菜单按钮、用户命令和热点点击等事件的方法。此外,还涉及到内表操作,如数据筛选和双击事件触发事务代码。

1、需新建屏幕1001 并画container:'CONT1'
2、需新建屏幕1002 并画container:'CONT2'
3、定义屏幕1001、1002的ok_code和逻辑流
4、定义工具栏

程序代码:

TABLES t001w.

TYPES:BEGIN OF typ_t001w ,
     werks  TYPE t001w-werks,
     name1  TYPE t001w-name1,
     werks2 TYPE t001w-werks,
  rowcolor  TYPE char10,
  zcheckbox TYPE c,       "LAYOUT-CHECBOX   =  'ZCHECKBOX'.
*  zflag     TYPE c,      "LAYOUT-BOX_FNAME = 'ZFLAG'.
  zicon     TYPE char10, "LAYOUT-ICON      = 'ZICON'  图标需要显示的
     END OF typ_t001w.

TYPES:BEGIN OF typ_smf ,
     werks  TYPE t001w-werks,
     name1  TYPE t001w-name1,
     END OF typ_smf.

DATA:i_t001w  TYPE TABLE OF typ_t001w,"""""第一次ALV内表
     i_detail TYPE TABLE OF typ_smf, """""单击ALV内表列ZICON显示的明细ALV内表
     i_smf    TYPE TABLE OF typ_smf.""""SF内表

DATA:fieldcat TYPE lvc_t_fcat,
     grid TYPE REF TO cl_gui_alv_grid,  "alv控件名
     grid2 TYPE REF TO cl_gui_alv_grid,  "alv控件名
     g_container TYPE scrfname VALUE 'CONT1',"重新定义本地容器对象名
     g_container2 TYPE scrfname VALUE 'CONT2',"重新定义本地容器对象名
     is_layout TYPE lvc_s_layo,
     ps_layout TYPE lvc_s_layo,
     g_custom_container TYPE REF TO cl_gui_custom_container,
     g_custom_container2 TYPE REF TO cl_gui_custom_container.

DATA: ui_functions TYPE ui_functions. "隐藏按钮的内表
*********ALV上事件捕捉类
DATA:gs_toolbar TYPE stb_button.             "按钮
CLASS alv_event_receiver DEFINITION DEFERRED. "声明类对象
*----------------------------------------------------------------------*
*       CLASS alv_event_receiver DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS alv_event_receiver DEFINITION.                  "声明类成员可见性
  PUBLIC SECTION.                                      "定义相关类成员可以被程序中的所有对象调用
    CLASS-METHODS:                                     "静态方法
      handle_toolbar                                   "初始化工具栏对象事件,如增加按钮并设定其属性
        FOR EVENT toolbar OF cl_gui_alv_grid
          IMPORTING e_object e_interactive,

       handle_menu_button                              "用于在下拉菜单中增加选项
         FOR EVENT menu_button OF cl_gui_alv_grid
          IMPORTING e_object e_ucomm,

       handle_user_command                             "工具栏中的按钮的单击事件
          FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING e_ucomm,

       handle_hotspot_click
          FOR EVENT hotspot_click OF cl_gui_alv_grid    "屏幕中的单击事件,可以具体到某行某列,需要设置热点
            IMPORTING  e_row_id e_column_id es_row_no,

       handle_double_click
          FOR EVENT double_click OF cl_gui_alv_grid     "屏幕中的双击事件,可以具体到某行某列,即使设置热点也必须双击
            IMPORTING e_row e_column es_row_no.
ENDCLASS.                    "alv_event_receiver DEFINITION
*&---------------------------------------------------------------------*
*&       Class (Implementation)  alv_event_receiver
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS alv_event_receiver IMPLEMENTATION.  "实现类方法
  METHOD handle_toolbar.
    gs_toolbar-function =  'B_SUM'.       "为按钮分配功能码
    gs_toolbar-icon     =  icon_display.  "为按钮分配图标
    gs_toolbar-text     =  '总行数'.      "为按钮分配文本
    gs_toolbar-butn_type = '0'.           "定义按钮类型,不填时默认为0
    APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏

    gs_toolbar-function =  'B_PRINT'.       "为按钮分配功能码
    gs_toolbar-icon     =  icon_import.  "为按钮分配图标
    gs_toolbar-text     =  '转储订单打印'.      "为按钮分配文本
    gs_toolbar-checked  = 'X'.
    gs_toolbar-butn_type = '0'.           "定义按钮类型,不填时默认为0
    APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏

    gs_toolbar-function =  'B_LIST'.      "为按钮分配功能码
    gs_toolbar-quickinfo = '自定义下拉菜单'.
    gs_toolbar-icon     =  icon_biw_report_view.  "为按钮分配图标
    gs_toolbar-text     =  '下拉菜单'.      "为按钮分配文本
    gs_toolbar-butn_type = '1'.           "定义按钮类型
    APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏

    gs_toolbar-function =  'B_EDIT'.       "为按钮分配功能码
    gs_toolbar-icon     =  icon_change.  "为按钮分配图标
    gs_toolbar-text     =  '切换编辑状态'.      "为按钮分配文本
    gs_toolbar-checked  = 'X'.
    gs_toolbar-butn_type = '0'.           "定义按钮类型,不填时默认为0
    APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏
  ENDMETHOD.                    "handle_toolbar
  METHOD handle_menu_button.
    IF e_ucomm = 'B_LIST'.
      CALL METHOD e_object->add_function
        EXPORTING
          icon  = icon_display
          fcode = 'B_SUM'
          text  = '显示ALV总数'.
    ENDIF.
  ENDMETHOD.                    "handle_menu_button
  METHOD handle_user_command.
    DATA sum TYPE i.
    DATA text TYPE string.
    DATA: lwa_t001w LIKE LINE OF i_t001w.
    DATA: lwa_smf   LIKE LINE OF i_smf.

    CASE e_ucomm.
      WHEN  'B_SUM'.
        DESCRIBE TABLE i_t001w[] LINES sum.
        text = sum.
        CONCATENATE  '当前表格中数据的总行数:' text  INTO text.
        MESSAGE  text  TYPE 'I'. "为何消息类型为 E 时运行时显示A类型,异常终止到初始界面
      WHEN 'B_PRINT'.
        LOOP AT i_t001w  INTO lwa_t001w WHERE  zcheckbox = 'X'.
          lwa_smf-werks = lwa_t001w-werks.
          lwa_smf-name1 = lwa_t001w-name1.
          APPEND  lwa_smf TO i_smf.
          CLEAR :lwa_t001w,lwa_smf.
        ENDLOOP.
        IF i_smf[] IS INITIAL.
          MESSAGE '请至少选择一行数据区打印!' TYPE 'E'. "E类型消息会转化为A类型,很蛋疼,求破!
        ELSE.
          PERFORM frm_print_data.  "这个没具体写。
        ENDIF.
      WHEN 'B_EDIT'.
        IF grid->is_ready_for_input( ) EQ 0.
          CALL METHOD grid->set_ready_for_input
            EXPORTING
              i_ready_for_input = 1.
        ELSE.
          CALL METHOD grid->set_ready_for_input
            EXPORTING
              i_ready_for_input = 0.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
  ENDMETHOD.                    "handle_user_command
  "ALV内表展示处单击事件捕捉,需要设置热点对单击列字段
  METHOD handle_hotspot_click.
    DATA:lwa_t001w LIKE LINE OF  i_t001w.
    READ TABLE i_t001w INTO lwa_t001w INDEX es_row_no-row_id. "判断行号
    CASE e_column_id-fieldname . "判断列名
      WHEN 'NAME1'.
        CALL TRANSACTION 'ME51N' AND SKIP FIRST SCREEN. "随便写的
      WHEN 'ZICON'.         "
        SELECT werks
               name1
          INTO TABLE i_detail
          FROM t001w
          WHERE werks = lwa_t001w-werks2.
        CLEAR lwa_t001w.
        IF sy-subrc NE 0.
          MESSAGE  'No result finding!' TYPE 'I'.
        ELSE.
          CALL SCREEN 1002.
        ENDIF.
      WHEN OTHERS.
    ENDCASE.
*    MESSAGE i001(00) WITH '当前行:' es_row_no-row_id ',航线代码:' ls_lt001w-werks.
  ENDMETHOD.                    "handle_hotspot_click
  "ALV内表展示处双击击事件捕捉,如果设置热点双击不起作用
  METHOD handle_double_click.
    DATA:lwa_t001w LIKE LINE OF i_t001w.
    READ TABLE i_t001w INTO lwa_t001w INDEX es_row_no-row_id.
    IF e_column-fieldname = 'WERKS'.
      SET PARAMETER ID 'AUN' FIELD lwa_t001w-werks.
      CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
    ENDIF.
  ENDMETHOD.                    "handle_double_click

ENDCLASS.               "alv_event_receiver
START-OF-SELECTION.
  CALL SCREEN 1001.

*&---------------------------------------------------------------------*
*&      Module  STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1001 OUTPUT.
  SET PF-STATUS 'T001'.
*  SET TITLEBAR 'xxx'.
ENDMODULE.                 " STATUS_1001  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1001 INPUT.
  FIELD-SYMBOLS <field> TYPE typ_t001w .
  DATA: i TYPE i VALUE 0.
  DATA ok_code TYPE sy-ucomm.
  ok_code = sy-ucomm.
  CLEAR sy-ucomm.

  CASE ok_code.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'EDIT'.
      IF grid->is_ready_for_input( ) EQ 0.
        CALL METHOD grid->set_ready_for_input
          EXPORTING
            i_ready_for_input = 1.
      ELSE.
        CALL METHOD grid->set_ready_for_input
          EXPORTING
            i_ready_for_input = 0.
      ENDIF.
    WHEN 'EXECU'.
      SELECT * FROM t001w
         INTO CORRESPONDING FIELDS OF TABLE i_t001w.
      LOOP AT  i_t001w  ASSIGNING <field>  .
        <field>-werks2 = <field>-werks.
        <field>-zicon  = '@16@'.  "图标
      ENDLOOP.

      IF g_custom_container IS INITIAL.
        PERFORM exclude_tb_functions CHANGING ui_functions. "隐藏某些按钮
        PERFORM frm_layout_set.
        PERFORM frm_fieldcat_set.
        PERFORM alv_show.
      ELSE.
        CALL METHOD grid->refresh_table_display. "刷新
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*&      Form  ALV_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alv_show .
  CREATE OBJECT g_custom_container                        "创建容器对象
        EXPORTING container_name = g_container.
  CREATE OBJECT grid                                      "创建ALV对象
        EXPORTING i_parent = g_custom_container.
  CALL METHOD grid->register_edit_event                   "可编辑回传方法
    EXPORTING
      i_event_id = grid->mc_evt_modified.
  CALL METHOD grid->set_table_for_first_display
    EXPORTING
*     I_BUFFER_ACTIVE      =
*     I_BYPASSING_BUFFER   =
*     I_CONSISTENCY_CHECK  =
*     I_STRUCTURE_NAME     = 'T001W'
*     IS_VARIANT           =
      i_save               = 'X'
*     I_DEFAULT            = 'X'
      is_layout            = is_layout
*     IS_PRINT             =
*     IT_SPECIAL_GROUPS    =
      it_toolbar_excluding = ui_functions[]
*     IT_HYPERLINK         =
*     IT_ALV_GRAPHICS      =
*     IT_EXCEPT_QINFO      =
*     IR_SALV_ADAPTER      =
    CHANGING
      it_outtab            = i_t001w[]
      it_fieldcatalog      = fieldcat[].
*           IT_SORT                       =
*           IT_FILTER                     =
*         EXCEPTIONS
*           INVALID_PARAMETER_COMBINATION = 1
*           PROGRAM_ERROR                 = 2
*           TOO_MANY_LINES                = 3
*           others                        = 4
  .

******注册ALV中引用的事件
  SET HANDLER alv_event_receiver=>handle_toolbar
              alv_event_receiver=>handle_menu_button
              alv_event_receiver=>handle_user_command
              alv_event_receiver=>handle_hotspot_click
              alv_event_receiver=>handle_double_click
           FOR ALL INSTANCES.
****调用方法激活自定义工具对象
  CALL METHOD grid->set_toolbar_interactive.
ENDFORM.                    " ALV_SHOW

*&---------------------------------------------------------------------*
*&      Form  exclude_tb_functions
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_EXCLUDE text
*----------------------------------------------------------------------*
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_filter . "过滤器
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_current_variant . "布局更改
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_average ."平均值
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_mb_sum ."求和
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_mb_export .   "导出
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut .        "剪切
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row . "删除行
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row . "插入行
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_refresh .  "刷新
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_find ."查找
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_sort_asc .  "升序排列
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_sort_dsc .  "降序排列
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_views .   "视图
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_print ."打印
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_detail . "详细按钮
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_graph . "显示图形
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_info . "最终用户文档
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row . "附加行
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row . "复制行
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy . "复制文本
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo . "撤消
  APPEND ls_exclude TO pt_exclude.
ENDFORM .                    "exclude_tb_functions
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_layout_set .
  is_layout-zebra = 'X' .
  is_layout-grid_title = '仓储转储订单跟踪及打印' .
  is_layout-smalltitle = 'X' .  "ALV 控制: 标题大小
  is_layout-cwidth_opt = 'X' . "优化列宽
*   is_layout-no_toolbar = 'X' . "隐藏按钮
  is_layout-sel_mode = 'A' . "flag选择方式 A:行和列的选择,无法选择单元格  多行,多列  B
  is_layout-info_fname = 'ROWCOLOR'.
ENDFORM.                    " FRM_LAYOUT_SET
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELDCAT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_fieldcat_set .
  DATA ls_fcat TYPE lvc_s_fcat .
  CLEAR ls_fcat .
  ls_fcat-fieldname = 'ZCHECKBOX' .
  ls_fcat-coltext = '选择'.
*  ls_fcat-emphasize = 'C601' ."列颜色控制
  ls_fcat-checkbox   = 'X'.
  ls_fcat-edit       = 'X'.
  APPEND ls_fcat TO fieldcat .

  CLEAR ls_fcat .
  ls_fcat-fieldname = 'WERKS' .
  ls_fcat-inttype = 'C' .
  ls_fcat-outputlen = '4' .
  ls_fcat-coltext = '工厂'."Carrier ID.列标题
  ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符
  ls_fcat-emphasize = 'C601' ."列颜色控制
*  ls_fcat-hotspot   = 'X'.  “不能设置hotspot  否则double click事件无效
  APPEND ls_fcat TO fieldcat .

  CLEAR ls_fcat .
  ls_fcat-fieldname = 'NAME1' .
  ls_fcat-ref_table = 'T001W' .
  ls_fcat-ref_field = 'NAME1' .
  ls_fcat-outputlen = '30' .
  ls_fcat-coltext = '工厂名称' .
  ls_fcat-hotspot   = 'X'.
  APPEND ls_fcat TO fieldcat .

  CLEAR ls_fcat .
  ls_fcat-fieldname = 'WERKS2' .
  ls_fcat-inttype = 'C' .
  ls_fcat-outputlen = '4' .
  ls_fcat-coltext = '工厂2号'."Carrier ID.列标题
  ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符
  ls_fcat-emphasize = 'C601' ."列颜色控制
  ls_fcat-edit    = 'X'.
  APPEND ls_fcat TO fieldcat .

  CLEAR ls_fcat .
  ls_fcat-fieldname = 'ZICON' .
  ls_fcat-coltext = '交货明细凭证'."Carrier ID.列标题
  ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符
  ls_fcat-icon    = 'X'.
  ls_fcat-hotspot   = 'X'.
  APPEND ls_fcat TO fieldcat .
  CLEAR ls_fcat .
ENDFORM.                    " FRM_FIELDCAT_SET
*&---------------------------------------------------------------------*
*&      Form  FRM_PRINT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_print_data .

ENDFORM.                    " FRM_PRINT_DATA
*&---------------------------------------------------------------------*
*&      Module  STATUS_1002  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_1002 OUTPUT.
  SET PF-STATUS 'T001'.
*  SET TITLEBAR 'xxx'.
  PERFORM  frm_alv_show_detail.
ENDMODULE.                 " STATUS_1002  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_SHOW_DETAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_show_detail .
  DATA: ls_fcat  TYPE lvc_s_fcat ,
       fieldcat2 TYPE lvc_t_fcat.
  ls_fcat-fieldname = 'WERKS' .
  ls_fcat-coltext = '工厂'."Carrier ID.列标题
  APPEND ls_fcat TO fieldcat2 .
  CLEAR ls_fcat .
  ls_fcat-fieldname = 'NAME1' .
  ls_fcat-coltext = '工厂名称'.
  APPEND ls_fcat TO fieldcat2 .
  CLEAR ls_fcat .

  ps_layout-zebra = 'X' .
  ps_layout-grid_title = '交货明细凭证' .
  ps_layout-smalltitle = 'X' .  "ALV 控制: 标题大小
  ps_layout-cwidth_opt = 'X' . "优化列宽
  ps_layout-no_toolbar = 'X' . "隐藏按钮
*  ps_layout-SEL_MODE = 'A' . "flag选择方式 A:行和列的选择,无法选择单元格  多行,多列  B
*  ps_layout-info_fname = 'ROWCOLOR'.

  IF g_custom_container2 IS INITIAL.
    CREATE OBJECT g_custom_container2                        "创建容器对象
     EXPORTING container_name = g_container2.
    CREATE OBJECT grid2                                      "创建ALV对象
     EXPORTING i_parent = g_custom_container2.
  ELSE.
    CALL METHOD grid2->refresh_table_display. "刷新
  ENDIF.
  CALL METHOD grid2->set_table_for_first_display
    EXPORTING
*     I_BUFFER_ACTIVE      =
*     I_BYPASSING_BUFFER   =
*     I_CONSISTENCY_CHECK  =
*     I_STRUCTURE_NAME     = 'T001W'
*     IS_VARIANT           =
      i_save               = 'X'
*     I_DEFAULT            = 'X'
      is_layout            = ps_layout
*     IS_PRINT             =
*     IT_SPECIAL_GROUPS    =
*     IT_TOOLBAR_EXCLUDING =
*     IT_HYPERLINK         =
*     IT_ALV_GRAPHICS      =
*     IT_EXCEPT_QINFO      =
*     IR_SALV_ADAPTER      =
    CHANGING
      it_outtab            = i_detail[]
      it_fieldcatalog      = fieldcat2[].
*           IT_SORT                       =
*           IT_FILTER                     =
*         EXCEPTIONS
*           INVALID_PARAMETER_COMBINATION = 1
*           PROGRAM_ERROR                 = 2
*           TOO_MANY_LINES                = 3
*           others                        = 4
  .
ENDFORM.                    " FRM_ALV_SHOW_DETAIL
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1002  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_1002 INPUT.
  DATA ok_code2 TYPE sy-ucomm.
  ok_code2 = sy-ucomm.
  CLEAR sy-ucomm.
  CASE ok_code2.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_1002  INPUT

 程序执行效果:

点击“明细” 跳入第二屏,更多按钮响应效果自己体验

 

 sap系统的ooalv的学习标准程序:
BCALV_EDIT_01
BCALV_EDIT_02
BCALV_EDIT_03
BCALV_EDIT_04
BCALV_EDIT_05 双击编辑单元格,更改编辑状态(ooalv 单元格控制)
BCALV_EDIT_06
BCALV_EDIT_07
BCALV_EDIT_08

<think>首先,用户的问题是关于在SAP ABAP中处理OO ALV的回车事件。用户问的是“SAP ABAP OO ALV 回车事件处理方法”。 我需要回顾系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户可见层: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户提供了引用内容: - 引用[1]: 关于OOALV事件,声明事件的位置。 - 引用[2]: 通过按回车键触发事件,使用CALL METHOD gs_alv->register_edit_event。 - 引用[3]: 关于ALV事件,包括一个FORM子例程来设置事件。 这些引用是相关的,但我需要基于这些信息构建一个完整的回答。 用户的问题具体是处理回车事件,所以焦点在回车事件上。 在ABAP OO ALV中,回车事件通常用于处理当用户在ALV网格中按回车键时触发的动作。这涉及到事件处理机制。 关键步骤: 1. 定义事件:在类定义中声明事件。 2. 注册事件:在运行时注册事件,以便ALV知道要处理哪些事件。 3. 实现事件处理方法:编写方法来处理事件。 从引用[2]中,我们可以看到使用register_edit_event来注册编辑事件,特别是mc_evt_enter,这代表回车事件。 引用[3]显示了一个FORM子例程来设置事件,但这是在OO ALV中,所以我们应该使用面向对象的方式。 在OO ALV中,我们使用CL_GUI_ALV_GRID类。 步骤: 1. 创建ALV网格实例。 2. 注册事件:使用register_edit_event方法注册回车事件。 3. 定义事件处理方法:在类中实现一个方法来处理回车事件。 4. 设置事件处理器:将事件与处理方法关联。 在回答中,我应该提供代码示例,就像在示例中一样。 用户提到的引用中,引用[2]有代码:CALL METHOD gs_alv->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. 这注册了回车事件。 然后,我们需要在事件发生时处理它。这通常通过实现一个事件处理程序方法来完成。 在ABAP中,事件处理程序方法需要特定的签名。 例如,对于回车事件,我们可能需要处理DATA_CHANGED事件或类似事件,但回车事件是编辑事件的一部分。 在CL_GUI_ALV_GRID中,事件如DATA_CHANGED或USER_COMMAND可能被触发,但回车事件是特定的编辑事件。 从引用[2],mc_evt_enter是回车事件。 注册后,当用户按回车键时,可能会触发事件,我们需要捕获它。 在OO ALV中,事件处理是通过设置事件处理程序来完成的。 标准方式: - 定义一个本地类,实现事件处理接口。 - 或者,在现有类中实现方法。 常见事件: - 对于编辑事件,如回车,注册后,当事件发生时,会触发DATA_CHANGED事件或其他事件。 我需要确保我的知识正确。 在ABAP OO ALV中,处理回车事件的步骤: 1. 创建ALV网格:使用CL_GUI_ALV_GRID。 2. 注册编辑事件:使用register_edit_event方法,指定i_event_id为mc_evt_enter。 3. 定义事件处理程序:例如,对于DATA_CHANGED事件,因为当用户按回车键时,如果单元格被编辑,可能会触发DATA_CHANGED。 在ALV网格中,回车事件通常用于确认编辑或移动到下一个单元格。如果我们想执行自定义操作,我们需要处理相关事件。 引用[2]直接提到register_edit_event for mc_evt_enter,这注册了回车事件。 然后,当回车键被按下时,事件会被触发,我们需要有一个事件处理程序来捕获它。 在ABAP中,事件处理程序方法需要定义在类中。 例如: - 定义一个类,实现IF_ALV_GRID_EVENT_HANDLER接口或类似。 CL_GUI_ALV_GRID有事件如TOOLBAR, USER_COMMAND, DATA_CHANGED等。 对于编辑事件,DATA_CHANGED事件在数据更改时触发,包括当用户按回车键确认编辑时。 但mc_evt_enter是专门用于回车键的。 在注册后,当回车键被按下,事件被触发,然后我们可以处理它。 在事件处理中,我们需要实现一个方法,例如HANDLE_DATA_CHANGED或自定义方法。 步骤总结: 1. 在类定义中声明事件处理程序方法。 2. 在类实现中实现该方法。 3. 在创建ALV后,注册事件:调用register_edit_event。 4. 设置事件处理程序:使用SET_HANDLER方法将事件与处理程序方法关联。 从引用[1]和[2],我们可以看到注册事件的部分。 在回答中,我应该提供清晰的步骤和代码示例。 结构回答: - 介绍:简要解释OO ALV事件处理。 - 步骤1:声明事件处理程序(在类定义中)。 - 步骤2:实现事件处理程序方法。 - 步骤3:创建ALV网格并注册回车事件。 - 步骤4:设置事件处理程序。 - 代码示例。 - 相关问题。 使用中文回答。 生成相关问题。 引用处理:在回答中,如果引用用户提供的引用内容,在末尾添加引用标识。 例如,参考引用[2]时,添加[^2]。 现在,构建回答。 首先,回答用户问题:处理回车事件的方法。 关键点: - 使用register_edit_event注册回车事件。 - 实现事件处理程序来处理事件。 在事件处理中,对于回车事件,我们可能需要处理DATA_CHANGED事件,因为回车键通常用于确认编辑。 在CL_GUI_ALV_GRID中,当我们注册编辑事件时,事件如DATA_CHANGED会被触发。 例如: - 注册回车事件:gs_alv->register_edit_event( i_event_id = cl_gui_alv_grid=>mc_evt_enter ). - 然后,当用户按回车键时,DATA_CHANGED事件被触发,如果我们有处理程序。 所以,我们需要实现DATA_CHANGED事件的处理程序。 在类定义中: METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after. 类似这样。 然后实现该方法。 在设置ALV时,设置处理程序。 代码示例: ```abap " 定义本地类来处理事件 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed. " 在这里处理回车事件,当数据改变时触发 " 可以检查是否是回车键导致的 " 实际逻辑 ENDMETHOD. ENDCLASS. " 在主要程序中 DATA: go_alv TYPE REF TO cl_gui_alv_grid, go_handler TYPE REF TO lcl_event_handler. " 创建ALV实例 CREATE OBJECT go_alv EXPORTING i_parent = cl_gui_container=>screen0. " 或适当容器 " 创建事件处理器实例 CREATE OBJECT go_handler. " 设置事件处理程序 SET HANDLER go_handler->handle_data_changed FOR go_alv. " 注册回车事件 CALL METHOD go_alv->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. " 回车事件 " 然后显示ALV ``` 在handle_data_changed方法中,我们可以执行自定义操作,如验证数据、更新其他字段等。 用户可能想知道如何具体处理回车事件,比如在按回车时执行某些动作。 在事件处理中,我们可以访问er_data_changed对象,它包含更改的数据。 但为了专门处理回车键,我们可能需要其他方式,因为DATA_CHANGED事件在编辑时都会触发。 在ABAP中,回车事件注册后,当用户按回车键,事件被触发,但处理还是通过DATA_CHANGED事件。 所以,上述方法是标准的。 现在,生成相关问题。 基于主题,相关问题可以是: 1. 如何处理其他ALV事件,如双击事件? 2. 如何优化OO ALV事件处理性能? 3. OO ALV事件处理在实际应用中的案例? 最后,确保回答结构清晰。</think>### SAP ABAP OO ALV 回车事件处理方法 在SAP ABAP中,处理OO ALV(面向对象的ALV)的回车事件(即用户按回车键时触发的动作)是常见的需求,用于实现数据验证、自动填充或导航等逻辑。OO ALV 基于 `CL_GUI_ALV_GRID` 类,事件处理机制涉及声明事件、注册事件和实现事件处理方法。以下是详细步骤和代码示例,确保真实可靠(基于ABAP OO标准实践)。 #### 步骤1: 声明事件处理程序(在类定义中) 在ABAP类中声明事件处理程序方法。这通常在本地类(local class)中完成,专门处理ALV事件。 - 关键点:使用 `FOR EVENT` 子句绑定到 `cl_gui_alv_grid` 的事件(如 `data_changed`),因为回车事件注册后会触发此事件[^2]。 - 示例代码: ```abap " 定义本地类来处理事件 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid " 绑定到数据更改事件 IMPORTING er_data_changed. " 导入参数:包含更改数据的对象 ENDCLASS. ``` #### 步骤2: 实现事件处理程序方法(在类实现中) 在类实现中编写方法逻辑,处理回车事件。当用户按回车键时,`data_changed` 事件被触发,可通过 `er_data_changed` 对象访问修改的数据。 - 关键点:在方法内检查事件来源(如回车键),并执行自定义逻辑(如数据验证或更新)。 - 示例代码: ```abap CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed. " 检查是否是回车事件触发的数据更改(可通过上下文判断) DATA(lv_is_enter) = abap_true. " 假设回车事件触发 IF lv_is_enter = abap_true. " 执行自定义逻辑,例如验证数据或更新字段 MESSAGE '回车事件已处理:数据已确认' TYPE 'S' DISPLAY LIKE 'I'. ENDIF. ENDMETHOD. ENDCLASS. ``` #### 步骤3: 创建ALV网格并注册回车事件 在主要程序(如报表或屏幕程序)中创建ALV网格实例,并使用 `register_edit_event` 方法注册回车事件。 - 关键点:注册事件时指定 `i_event_id = cl_gui_alv_grid=>mc_evt_enter`,这表示回车事件[^2]。 - 示例代码: ```abap " 主要程序中的变量声明 DATA: go_alv TYPE REF TO cl_gui_alv_grid, " ALV网格对象 go_handler TYPE REF TO lcl_event_handler, " 事件处理器对象 gt_data TYPE TABLE OF your_table. " 数据表(替换为实际表) " 创建ALV网格实例(假设容器已定义) CREATE OBJECT go_alv EXPORTING i_parent = cl_gui_container=>screen0. " 容器对象,如屏幕或自定义容器 " 创建事件处理器实例 CREATE OBJECT go_handler. " 注册回车事件 CALL METHOD go_alv->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. " 回车事件标识[^2] " 显示ALV(设置表和布局) CALL METHOD go_alv->set_table_for_first_display EXPORTING i_structure_name = 'YOUR_TABLE' " 替换为实际表名 CHANGING it_outtab = gt_data. ``` #### 步骤4: 设置事件处理程序关联 将事件处理程序方法与ALV网格关联,确保事件触发时调用方法。 - 关键点:使用 `SET HANDLER` 语句将处理器绑定到ALV实例。 - 示例代码: ```abap " 关联事件处理程序 SET HANDLER go_handler->handle_data_changed FOR go_alv. " 绑定到ALV对象 ``` #### 完整示例代码 以下是一个整合的简单示例,展示在报表中实现回车事件处理: ```abap REPORT z_ooalv_enter_event_demo. " 数据定义 DATA: gt_data TYPE TABLE OF sflight, " 示例表 go_alv TYPE REF TO cl_gui_alv_grid, go_handler TYPE REF TO lcl_event_handler. " 定义本地类 CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_data_changed. " 简单逻辑:显示消息确认回车事件 MESSAGE '回车事件触发:数据已处理' TYPE 'I'. ENDMETHOD. ENDCLASS. START-OF-SELECTION. " 填充数据(示例) SELECT * FROM sflight INTO TABLE gt_data UP TO 20 ROWS. " 创建ALV和处理器 CREATE OBJECT go_alv EXPORTING i_parent = cl_gui_container=>screen0. CREATE OBJECT go_handler. " 注册事件和设置处理程序 SET HANDLER go_handler->handle_data_changed FOR go_alv. CALL METHOD go_alv->register_edit_event EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_enter. " 显示ALV CALL METHOD go_alv->set_table_for_first_display EXPORTING i_structure_name = 'SFLIGHT' CHANGING it_outtab = gt_data. ``` ### 注意事项 - **事件触发时机**:回车事件注册后,当用户按回车键时,会触发 `data_changed` 事件。`er_data_changed` 参数提供更改的详细信息(如单元格值),可在方法内使用其方法(如 `get_cell_value`)进行深度处理[^1]。 - **性能优化**:避免在事件处理中执行耗时操作(如数据库更新),以防界面卡顿。建议使用后台任务或异步处理。 - **错误处理**:在事件方法中添加异常捕获(`TRY...CATCH`),确保事件失败时不影响整体程序。 - **调试技巧**:使用 `BREAK-POINT` 在事件方法内调试,验证事件是否被正确触发[^3]。 通过以上步骤,您可以高效处理OO ALV的回车事件事件机制是ABAP面向对象的核心,理解声明和触发位置对调试至关重要[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值