ALV报表——复选框、点击事件(二)
PS:请自行忽略gif的水印,使用Function REUSE_ALV_FIELDCATALOG_MERGE后注意单行代码不要超过72字节
一、复选框
ALV的复选框有两种方式实现,一种是使用Layout属性,另一种是使用Fieldcat属性
1、Layout实现方式
最简单的实现方式,这种方式能直接使用ALV报表自带的全选和反全选按钮,多选的话需要按住Ctrl再进行鼠标点选
代码:
************************************************************************ * Type Pools Definitions 定义类型池 ************************************************************************ TYPE-POOLS slis. ************************************************************************ * Tables Definitions ************************************************************************ TABLES: marc,ekpo. ************************************************************************ * Data Definitions ************************************************************************ TYPES: BEGIN OF ty_data, sel TYPE c, "复选框 ebeln TYPE ekpo-ebeln, "PO ebelp TYPE ekpo-ebelp, "PO项次 END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data. DATA: gs_layout TYPE slis_layout_alv, "布局 gt_fieldcat TYPE slis_t_fieldcat_alv. "字段 ************************************************************************ * Includes Module ************************************************************************ ************************************************************************ * Selection Screen ************************************************************************ SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01. PARAMETERS: p_werks LIKE marc-werks OBLIGATORY DEFAULT '2000'. SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln, s_ebelp FOR ekpo-ebelp. SELECTION-SCREEN END OF BLOCK b1. ************************************************************************ * Initialization ************************************************************************ INITIALIZATION. ************************************************************************ * At Selection Screen ************************************************************************ AT SELECTION-SCREEN. ************************************************************************ * At Selection Screen Output ************************************************************************ AT SELECTION-SCREEN OUTPUT. ************************************************************************ * Report Format ************************************************************************ TOP-OF-PAGE. END-OF-PAGE. ************************************************************************ * Main Process ************************************************************************ START-OF-SELECTION. "获取采购单数据 PERFORM frm_get_data. "显示ALV PERFORM frm_display_data. END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . SELECT ebeln ebelp INTO CORRESPONDING FIELDS OF TABLE gt_data FROM ekpo WHERE bukrs = p_werks AND ebeln IN s_ebeln AND ebelp IN s_ebelp. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_display_data . "复选框 gs_layout-box_fieldname = 'SEL'. "栏位最适宽度 gs_layout-colwidth_optimize = 'X'. "ALV条纹 gs_layout-zebra = 'X'. "构建ALV的栏位 PERFORM frm_create_field. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = gs_layout it_fieldcat = gt_fieldcat[] i_save = 'A' TABLES t_outtab = gt_data EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_FIELD *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_field . DATA: ls_fieldcat TYPE slis_fieldcat_alv, lv_count TYPE i. DEFINE fieldcat. ADD 1 TO lv_count. "栏位显示顺序 ls_fieldcat-col_pos = lv_count. "内表栏位 ls_fieldcat-fieldname = &1. "参考栏位 ls_fieldcat-ref_fieldname = &2. "参考表 ls_fieldcat-ref_tabname = &3. "单位 ls_fieldcat-qfieldname = &4. "栏位标题 ls_fieldcat-seltext_s = ls_fieldcat-seltext_m = ls_fieldcat-seltext_l = &5. "显示长文或中等文或短文 ls_fieldcat-ddictxt = &6. APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat. END-OF-DEFINITION. fieldcat 'EBELN' 'EBELN' 'EKPO' '' '' ''. fieldcat 'EBELP' 'EBELP' 'EKPO' '' '' ''. ENDFORM.
运行效果:
2、Fieldcat实现方式
Fieldcat实现方式不可使用ALV报表自带的全选和反全选按钮,需要自定义全选和反全选的点击按钮事件
代码:
************************************************************************ * Type Pools Definitions 定义类型池 ************************************************************************ TYPE-POOLS slis. ************************************************************************ * Tables Definitions ************************************************************************ TABLES: marc,ekpo. ************************************************************************ * Data Definitions ************************************************************************ TYPES: BEGIN OF ty_data, sel TYPE c, "复选框 ebeln TYPE ekpo-ebeln, "PO ebelp TYPE ekpo-ebelp, "PO项次 END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data. DATA: gs_layout TYPE slis_layout_alv, "布局 gt_fieldcat TYPE slis_t_fieldcat_alv. "字段 ************************************************************************ * Includes Module ************************************************************************ ************************************************************************ * Selection Screen ************************************************************************ SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01. PARAMETERS: p_werks LIKE marc-werks OBLIGATORY DEFAULT '2000'. SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln, s_ebelp FOR ekpo-ebelp. SELECTION-SCREEN END OF BLOCK b1. ************************************************************************ * Initialization ************************************************************************ INITIALIZATION. ************************************************************************ * At Selection Screen ************************************************************************ AT SELECTION-SCREEN. ************************************************************************ * At Selection Screen Output ************************************************************************ AT SELECTION-SCREEN OUTPUT. ************************************************************************ * Report Format ************************************************************************ TOP-OF-PAGE. END-OF-PAGE. ************************************************************************ * Main Process ************************************************************************ START-OF-SELECTION. "获取采购单数据 PERFORM frm_get_data. "显示ALV PERFORM frm_display_data. END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . DATA: ls_data TYPE ty_data. SELECT ebeln ebelp INTO CORRESPONDING FIELDS OF TABLE gt_data FROM ekpo WHERE bukrs = p_werks AND ebeln IN s_ebeln AND ebelp IN s_ebelp. ls_data-sel = '0'. MODIFY gt_data FROM ls_data TRANSPORTING sel WHERE sel = ''. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_display_data . "栏位最适宽度 gs_layout-colwidth_optimize = 'X'. "ALV条纹 gs_layout-zebra = 'X'. "构建ALV的栏位 PERFORM frm_create_field. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = gs_layout it_fieldcat = gt_fieldcat[] i_save = 'A' i_callback_pf_status_set = 'FRM_STATUS_SET' "状态栏 i_callback_user_command = 'FRM_USER_COMMAND' "按钮操作 TABLES t_outtab = gt_data EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_FIELD *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_field . DATA: ls_fieldcat TYPE slis_fieldcat_alv, lv_count TYPE i. DEFINE fieldcat. ADD 1 TO lv_count. "栏位显示顺序 ls_fieldcat-col_pos = lv_count. "内表栏位 ls_fieldcat-fieldname = &1. "参考栏位 ls_fieldcat-ref_fieldname = &2. "参考表 ls_fieldcat-ref_tabname = &3. "单位 ls_fieldcat-qfieldname = &4. "栏位标题 ls_fieldcat-seltext_s = ls_fieldcat-seltext_m = ls_fieldcat-seltext_l = &5. "显示长文或中等文或短文 ls_fieldcat-ddictxt = &6. "复选框 ls_fieldcat-checkbox = &7. "热点事件 ls_fieldcat-hotspot = &8. APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat. END-OF-DEFINITION. fieldcat 'SEL' '' '' '' '复选框' 'L' 'X' 'X'. fieldcat 'EBELN' 'EBELN' 'EKPO' '' '' '' '' ''. fieldcat 'EBELP' 'EBELP' 'EKPO' '' '' '' '' ''. ENDFORM. *&---------------------------------------------------------------------* *& FORM FRM_PF_STATUS *&---------------------------------------------------------------------* *& GUI状态栏 *&---------------------------------------------------------------------* FORM frm_status_set USING it_extab TYPE slis_t_extab. SET PF-STATUS 'PF_001'. ENDFORM. *&---------------------------------------------------------------------* *& FORM FRM_PF_STATUS *&---------------------------------------------------------------------* *& 按钮操作 *&---------------------------------------------------------------------* FORM frm_user_command USING lv_ucomm LIKE sy-ucomm ls_selfield TYPE slis_selfield. DATA: lc_grid TYPE REF TO cl_gui_alv_grid, ls_stbl TYPE lvc_s_stbl, ls_data TYPE ty_data. DATA: lv_refresh TYPE flag. lv_refresh = abap_true. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING e_grid = lc_grid. CALL METHOD lc_grid->check_changed_data. "稳定刷新,保持滚动条位置 ls_stbl-row = ls_stbl-col = 'X'. CASE lv_ucomm. WHEN '&ZALL'. "全选 ls_data-sel = '1'. MODIFY gt_data FROM ls_data TRANSPORTING sel WHERE sel = ''. WHEN '&ZSAL'. "取消全选 ls_data-sel = '0'. MODIFY gt_data FROM ls_data TRANSPORTING sel WHERE sel = '1'. WHEN '&IC1'. "单选,如果未设置 ls_fieldcat-hotspot,则为行双击 READ TABLE gt_data INTO ls_data INDEX ls_selfield-tabindex. IF ls_selfield-fieldname = 'SEL'. IF ls_selfield-value = '1'. ls_data-sel = '0'. ELSE. ls_data-sel = '1'. ENDIF. MODIFY gt_data FROM ls_data TRANSPORTING sel WHERE ebeln = ls_data-ebeln. ENDIF. WHEN '&DATA'. lv_refresh = abap_false. cl_demo_output=>write( gt_data ). cl_demo_output=>display( ). WHEN OTHERS. lv_refresh = abap_false. ENDCASE. IF lv_refresh = abap_true. "刷新ALV CALL METHOD lc_grid->refresh_table_display EXPORTING is_stable = ls_stbl. ENDIF. ENDFORM.
自定义按钮:
运行效果:
二、点击事件
1、行双击
代码:
************************************************************************ * Type Pools Definitions 定义类型池 ************************************************************************ TYPE-POOLS slis. ************************************************************************ * Tables Definitions ************************************************************************ TABLES: marc,ekpo. ************************************************************************ * Data Definitions ************************************************************************ TYPES: BEGIN OF ty_data, ebeln TYPE ekpo-ebeln, "PO ebelp TYPE ekpo-ebelp, "PO项次 END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data. DATA: gs_layout TYPE slis_layout_alv, "布局 gt_fieldcat TYPE slis_t_fieldcat_alv. "字段 ************************************************************************ * Includes Module ************************************************************************ ************************************************************************ * Selection Screen ************************************************************************ SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01. PARAMETERS: p_werks LIKE marc-werks OBLIGATORY DEFAULT '2000'. SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln, s_ebelp FOR ekpo-ebelp. SELECTION-SCREEN END OF BLOCK b1. ************************************************************************ * Initialization ************************************************************************ INITIALIZATION. ************************************************************************ * At Selection Screen ************************************************************************ AT SELECTION-SCREEN. ************************************************************************ * At Selection Screen Output ************************************************************************ AT SELECTION-SCREEN OUTPUT. ************************************************************************ * Report Format ************************************************************************ TOP-OF-PAGE. END-OF-PAGE. ************************************************************************ * Main Process ************************************************************************ START-OF-SELECTION. "获取采购单数据 PERFORM frm_get_data. "显示ALV PERFORM frm_display_data. END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . SELECT ebeln ebelp INTO CORRESPONDING FIELDS OF TABLE gt_data FROM ekpo WHERE bukrs = p_werks AND ebeln IN s_ebeln AND ebelp IN s_ebelp. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_display_data . "栏位最适宽度 gs_layout-colwidth_optimize = 'X'. "ALV条纹 gs_layout-zebra = 'X'. "构建ALV的栏位 PERFORM frm_create_field. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = gs_layout it_fieldcat = gt_fieldcat[] i_save = 'A' i_callback_user_command = 'FRM_USER_COMMAND' "按钮操作 TABLES t_outtab = gt_data EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_FIELD *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_field . DATA: ls_fieldcat TYPE slis_fieldcat_alv, lv_count TYPE i. DEFINE fieldcat. ADD 1 TO lv_count. "栏位显示顺序 ls_fieldcat-col_pos = lv_count. "内表栏位 ls_fieldcat-fieldname = &1. "参考栏位 ls_fieldcat-ref_fieldname = &2. "参考表 ls_fieldcat-ref_tabname = &3. "单位 ls_fieldcat-qfieldname = &4. "栏位标题 ls_fieldcat-seltext_s = ls_fieldcat-seltext_m = ls_fieldcat-seltext_l = &5. "显示长文或中等文或短文 ls_fieldcat-ddictxt = &6. APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat. END-OF-DEFINITION. fieldcat 'EBELN' 'EBELN' 'EKPO' '' '' ''. fieldcat 'EBELP' 'EBELP' 'EKPO' '' '' ''. ENDFORM. *&---------------------------------------------------------------------* *& FORM FRM_PF_STATUS *&---------------------------------------------------------------------* *& 按钮操作 *&---------------------------------------------------------------------* FORM frm_user_command USING iv_ucomm LIKE sy-ucomm is_selfield TYPE slis_selfield. DATA: ls_data TYPE ty_data. CASE iv_ucomm. WHEN '&IC1'. "行双击 READ TABLE gt_data INTO ls_data INDEX is_selfield-tabindex. cl_demo_output=>write( ls_data ). cl_demo_output=>display( ). ENDCASE. ENDFORM.
运行效果:
2、单元格双击事件
(双击PO进入ME23N显示PO,双击物料进入MM03显示物料)
代码:
************************************************************************ * Type Pools Definitions 定义类型池 ************************************************************************ TYPE-POOLS slis. ************************************************************************ * Tables Definitions ************************************************************************ TABLES: marc,ekpo. ************************************************************************ * Data Definitions ************************************************************************ TYPES: BEGIN OF ty_data, ebeln TYPE ekpo-ebeln, "PO ebelp TYPE ekpo-ebelp, "PO项次 END OF ty_data. DATA: gt_data TYPE TABLE OF ty_data. DATA: gs_layout TYPE slis_layout_alv, "布局 gt_fieldcat TYPE slis_t_fieldcat_alv. "字段 ************************************************************************ * Includes Module ************************************************************************ ************************************************************************ * Selection Screen ************************************************************************ SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01. PARAMETERS: p_werks LIKE marc-werks OBLIGATORY DEFAULT '2000'. SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln, s_ebelp FOR ekpo-ebelp. SELECTION-SCREEN END OF BLOCK b1. ************************************************************************ * Initialization ************************************************************************ INITIALIZATION. ************************************************************************ * At Selection Screen ************************************************************************ AT SELECTION-SCREEN. ************************************************************************ * At Selection Screen Output ************************************************************************ AT SELECTION-SCREEN OUTPUT. ************************************************************************ * Report Format ************************************************************************ TOP-OF-PAGE. END-OF-PAGE. ************************************************************************ * Main Process ************************************************************************ START-OF-SELECTION. "获取采购单数据 PERFORM frm_get_data. "显示ALV PERFORM frm_display_data. END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_get_data . SELECT ebeln ebelp INTO CORRESPONDING FIELDS OF TABLE gt_data FROM ekpo WHERE bukrs = p_werks AND ebeln IN s_ebeln AND ebelp IN s_ebelp. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_DISPLAY_DATA *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_display_data . "栏位最适宽度 gs_layout-colwidth_optimize = 'X'. "ALV条纹 gs_layout-zebra = 'X'. "构建ALV的栏位 PERFORM frm_create_field. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = gs_layout it_fieldcat = gt_fieldcat[] i_save = 'A' i_callback_user_command = 'FRM_USER_COMMAND' "按钮操作 TABLES t_outtab = gt_data EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CREATE_FIELD *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_create_field . DATA: ls_fieldcat TYPE slis_fieldcat_alv, lv_count TYPE i. DEFINE fieldcat. ADD 1 TO lv_count. "栏位显示顺序 ls_fieldcat-col_pos = lv_count. "内表栏位 ls_fieldcat-fieldname = &1. "参考栏位 ls_fieldcat-ref_fieldname = &2. "参考表 ls_fieldcat-ref_tabname = &3. "单位 ls_fieldcat-qfieldname = &4. "栏位标题 ls_fieldcat-seltext_s = ls_fieldcat-seltext_m = ls_fieldcat-seltext_l = &5. "显示长文或中等文或短文 ls_fieldcat-ddictxt = &6. APPEND ls_fieldcat TO gt_fieldcat. CLEAR ls_fieldcat. END-OF-DEFINITION. fieldcat 'EBELN' 'EBELN' 'EKPO' '' '' ''. fieldcat 'EBELP' 'EBELP' 'EKPO' '' '' ''. ENDFORM. *&---------------------------------------------------------------------* *& FORM FRM_PF_STATUS *&---------------------------------------------------------------------* *& 按钮操作 *&---------------------------------------------------------------------* FORM frm_user_command USING iv_ucomm LIKE sy-ucomm is_selfield TYPE slis_selfield. DATA: ls_data TYPE ty_data. CASE iv_ucomm. WHEN '&IC1'. "行双击 CASE is_selfield-fieldname. "双击的栏位名 WHEN 'EBELN'. "PARAMETER ID通过F1->technical information->Parameter id可以获得 SET PARAMETER ID: 'BES' FIELD is_selfield-value. CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN. ENDCASE. ENDCASE. ENDFORM.
运行效果:
落霞与孤鹜齐飞,秋水共长天一色