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.
View Code

运行效果:

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.
View Code

自定义按钮:

运行效果:

二、点击事件

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.
View Code

运行效果:

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.
View Code

运行效果:

posted @ 2017-12-23 13:51  鲸与海  阅读(3276)  评论(0编辑  收藏  举报