ABAP ALV多行表头(合并列,合并单元格)
效果展示:
代码:
REPORT ztest_002.
*&---------------------------------------------------------------------*
* TABLES 申明表类型工作区/Work area for declaring table object types
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* TYPE-POOL 引入类型池/Introduce type pool
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* TYPES 定义数据类型/defines a standalone data type
*&---------------------------------------------------------------------*
TYPES: BEGIN OF t_check_styles,
matnr TYPE mara-matnr,
ersda TYPE mara-ersda,
ernam TYPE mara-ernam,
laeda TYPE mara-laeda,
aenam TYPE mara-aenam,
vpsta TYPE mara-vpsta,
pstat TYPE mara-pstat,
lvorm TYPE mara-lvorm,
mtart TYPE mara-mtart,
mbrsh TYPE mara-mbrsh,
matkl TYPE mara-matkl,
bismt TYPE mara-bismt,
END OF t_check_styles.
*&---------------------------------------------------------------------*
* CONSTANTS 申明常量/declares a constant data object
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* DATA 申明全局变量/declares a variable of any data type
* Declaration type:var, ref, struc, comp, itab, and range_tab
*&---------------------------------------------------------------------*
INCLUDE <cl_alv_control>.
INCLUDE <icon>.
DATA ok_code TYPE sy-ucomm.
DATA gt_main TYPE TABLE OF t_check_styles.
FIELD-SYMBOLS <fs_styles> TYPE t_check_styles.
DATA : lt_fieldcatalog TYPE lvc_t_fcat.
FIELD-SYMBOLS <fs_cat> TYPE lvc_s_fcat.
CLASS zcl_gui_alv_grid DEFINITION DEFERRED .
DATA it_col_merge TYPE lvc_t_co01.
DATA wa_col_merge TYPE lvc_s_co01.
DATA: g_custom_container TYPE REF TO cl_gui_custom_container.
DATA g_alv_grid TYPE REF TO zcl_gui_alv_grid.
CLASS cl_gui_cfw DEFINITION LOAD.
DATA: x_save, "for Parameter I_SAVE
gs_variant TYPE disvariant. "for parameter IS_VARIANT
DATA gs_layout TYPE lvc_s_layo. " Layout
DATA wa_style TYPE lvc_s_styl.
*&---------------------------------------------------------------------*
* DEFINE 定义全局宏/Define global macro
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* CLASS DEFINITION 定义类/Definition class
*&---------------------------------------------------------------------*
CLASS zcl_gui_alv_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
"Implement CL GUI ALV GRID method
PUBLIC SECTION.
"Horizontal merge method
METHODS z_set_merge_horiz
IMPORTING
row TYPE i
value TYPE lvc_value
CHANGING
tab_col_merge TYPE lvc_t_co01.
"Vertical merge method
METHODS z_set_merge_vert
IMPORTING
row TYPE i
value TYPE lvc_value
CHANGING
tab_col_merge TYPE lvc_t_co01.
METHODS z_set_header_value
IMPORTING
row TYPE i
col TYPE i
value TYPE lvc_value.
"Change output to CL_GUI_ALV_GRID display method
METHODS z_display.
"Sets the cell style method
METHODS z_set_cell_style
IMPORTING
row TYPE i OPTIONAL
col TYPE i OPTIONAL
style TYPE lvc_style
style2 TYPE lvc_style OPTIONAL.
"Set fixed columns/rows method
METHODS z_set_fixed_col_row
IMPORTING
col TYPE i
row TYPE i.
"Initialize cell style method
METHODS z_init_cell_styles.
ENDCLASS. "ZCL_GUI_ALV_GRID DEFINITION
*&---------------------------------------------------------------------*
* CLASS IMPLEMENTATION 实现类/Implementation class
*&---------------------------------------------------------------------*
CLASS zcl_gui_alv_grid IMPLEMENTATION.
METHOD z_set_merge_horiz.
* ROW - row whose columns are to be merged
* tab_col_merge - Columns to be merged
FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
DATA outputlen TYPE i.
SORT tab_col_merge.
* Columns to merge
LOOP AT tab_col_merge ASSIGNING <fs_cols>.
* data verification
IF <fs_cols>-col_id LE 0. CONTINUE. ENDIF.
IF <fs_cols>-outputlen LE <fs_cols>-col_id. CONTINUE. ENDIF.
outputlen = <fs_cols>-outputlen - <fs_cols>-col_id.
LOOP AT mt_data ASSIGNING <fs_data>
WHERE row_pos = row AND
( col_pos BETWEEN <fs_cols>-col_id AND
<fs_cols>-outputlen ).
* Set how far to merge From column in length
* starting with the 1st column
IF <fs_data>-col_pos = <fs_cols>-col_id.
<fs_data>-mergehoriz = outputlen.
* with all others who belong together
* the value has to go out because it comes from the 1st column
* and the merge indicator must also go!
<fs_data>-value = value.
ELSE.
CLEAR <fs_data>-mergehoriz.
CLEAR <fs_data>-value.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD. "Z_SET_MERGE_HORIZ
METHOD z_set_merge_vert.
* ROW - row whose columns are to be merged
* tab_col_merge - Columns to be merged
FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
DATA outputlen TYPE i.
SORT tab_col_merge.
* Columns to merge
LOOP AT tab_col_merge ASSIGNING <fs_cols>.
* data verification
IF <fs_cols>-col_id LE 0. CONTINUE. ENDIF.
IF <fs_cols>-outputlen LE <fs_cols>-col_id. CONTINUE. ENDIF.
outputlen = <fs_cols>-outputlen - <fs_cols>-col_id.
LOOP AT mt_data ASSIGNING <fs_data>
WHERE row_pos = row AND
( col_pos BETWEEN <fs_cols>-col_id AND
<fs_cols>-outputlen ).
* Set how far to merge From column in length
* starting with the 1st column
IF <fs_data>-col_pos = <fs_cols>-col_id.
<fs_data>-mergevert = outputlen.
* with all others who belong together
* the value has to go out because it comes from the 1st column
* and the merge indicator must also go!
<fs_data>-value = value.
ELSE.
CLEAR <fs_data>-mergevert.
CLEAR <fs_data>-value.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD. "Z_SET_MERGE_VERT
METHOD z_set_header_value.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
LOOP AT mt_data ASSIGNING <fs_data>
WHERE row_pos = row AND col_pos = col.
<fs_data>-value = value.
ENDLOOP.
ENDMETHOD. "z_set_header_value
METHOD z_display.
DATA lv_stable TYPE lvc_s_stbl.
DATA lv_soft TYPE c.
CALL METHOD me->set_data_table
CHANGING
data_table = mt_data[].
CALL METHOD set_auto_redraw
EXPORTING
enable = 1.
ENDMETHOD. "Z_DISPLAY
METHOD z_set_cell_style.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
IF row IS INITIAL.
IF col IS INITIAL.
* Both empty -> nothing to do.
EXIT.
ELSE.
* Column only set complete column
LOOP AT mt_data ASSIGNING <fs_data>
WHERE col_pos = col.
<fs_data>-style = <fs_data>-style + style.
<fs_data>-style2 = <fs_data>-style2 + style2.
ENDLOOP.
ENDIF.
ELSE.
IF col IS INITIAL.
* Enter line only -> set complete line
LOOP AT mt_data ASSIGNING <fs_data>
WHERE row_pos = row.
<fs_data>-style = <fs_data>-style + style.
<fs_data>-style2 = <fs_data>-style2 + style2.
ENDLOOP.
ELSE.
READ TABLE mt_data ASSIGNING <fs_data>
WITH KEY row_pos = row
col_pos = col.
IF sy-subrc EQ 0.
<fs_data>-style = <fs_data>-style + style.
<fs_data>-style2 = <fs_data>-style2 + style2.
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD. "Z_SET_CELL_STYLE
METHOD z_set_fixed_col_row.
me->set_fixed_cols( col ).
me->set_fixed_rows( row ).
ENDMETHOD. "Z_SET_FIXED_COL_ROW
METHOD z_init_cell_styles.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
* init style
LOOP AT mt_data ASSIGNING <fs_data>.
<fs_data>-style = 0.
ENDLOOP.
ENDMETHOD. "Z_INIT_CELL_STYLES
ENDCLASS . "ZCL_GUI_ALV_GRID IMPLEMENTATION
*&---------------------------------------------------------------------*
* SELECTION-SCREEN 定义选择屏幕/Define selection screen
*&---------------------------------------------------------------------*
*&=====================================================================*
* PRE-EXECUTION EVENTS/程序执行前事件
*======================================================================*
INITIALIZATION. "初始化事件:运行事务代码后执行一次
AT SELECTION-SCREEN OUTPUT. "PBO事件:屏幕输出前处理逻辑
AT SELECTION-SCREEN. "PAI事件:屏幕值变化后处理逻辑,自动触发一次PBO
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_MATNR. "自定义F4处理逻辑
*&=====================================================================*
* PROGRAM EXECUTION EVENTS/ 程序执行事件 *
*======================================================================*
START-OF-SELECTION. "数据处理
PERFORM frm_get_data. "Get Data
END-OF-SELECTION. "数据执行
IF gt_main[] IS NOT INITIAL.
CALL SCREEN 0200.
ELSE.
MESSAGE 'NO DATA' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
*&=====================================================================*
* DEFINE SUBROUTINE/定义子程序 *
*======================================================================*
FORM frm_get_data.
"添加两个初始行用作Title行
APPEND INITIAL LINE TO gt_main.
APPEND INITIAL LINE TO gt_main.
"新增需要显示的数据
SELECT * FROM mara
APPENDING CORRESPONDING FIELDS OF TABLE gt_main
UP TO 30 ROWS.
ENDFORM. "FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form FRM_INIT_OBJECT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_object .
IF g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING
container_name = 'CONTAINER'.
CREATE OBJECT g_alv_grid
EXPORTING
i_parent = g_custom_container.
ENDIF.
ENDFORM. "FRM_INIT_OBJECT
*&---------------------------------------------------------------------*
*& Form FRM_FILL_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_fill_layout .
gs_layout-stylefname = 'CELL'.
gs_layout-no_headers = 'X'.
gs_layout-cwidth_opt = 'X'.
gs_layout-no_toolbar = 'X'.
ENDFORM. "FRM_FILL_LAYOUT
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_fill_fieldcat .
REFRESH lt_fieldcatalog.
PERFORM frm_set_field USING 'MATNR' 'MARA' 'MATNR' '物料编码'.
PERFORM frm_set_field USING 'ERSDA' 'MARA' 'ERSDA' '创建日期'.
PERFORM frm_set_field USING 'ERNAM' 'MARA' 'ERNAM' '创建对象的人员名称'.
PERFORM frm_set_field USING 'LAEDA' 'MARA' 'LAEDA' '上次更改的日期'.
PERFORM frm_set_field USING 'AENAM' 'MARA' 'AENAM' '对象更改人员的名称 '.
PERFORM frm_set_field USING 'VPSTA' 'MARA' 'VPSTA' '维护全部物料状态'.
PERFORM frm_set_field USING 'PSTAT' 'MARA' 'PSTAT' '维护状态'.
PERFORM frm_set_field USING 'LVORM' 'MARA' 'LVORM' '在客户级标记要删除的物料'.
PERFORM frm_set_field USING 'MTART' 'MARA' 'MTART' '商品类型'.
PERFORM frm_set_field USING 'MBRSH' 'MARA' 'MBRSH' '行业领域'.
PERFORM frm_set_field USING 'MATKL' 'MARA' 'MATKL' '物料组'.
PERFORM frm_set_field USING 'BISMT' 'MARA' 'BISMT' '旧商品编码'.
ENDFORM. "FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_display_alv .
*
CALL METHOD g_alv_grid->set_table_for_first_display
EXPORTING
is_variant = gs_variant
i_save = x_save
is_layout = gs_layout
CHANGING
it_fieldcatalog = lt_fieldcatalog
it_outtab = gt_main.
ENDFORM. "FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& Form SET_CELL_STYLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_merge_vert .
"开始纵向合并单元格
*-----------------------第一列-----------------------*
"合并1-2行
CLEAR: wa_col_merge,it_col_merge.
wa_col_merge-col_id = 1.
wa_col_merge-outputlen = 2.
APPEND wa_col_merge TO it_col_merge.
CALL METHOD g_alv_grid->z_set_merge_vert
EXPORTING
row = 1
value = '合并1-2行'
CHANGING
tab_col_merge = it_col_merge.
"设置Style
wa_style-style = alv_style_font_bold
+ alv_style_align_center_center
+ alv_style_color_key.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = 1
style = wa_style-style.
ENDFORM. "SET_MERGE_VERT
*&---------------------------------------------------------------------*
*& Form SET_MERGE_HORIZ
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_merge_horiz .
"开始横向合并单元格
*-----------------------合并第一行-----------------------*
"合并4-8列
CLEAR: wa_col_merge,it_col_merge.
wa_col_merge-col_id = 4.
wa_col_merge-outputlen = 8.
APPEND wa_col_merge TO it_col_merge.
CALL METHOD g_alv_grid->z_set_merge_horiz
EXPORTING
row = 1
value = '横向4-8列'
CHANGING
tab_col_merge = it_col_merge.
"合并10-12列
CLEAR: wa_col_merge,it_col_merge.
wa_col_merge-col_id = 10.
wa_col_merge-outputlen = 12.
APPEND wa_col_merge TO it_col_merge.
CALL METHOD g_alv_grid->z_set_merge_horiz
EXPORTING
row = 1
value = '横向10-12列'
CHANGING
tab_col_merge = it_col_merge.
"设置Style
wa_style-style = alv_style_font_bold.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = 3
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = 4
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = 9
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = 10
style = wa_style-style.
*-----------------------合并第二行-----------------------*
"合并4-7列
CLEAR: wa_col_merge,it_col_merge.
wa_col_merge-col_id = 4.
wa_col_merge-outputlen = 7.
APPEND wa_col_merge TO it_col_merge.
CALL METHOD g_alv_grid->z_set_merge_horiz
EXPORTING
row = 2
value = '合并4-7列'
CHANGING
tab_col_merge = it_col_merge.
"合并10-12列
CLEAR: wa_col_merge,it_col_merge.
wa_col_merge-col_id = 10.
wa_col_merge-outputlen = 12.
APPEND wa_col_merge TO it_col_merge.
CALL METHOD g_alv_grid->z_set_merge_horiz
EXPORTING
row = 2
value = '合并10-12列'
CHANGING
tab_col_merge = it_col_merge.
"设置Style
wa_style-style = alv_style_color_group +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 3
style = wa_style-style.
wa_style-style = alv_style_color_heading +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 4
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 5
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 6
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 7
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 8
style = wa_style-style.
wa_style-style = alv_style_color_total +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 9
style = wa_style-style.
wa_style-style = alv_style_color_negative +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 10
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 11
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 12
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 13
style = wa_style-style.
wa_style-style = alv_style_color_positive +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 14
style = wa_style-style.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 15
style = wa_style-style.
wa_style-style = alv_style_color_int_background +
alv_style_align_center_center.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
col = 16
style = wa_style-style.
wa_style-style = alv_style_color_positive +
alv_style_align_center_center +
alv_style_font_italic.
CALL METHOD g_alv_grid->z_set_cell_style
EXPORTING
row = 4
col = 2
style = wa_style-style.
g_alv_grid->z_set_fixed_col_row(
EXPORTING col = 3
row = 3 ).
ENDFORM. "SET_MERGE_HORIZ
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
SET PF-STATUS '0200'.
SET TITLEBAR '0200'.
ENDMODULE. "STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module INIT_ALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_alv_0200 OUTPUT.
PERFORM frm_init_object.
PERFORM frm_fill_fieldcat.
PERFORM frm_fill_layout.
PERFORM frm_display_alv .
PERFORM set_merge_vert. "Vertical merger
PERFORM set_merge_horiz. "Horizontal merge
PERFORM set_other_headername. "设置其他抬头文本
g_alv_grid->z_display( ).
ENDMODULE. "INIT_ALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
* button event response
cl_gui_cfw=>dispatch( ).
CASE ok_code.
WHEN '&F03'.
SET SCREEN 0. LEAVE SCREEN.
WHEN '&F15'.
SET SCREEN 0. LEAVE SCREEN.
WHEN '&F12'.
SET SCREEN 0. LEAVE SCREEN.
ENDCASE.
ENDMODULE. "USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
*& Form SET_OTHER_HEADERNAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM set_other_headername .
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 2
row = 1
value = '1-2文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 2
row = 2
value = '2-2文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 3
row = 1
value = '1-3文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 3
row = 2
value = '2-3文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 8
row = 2
value = '2-8文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 9
row = 1
value = '1-9文本'.
CALL METHOD g_alv_grid->z_set_header_value
EXPORTING
col = 9
row = 2
value = '2-9文本'.
ENDFORM. " SET_OTHER_HEADERNAME
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0673 text
* -->P_0674 text
* -->P_0675 text
* -->P_0676 text
*----------------------------------------------------------------------*
FORM frm_set_field USING VALUE(p1)
VALUE(p2)
VALUE(p3)
VALUE(p4).
DATA : ls_fieldcatalog TYPE lvc_s_fcat.
ls_fieldcatalog-fieldname = p1.
ls_fieldcatalog-ref_table = p2.
ls_fieldcatalog-ref_field = p3.
ls_fieldcatalog-scrtext_s = p4.
ls_fieldcatalog-scrtext_m = p4.
ls_fieldcatalog-scrtext_l = p4.
APPEND ls_fieldcatalog TO lt_fieldcatalog.
ENDFORM. " FRM_SET_FIELD
-------------------------------------------------------------------------------------
创建屏幕 200、
屏幕代码:
PROCESS BEFORE OUTPUT.
MODULE status_0200.
MODULE init_alv_0200.
*
PROCESS AFTER INPUT.
MODULE user_command_0200.
创建:自定义控件CONTAINER