05、基于ALV表报实现复选框、全选、取消全选等功能

01、复选框

(1)复选框的概念

  **复选框**在QT界面开发、Web界面开发中很常见,名称类似,均为checkbox,checkbox仅仅只是一个勾选的标识,即打勾的方框,通过标识可以在后端进行流程控制(即if…else),实现具体的功能。

(2)复选框代码的实现

  1 复选框字段的定义,首先在内表中设置复选框字段

*直接定义内表
DATA: BEGIN OF item OCCURS 0,
        SEL(1) TYPE c, "复选框字段
        matnr  LIKE mara-matnr, "物料编号
        mtart  LIKE mara-mtart, "物料类型
        matkl  LIKE mara-matkl, "物料组
      END OF item.

  2 在fieldcat的FROM中设置"复选框"字段,进行关联

FORM frm_set_fieldcat.
  DATA: lv_count TYPE i.
  DEFINE set_fieldcat.
    CLEAR gs_fcat_lvc .
    ADD 1 TO lv_count.
    gs_fcat_lvc-col_pos   = lv_count. " 栏位显示顺序
    gs_fcat_lvc-fieldname = &1."内表字段
    gs_fcat_lvc-outputlen = &2."输出长度
    gs_fcat_lvc-scrtext_l = gs_fcat_lvc-scrtext_s = gs_fcat_lvc-scrtext_m = &3."在ALV里面显示的名字
    gs_fcat_lvc-just      = &4. "水平对齐方式,L左对齐,R右对齐
    gs_fcat_lvc-lzero     = &5. "输出前导0
    gs_fcat_lvc-no_zero   = &6.
    gs_fcat_lvc-checkbox  = &7. "复选框
    gs_fcat_lvc-hotspot   = &8. "设置热点
    APPEND gs_fcat_lvc TO gt_fcat_lvc.
    CLEAR gs_fcat_lvc.
  END-OF-DEFINITION.
  set_fieldcat:
    'SEL'     ''      '复选框'         ''  ''  '' 'X' 'X',
    'MATNR'   ''      '物料编号'        ''  ''  '' '' '',
    'MTART'   ''      '物料类型'        ''  ''  '' '' '',
    'MATKL'   ''      '物料组'        ''  ''  '' '' ''.
ENDFORM.

02、全选、取消全选按钮的实现

(1)按钮的概念

  **按钮**在QT界面开发、Web界面开发中也十分常见,名称类似,均为button,button同样仅仅只是一个标识,通过点击按钮可以在后端进行流程控制,实现具体的功能。

(2)按钮界面配置

1 设置一个FROM,PF-STATUS我命名为ZSTATUS_ZSD_ALV,SAP GUI开发双击ZSTATUS_ZSD_ALV进入到按钮配置界面,eclipse开发用ctrl+左击进入按钮配置界面(SE41也可以设置界面,笔者没怎么用过,抱歉)

具体按钮配置流程,参考这个博主https://blog.csdn.net/xuehen86/article/details/105992525/

FORM FRM_SET_STATUS USING rt_extab TYPE slis_t_extab.
    SET PF-STATUS 'ZSTATUS_ZSD_ALV' .
ENDFORM.

在这里插入图片描述

(3)按钮全选和取消全选的功能实现

FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                            rs_selfield TYPE slis_selfield.
  DATA: lc_grid TYPE REF TO cl_gui_alv_grid,
        ls_stbl TYPE lvc_s_stbl,
        ls_data LIKE item.

  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 r_ucomm.
    WHEN '&SELECT'. "全选
      LOOP AT it_item REFERENCE INTO data(fs_item). " it_item指向fs_item,fs_item修改会同步到it_item
           fs_item->sel = abap_true.
      ENDLOOP.

    WHEN '&USEL'. "取消全选
      LOOP AT it_item REFERENCE INTO fs_item. " it_item指向fs_item,fs_item修改会同步到it_item
           fs_item->sel = abap_false.
      ENDLOOP.

    WHEN '&IC1'.  "单选,如果未设置 ls_fieldcat-hotspot,则为行双击
      READ TABLE it_item INTO ls_data INDEX rs_selfield-tabindex.
      LOOP AT it_item REFERENCE INTO fs_item WHERE matnr = ls_data-matnr. " it_item指向fs_item,fs_item修改会同步到it_item
          IF rs_selfield-value = '1'.
            fs_item->sel = abap_false.
          ELSE.
            fs_item->sel = abap_true.
          ENDIF.
      ENDLOOP.
    WHEN OTHERS.
  ENDCASE.

  IF lv_refresh = abap_true.
    "刷新ALV
    CALL METHOD lc_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl.
  ENDIF.
ENDFORM.

03、完整代码及功能展示

(1)完整代码

TYPE-POOLS: slis.
TABLES: mara.
** Layout  变量定义
DATA: gs_layout   TYPE lvc_s_layo,
      gt_fcat_lvc   TYPE lvc_t_fcat,
      gs_fcat_lvc   TYPE lvc_s_fcat.

*直接定义内表
DATA: BEGIN OF item OCCURS 0,
        SEL(1) TYPE c, "多选框字段
        matnr  LIKE mara-matnr, "物料编号
        mtart  LIKE mara-mtart, "物料类型
        matkl  LIKE mara-matkl, "物料组
      END OF item.

* 筛选界面 单选p,多选s
SELECTION-SCREEN BEGIN OF BLOCK blc WITH FRAME TITLE text-001.
  PARAMETERS:  p_matnr  LIKE mara-matnr."物料编号
  SELECT-OPTIONS  s_mtart  FOR mara-mtart ."物料类型
  SELECT-OPTIONS  s_matkl  FOR mara-matkl ."物料组
SELECTION-SCREEN END OF BLOCK blc.

* 初始化变量
INITIALIZATION.
  DATA: it_item LIKE TABLE OF item WITH HEADER LINE.

START-OF-SELECTION.
    PERFORM get_data.
    PERFORM frm_set_fieldcat.
    PERFORM frm_alv_display.

FORM get_data.
  clear: it_item.
  SELECT *
      INTO CORRESPONDING FIELDS OF TABLE it_item
      FROM mara. "WHERE mara~matnr LIKE '%R181%'.
ENDFORM.

FORM frm_set_fieldcat.
  DATA: lv_count TYPE i.
  DEFINE set_fieldcat.
    CLEAR gs_fcat_lvc .
    ADD 1 TO lv_count.
    gs_fcat_lvc-col_pos   = lv_count. " 栏位显示顺序
    gs_fcat_lvc-fieldname = &1."内表字段
    gs_fcat_lvc-outputlen = &2."输出长度
    gs_fcat_lvc-scrtext_l = gs_fcat_lvc-scrtext_s = gs_fcat_lvc-scrtext_m = &3."在ALV里面显示的名字
    gs_fcat_lvc-just      = &4. "水平对齐方式,L左对齐,R右对齐
    gs_fcat_lvc-lzero     = &5. "输出前导0
    gs_fcat_lvc-no_zero   = &6.
    gs_fcat_lvc-checkbox  = &7. "复选框
    gs_fcat_lvc-hotspot   = &8. "设置热点
    APPEND gs_fcat_lvc TO gt_fcat_lvc.
    CLEAR gs_fcat_lvc.
  END-OF-DEFINITION.
  set_fieldcat:
    'SEL'     ''      '复选框'         ''  ''  '' 'X' 'X',
    'MATNR'   ''      '物料编号'        ''  ''  '' '' '',
    'MTART'   ''      '物料类型'        ''  ''  '' '' '',
    'MATKL'   ''      '物料组'        ''  ''  '' '' ''.
ENDFORM.


FORM frm_alv_display.
  gs_layout-zebra = 'X'. "使用斑马线样式,交替行颜色
  gs_layout-cwidth_opt = 'X'. "自动优化列宽
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'FRM_SET_STATUS' "状态栏
      i_callback_user_command  = 'FRM_USER_COMMAND' "按钮操作
      is_layout_lvc            = gs_layout
      it_fieldcat_lvc          = gt_fcat_lvc
    TABLES
      t_outtab                 = it_item
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.

*&---------------------*
*&          按钮操作
*&---------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                            rs_selfield TYPE slis_selfield.
  DATA: lc_grid TYPE REF TO cl_gui_alv_grid,
        ls_stbl TYPE lvc_s_stbl,
        ls_data LIKE item.

  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 r_ucomm.
    WHEN '&SELECT'. "全选
      LOOP AT it_item REFERENCE INTO data(fs_item). " it_item指向fs_item,fs_item修改会同步到it_item
           fs_item->sel = abap_true.
      ENDLOOP.

    WHEN '&USEL'. "取消全选
      LOOP AT it_item REFERENCE INTO fs_item. " it_item指向fs_item,fs_item修改会同步到it_item
           fs_item->sel = abap_false.
      ENDLOOP.

    WHEN '&IC1'.  "单选,如果未设置 ls_fieldcat-hotspot,则为行双击
      READ TABLE it_item INTO ls_data INDEX rs_selfield-tabindex.
      LOOP AT it_item REFERENCE INTO fs_item WHERE matnr = ls_data-matnr. " it_item指向fs_item,fs_item修改会同步到it_item
          IF rs_selfield-value = '1'.
            fs_item->sel = abap_false.
          ELSE.
            fs_item->sel = abap_true.
          ENDIF.
      ENDLOOP.
    WHEN OTHERS.
  ENDCASE.

  IF lv_refresh = abap_true.
    "刷新ALV
    CALL METHOD lc_grid->refresh_table_display
      EXPORTING
        is_stable = ls_stbl.
  ENDIF.
ENDFORM.

FORM FRM_SET_STATUS USING rt_extab TYPE slis_t_extab.
    SET PF-STATUS 'ZSTATUS_ZSD_ALV' .
ENDFORM.

(2)功能展示

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值