基于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.