在日常开发中如果不使用ABAP2.XLSL的情况下,普通ALV也会有多表头的开发需求,根据网上现有的代码,进行进一步改造,实现更方便多表头合并,增加灵活性,比如新增列或者减少列时的简易维护性。
合并效果如下

改造CL_GUI_ALV_GRID
转到SE24创建类ZCL_GUI_ALV_GRID并维护超类为CL_GUI_ALV_GRID
新增以下方法:

Z_SET_MERGE_HORIZ

method Z_SET_MERGE_HORIZ.
* ROW - Zeile deren Spalten zusammengef�hrt werden sollen
* tab_col_merge - Spalten, die zusammengef�hrt werden sollen
FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
DATA outputlen TYPE i.
SORT tab_col_merge.
* Die Spalten, die zusammengef�hrt werden sollen
LOOP AT tab_col_merge ASSIGNING <fs_cols>.
* ein paar Pr�fungen
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 ).
* Setze wie weit soll gemerged werden Von Spalte in L�nge
* und zwar wird bei der 1 Spalte angefangen
IF <fs_data>-col_pos = <fs_cols>-col_id.
<fs_data>-mergehoriz = outputlen.
<fs_data>-value = value.
* bei allen anderen, die zusammangeh�ren
* muss der Wert raus, da er aus der 1. Spalte kommt
* und das mergekennzeichen muss auch weg !
ELSE.
CLEAR <fs_data>-mergehoriz.
CLEAR <fs_data>-value.
ENDIF.
ENDLOOP.
ENDLOOP.
endmethod.
Z_SET_MERGE_VERT

METHOD z_set_merge_vert.
* ROW - Zeile deren Spalten zusammengef�hrt werden sollen
* tab_col_merge - Spalten, die zusammengef�hrt werden sollen
FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
DATA outputlen TYPE i.
SORT tab_col_merge.
* Die Spalten, die zusammengef�hrt werden sollen
LOOP AT tab_col_merge ASSIGNING <fs_cols>.
* ein paar Pr�fungen
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 ).
* Setze wie weit soll gemerged werden Von Spalte in L�nge
* und zwar wird bei der 1 Spalte angefangen
IF <fs_data>-col_pos = <fs_cols>-col_id.
<fs_data>-mergevert = outputlen.
<fs_data>-value = value.
* bei allen anderen, die zusammangeh�ren
* muss der Wert raus, da er aus der 1. Spalte kommt
* und das mergekennzeichen muss auch weg !
ELSE.
CLEAR <fs_data>-mergevert.
CLEAR <fs_data>-value.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
Z_DISPLAY
METHOD z_display.
DATA lv_stable TYPE lvc_s_stbl.
DATA lv_soft TYPE c.
**** Prepare refresh
* lv_stable-row = 'X'.
* lv_stable-col = 'X'.
* lv_soft = 'X'.
*
**** Refresh table because Z_SET_CELL_STYLE adds style-values
**** Refresh initializes mt_data
* CALL METHOD refresh_table_display
* EXPORTING
* is_stable = lv_stable
* i_soft_refresh = lv_soft
* EXCEPTIONS
* OTHERS = 1.
* Jetzt noch �bertragen der ge�nderten Daten
CALL METHOD me->set_data_table
CHANGING
data_table = mt_data[].
CALL METHOD set_auto_redraw
EXPORTING
enable = 1.
ENDMETHOD.
Z_SET_CELL_STYLE

METHOD z_set_cell_style.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
IF row IS INITIAL.
IF col IS INITIAL.
* Beides leer -> nichts zu tun.
EXIT.
ELSE.
* Nur Spalte setze komplette Spalte
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.
* Nur Zeile eingegeben -> komplette Zeile setzen
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_FIXED_COL_ROW

METHOD z_set_fixed_col_row.
me->set_fixed_cols( col ).
me->set_fixed_rows( row ).
ENDMETHOD.
Z_INIT_CELL_STYLES
METHOD z_init_cell_styles.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
* Nur Spalte setze komplette Spalte
LOOP AT mt_data ASSIGNING <fs_data>.
<fs_data>-style = 0.
ENDLOOP.
ENDMETHOD.
Z_SET_NAME

METHOD z_set_name.
FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
READ TABLE mt_data ASSIGNING <fs_data> WITH KEY col_pos = col row_pos = row.
IF sy-subrc = 0.
<fs_data>-value = value.
ENDIF.
ENDMETHOD.
主程序如下:
REPORT zdemo_merge.
INCLUDE <cl_alv_control>.
INCLUDE <icon>.
DATA:save_ok TYPE sy-ucomm.
CLASS lcl_main DEFINITION."定义类
PUBLIC SECTION."公共方法
CLASS-DATA:"类数据
r_mwskz TYPE RANGE OF bset-mwskz,
gt_alv TYPE TABLE OF sflight,
gs_alv TYPE sflight,
gv_row TYPE i,
gv_outputlen TYPE i,
gv_col TYPE i,
go_alv_grid TYPE REF TO zcl_gui_alv_grid,
gs_style TYPE lvc_s_styl,
mt_fcat TYPE lvc_t_fcat,
ms_layo TYPE lvc_s_layo,
ms_vari TYPE disvariant,
ms_stbl TYPE lvc_s_stbl VALUE 'XX',
gt_col_merge TYPE lvc_t_co01,
gs_col_merge TYPE lvc_s_co01,
mo_custmo TYPE REF TO cl_gui_custom_container. "自定义容器
CONSTANTS:"常量
mc_strc TYPE tabname VALUE 'SFLIGHT',
mc_itabname TYPE tabname VALUE 'GT_DETAIL',
mc_datastr TYPE boolean_flg VALUE 'X',
gv_merge_row TYPE i VALUE '2'.
CLASS-METHODS:"方法
initialization,
selection_screen_output,
start_of_selection,
end_of_selection,
selection_screen,
get_data,
display,
merge_data,
fieldcat IMPORTING iv_strucname TYPE tabname
iv_itabname TYPE tabname
CHANGING VALUE(ct_fcat) TYPE lvc_t_fcat,
layout CHANGING VALUE(cs_layo) TYPE lvc_s_layo,
* f4_lvc RETURNING VALUE(ct_f4) TYPE lvc_t_f4,
variant CHANGING VALUE(cs_variant) TYPE disvariant,
exclude_buttons RETURNING VALUE(buttons) TYPE ui_functions,
m_toolbar FOR EVENT toolbar OF zcl_gui_alv_grid "工具栏
IMPORTING e_object e_interactive,
refresh_table_display IMPORTING VALUE(iv_grid) TYPE REF TO cl_gui_alv_grid
VALUE(is_layo) TYPE lvc_s_layo OPTIONAL
VALUE(it_fcat) TYPE lvc_t_fcat OPTIONAL,
title_merge_vert IMPORTING VALUE(text) TYPE string,
title_merge_horiz IMPORTING VALUE(lenth) TYPE sy-tabix VALUE(text) TYPE string,
title_set_name IMPORTING VALUE(text) TYPE string,
* m_user_command FOR EVENT user_command OF zcl_gui_alv_grid
* IMPORTING e_ucomm,
* m_data_changed FOR EVENT data_changed OF zcl_gui_alv_grid "数据改变
* IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm,
* handle_onf4 FOR EVENT onf4 OF zcl_gui_alv_grid
* IMPORTING e_fieldname es_row_no er_event_data,
* m_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid "单机热点
* IMPORTING e_row_id e_column_id es_row_no,
* on_link_click FOR EVENT link_click OF cl_salv_events_table
* IMPORTING
* row
* column,
status_9000,
user_command_9000.
ENDCLASS.
CLASS lcl_main IMPLEMENTATION."实施类
METHOD initialization.
ENDMETHOD.
METHOD selection_screen_output.
ENDMETHOD.
METHOD start_of_selection.
get_data( ).
ENDMETHOD.
METHOD end_of_selection.
CALL SCREEN 9000.
ENDMETHOD.
METHOD selection_screen.
ENDMETHOD.
METHOD get_data.
SELECT
*
FROM sflight
INTO TABLE gt_alv.
CLEAR gs_alv.
INSERT gs_alv INTO gt_alv INDEX 1 .
INSERT gs_alv INTO gt_alv INDEX 2 .
ENDMETHOD.
METHOD status_9000.
DATA: linne1 TYPE i.
SET PF-STATUS 'STANDARD'.
IF mo_custmo IS INITIAL.
display( ).
ENDIF.
ENDMETHOD.
METHOD m_toolbar.
ENDMETHOD.
METHOD user_command_9000.
CASE save_ok.
WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
METHOD fieldcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = mc_strc
CHANGING
ct_fieldcat = ct_fcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDMETHOD.
METHOD layout.
cs_layo-no_headers = 'X'.
cs_layo-cwidth_opt = 'X'.
cs_layo-zebra = 'X'.
ENDMETHOD.
METHOD variant.
ENDMETHOD.
METHOD title_merge_vert.
ADD 1 TO gv_row.
ADD 1 TO gv_outputlen.
CLEAR gt_col_merge.
gs_col_merge-col_id = gv_row."第一列
gs_col_merge-outputlen = gv_outputlen."第二
APPEND gs_col_merge TO gt_col_merge.
CALL METHOD go_alv_grid->z_set_merge_vert
EXPORTING
row = 1
value = text
CHANGING
tab_col_merge = gt_col_merge.
gs_style-style = alv_style_align_center_center.
CALL METHOD go_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = gv_row
* col = col_id
style = gs_style-style.
ENDMETHOD.
METHOD title_merge_horiz.
gv_row = gv_outputlen.
gv_outputlen = gv_outputlen + lenth.
CLEAR gt_col_merge.
gs_col_merge-col_id = gv_row.
gs_col_merge-outputlen = gv_outputlen.
APPEND gs_col_merge TO gt_col_merge.
CALL METHOD go_alv_grid->z_set_merge_horiz
EXPORTING
row = 1
value = text
CHANGING
tab_col_merge = gt_col_merge.
gs_style-style = alv_style_align_center_center.
CALL METHOD go_alv_grid->z_set_cell_style
EXPORTING
row = 1
col = gv_row
* col = col_id
style = gs_style-style.
gv_col = gv_row - 1.
ENDMETHOD.
METHOD title_set_name.
ADD 1 TO gv_col.
CALL METHOD go_alv_grid->z_set_name
EXPORTING
row = gv_merge_row
col = gv_col
value = text.
* gs_style-style = alv_style_font_bold + alv_style_align_center_center.
gs_style-style = alv_style_align_center_center.
CALL METHOD go_alv_grid->z_set_cell_style
EXPORTING
row = gv_merge_row
col = gv_col
style = gs_style-style.
gv_row = gv_col."更新开始行
gv_outputlen = gv_row + 1.
ENDMETHOD.
METHOD exclude_buttons.
APPEND:
cl_gui_alv_grid=>mc_fc_loc_delete_row TO buttons,
cl_gui_alv_grid=>mc_fc_loc_copy TO buttons,
cl_gui_alv_grid=>mc_fc_loc_insert_row TO buttons,
cl_gui_alv_grid=>mc_fc_loc_copy_row TO buttons,
cl_gui_alv_grid=>mc_fc_loc_cut TO buttons,
cl_gui_alv_grid=>mc_fc_loc_append_row TO buttons,
cl_gui_alv_grid=>mc_fc_loc_undo TO buttons,
cl_gui_alv_grid=>mc_fc_loc_paste TO buttons,
cl_gui_alv_grid=>mc_fc_loc_paste_new_row TO buttons,
cl_gui_alv_grid=>mc_fc_sum TO buttons,
cl_gui_alv_grid=>mc_fc_filter TO buttons,
cl_gui_alv_grid=>mc_fc_average TO buttons,
cl_gui_alv_grid=>mc_fc_find_more TO buttons,
cl_gui_alv_grid=>mc_fc_graph TO buttons,
cl_gui_alv_grid=>mc_fc_info TO buttons,
cl_gui_alv_grid=>mc_fc_sort TO buttons,
cl_gui_alv_grid=>mc_fc_sum TO buttons,
cl_gui_alv_grid=>mc_fc_maximum TO buttons,
cl_gui_alv_grid=>mc_fc_minimum TO buttons,
cl_gui_alv_grid=>mc_fc_sort_asc TO buttons,
cl_gui_alv_grid=>mc_fc_sort_dsc TO buttons,
cl_gui_alv_grid=>mc_fc_refresh TO buttons,
cl_gui_alv_grid=>mc_fc_subtot TO buttons,
cl_gui_alv_grid=>mc_fc_check TO buttons.
ENDMETHOD.
METHOD merge_data.
DATA:lv_string TYPE string.
CLEAR:
gv_row,
gv_outputlen,
gv_col.
gv_outputlen = 1."开始1
* lv_string = 'Client'(F51). title_merge_vert( EXPORTING text = lv_string ).
lv_string = 'Airline Code'(F51). title_merge_vert( EXPORTING text = lv_string ).
lv_string = '合并2-5项'(F11). title_merge_horiz( EXPORTING lenth = '3' text = lv_string )."占4位 记3位 后续跟set_name 跟四条Name
lv_string = 'Flight Connection Number'(F12). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Flight date'(F13). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Airfare'(F14). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Local currency of airline'(F15). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Aircraft Type'(F36). title_merge_vert( text = lv_string ).
lv_string = 'Maximum capacity in economy class'(F36). title_merge_vert( text = lv_string ).
lv_string = '合并8-12项'(F11). title_merge_horiz( EXPORTING lenth = '4' text = lv_string )."
lv_string = 'Occupied seats in economy class'(F21). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Total of current bookings'(F21). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Maximum capacity in business class'(f57). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Occupied seats in business class'(f57). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Maximum capacity in first class'(f57). title_set_name( EXPORTING text = lv_string ).
lv_string = 'Occupied seats in first class'(F36). title_merge_vert( text = lv_string ).
*
go_alv_grid->z_set_fixed_col_row( EXPORTING col = 0 row = 2 ).
ENDMETHOD.
METHOD refresh_table_display.
CALL METHOD iv_grid->set_frontend_layout
EXPORTING
is_layout = is_layo.
CALL METHOD iv_grid->set_frontend_fieldcatalog
EXPORTING
it_fieldcatalog = it_fcat.
iv_grid->refresh_table_display(
EXPORTING
is_stable = ms_stbl
EXCEPTIONS
finished = 1
OTHERS = 2 ).
ENDMETHOD.
METHOD display.
IF mo_custmo IS INITIAL.
*创建容器
* "创建容器对象指定自定义容器名
CREATE OBJECT mo_custmo
EXPORTING
container_name = 'MERGE'.
CREATE OBJECT go_alv_grid "创建Grid 绑定容器
EXPORTING
i_parent = mo_custmo
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*排除按钮
DATA(lt_ex_buttons) = exclude_buttons( ).
*Field
fieldcat( EXPORTING iv_strucname = mc_strc
iv_itabname = mc_itabname
CHANGING ct_fcat = mt_fcat ).
*Layout
layout( CHANGING cs_layo = ms_layo ).
*variant
variant( CHANGING cs_variant = ms_vari ).
CALL METHOD go_alv_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
CALL METHOD go_alv_grid->set_table_for_first_display
EXPORTING
is_layout = ms_layo
it_toolbar_excluding = lt_ex_buttons
is_variant = ms_vari
* i_save = 'A'
CHANGING
it_fieldcatalog = mt_fcat[]
it_outtab = gt_alv[].
*
SET HANDLER:
m_toolbar FOR go_alv_grid."添加工具栏
* m_user_command FOR go_alv_grid,
* m_data_changed FOR go_alv_grid,
* handle_onf4 FOR go_alv_grid,
* m_hotspot_click FOR go_alv_grid.
CALL METHOD go_alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CALL METHOD go_alv_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
merge_data( ) .
go_alv_grid->z_display( ).
ELSE.
*刷新
refresh_table_display(
EXPORTING
iv_grid = go_alv_grid
is_layo = ms_layo
it_fcat = mt_fcat ).
ENDIF.
ENDMETHOD.
ENDCLASS.
INITIALIZATION.
lcl_main=>initialization( ).
AT SELECTION-SCREEN OUTPUT.
lcl_main=>selection_screen_output( ).
AT SELECTION-SCREEN.
lcl_main=>selection_screen( ).
START-OF-SELECTION.
lcl_main=>start_of_selection( ).
END-OF-SELECTION.
lcl_main=>end_of_selection( )."---------------------------------------------*
MODULE status_9000 OUTPUT.
lcl_main=>status_9000( ).
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
lcl_main=>user_command_9000( ).
ENDMODULE.

2532

被折叠的 条评论
为什么被折叠?



