ALV 报表单元格实现下拉框编辑,效果图如下
声明以下变量: DATA:gs_layout_lvc TYPE lvc_s_layo, gt_fcat_lvc TYPE lvc_t_fcat, gs_fcat_lvc TYPE lvc_s_fcat, ls_event TYPE slis_alv_event, lt_event TYPE slis_t_event.
data:lt_dropdown TYPE lvc_t_drop, ls_dropdown TYPE lvc_s_drop.
PS:一个 ALV 报表可以存在多个单元格不同数值下拉框,所以 handle 可以理解为分组,后期调用根据该值来判断是哪个下拉框。 ls_dropdown-handle = ‘1’. //值为1,2,3,4…的自然数 ls_dropdown-value = ‘女’. //下拉框值
gs_fcat_lvc-DRDN_HNDL 该值表示以上下拉框的分组。
完整代码如下
*&---------------------------------------------------------------------*
*& Report ZMMRTEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMMRTEST.
*DATA: BEGIN OF srctab1 OCCURS 1,
*txt(255) TYPE c,
*END OF srctab1.
*
*PARAMETERS: rep LIKE trdir-name.
*
*AT SELECTION-SCREEN.
*
*START-OF-SELECTION.
*sy-uname = 'SAP'.
*READ REPORT rep INTO srctab1.
*EDITOR-CALL FOR srctab1.
*IF sy-subrc = 0.
*INSERT REPORT rep FROM srctab1.
*ENDIF.
*----------------------------------------------------------------------*
* Type-pools/定义类型池
*----------------------------------------------------------------------*
TYPE-POOLS: slis.
*----------------------------------------------------------------------*
* Tables/声明数据库表
*----------------------------------------------------------------------*
TABLES:ZMMTEST.
*----------------------------------------------------------------------*
* Type/自定义类型
*----------------------------------------------------------------------*
TYPES:BEGIN OF ty_alv,
id type zmmtest-id,
name type zmmtest-name,
age type zmmtest-age,
sex type zmmtest-sex,
hobby type zmmtest-hobby,
END OF ty_alv.
DATA:gt_alv TYPE STANDARD TABLE OF ty_alv,
gs_alv TYPE ty_alv.
*-------------------------------------*
* Define the Macros/定义
*----------------------------------------------------------------------*
DEFINE set_fieldcat.
CLEAR gs_fcat_lvc .
gs_fcat_lvc-fieldname = &1."内表的字段
gs_fcat_lvc-outputlen = &2."输出长度
gs_fcat_lvc-scrtext_l = &3."在ALV里面显示的名字
gs_fcat_lvc-just = &4."水平对齐方式,L左对齐,R右对齐。
gs_fcat_lvc-no_zero = &5."去除前导零
gs_fcat_lvc-edit = &6."当前列可编辑
gs_fcat_lvc-ref_table = &7."该字段的参考表
gs_fcat_lvc-ref_field = &8."该字段的参考字段
gs_fcat_lvc-DRDN_HNDL = &9."选择框
APPEND gs_fcat_lvc TO gt_fcat_lvc .
END-OF-DEFINITION.
*----------------------------------------------------------------------*
* 声明ALV对象
*----------------------------------------------------------------------*
DATA:gs_layout_lvc TYPE lvc_s_layo,
gt_fcat_lvc TYPE lvc_t_fcat,
gs_fcat_lvc TYPE lvc_s_fcat,
ls_event TYPE slis_alv_event,
lt_event TYPE slis_t_event.
data:lt_dropdown TYPE lvc_t_drop,
ls_dropdown TYPE lvc_s_drop.
DATA:GS_STYLE TYPE LVC_S_STYL,
GT_STYLE TYPE LVC_T_STYL.
*----------------------------------------------------------------------*
* Internal table and work area/定义内表和工作区
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
* Selection screen/定义屏幕
*----------------------------------------------------------------------*
SELECTION-SCREEN FUNCTION KEY: 1 .
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE TEXT-t01.
SELECT-OPTIONS: s_id FOR zmmtest-id,
s_name FOR zmmtest-name,
s_age FOR zmmtest-age,
s_sex FOR zmmtest-sex,
s_hobby FOR zmmtest-hobby.
SELECTION-SCREEN END OF BLOCK block1.
*----------------------------------------------------------------------*
* Initialization/初始事件
*----------------------------------------------------------------------*
INITIALIZATION.
*----------------------------------------------------------------------*
* At selection-screen/屏幕事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
*----------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*----------------------------------------------------------------------*
* Start-of-selection/开始选择事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
*取数据
PERFORM frm_get_data.
*ALV展示
PERFORM frm_display_alv.
*----------------------------------------------------------------------*
* End-of-selection/结束选择事件
*----------------------------------------------------------------------*
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_get_data .
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_alv
from zmmtest
where id in s_id
AND name in s_name
AND age in s_age
AND sex in s_sex
AND hobby in s_hobby.
* GS_STYLE-FIELDNAME = 'SEX'.
* GS_STYLE-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED."设置为不可编辑
* INSERT GS_STYLE INTO TABLE GT_STYLE.
*
* INSERT LINES OF GT_STYLE INTO TABLE gt_alv.
endform.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
set_fieldcat:'ID' '' '学号' '' '' '' '' '' '',
'NAME' '' '学生姓名' '' '' '' '' '' '',
'AGE' '' '年龄' '' '' 'X' 'ZMMTEST' 'AGE' '2',
'SEX' '' '性别' '' '' 'X' 'ZMMTEST' 'HOBBY' '1',
'HOBBY' '' '兴趣爱好' '' '' '' '' '' ''.
"'STYLE' '' '编辑' '' ''.
CLEAR:gs_layout_lvc.
gs_layout_lvc-zebra = 'X'.
gs_layout_lvc-cwidth_opt = 'X'.
PERFORM creat_dropdown_values.
PERFORM create_event.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
i_save = 'A'
it_events = lt_event
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
FORM creat_dropdown_values.
ls_dropdown-handle = '1'.
ls_dropdown-value = '男'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-value = '女'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '2'.
ls_dropdown-value = '18'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '2'.
ls_dropdown-value = '19'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '2'.
ls_dropdown-value = '20'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '2'.
ls_dropdown-value = '21'.
APPEND ls_dropdown TO lt_dropdown.
ENDFORM.
FORM create_event.
ls_event-name = 'CALLER_EXIT'.
ls_event-form = 'CALLER_EXIT'.
APPEND ls_event TO lt_event.
ENDFORM.
FORM caller_exit USING r_grid TYPE slis_data_caller_exit.
DATA:l_ref_alv TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_ref_alv.
CALL METHOD l_ref_alv->set_drop_down_table
EXPORTING
it_drop_down = lt_dropdown.
ENDFORM.
1.效果如下:实现性别为“女”的行标红显示。
效果如下:
源码如下:
TYPES:BEGIN OF ty_alv,
sel type char1,
id type zmmtest-id,
name type zmmtest-name,
age type zmmtest-age,
sex type zmmtest-sex,
hobby type zmmtest-hobby,
color(4), //定义
END OF ty_alv.
LOOP at gt_alv into gs_alv.
IF gs_alv-sex = '女'.
gs_alv-color = 'C610'. //设置颜色
ENDIF.
modify gt_alv FROM gs_alv.
ENDLOOP.
gs_layout_lvc-info_fname = 'COLOR'. " 行颜色字段
gs_layout_lvc-cwidth_opt = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout_lvc
it_fieldcat_lvc = gt_fcat_lvc
i_save = 'A'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.