原帖:
http://www.hopewei.com/alv-with-two-header.html(如侵犯版权,会自行删除)
真正和图中完全一样的,没想到办法解决,不过,实现和图中类似的,倒是有办法。
原理其实也很简单:ABAP OO实现ALV是基于CONTAINER,所以,上面的多出来的表头,可以相当于一个无内容的ALV报表
注意:
1.需要分别实例化两个ALV Container,分别定义两个ALV的Layout/Fieldcat;
2.画屏幕的时候,注意两个CONTAINER的布局,最终效果需要自己慢慢调;
3.上面ALV 需要隐藏标准按钮,所以需要自定义ALV STATUS;
4.对其效果在于 Fieldcat的outputlen属性;
5.其他效果,自行Coding,此例仅供参照.
附图:
1.屏幕CONTAINER设置
2.最终效果:
关键代码:
container TYPE scrfname VALUE 'SCR1', "在屏幕中创建的容器名称 container1 TYPE scrfname VALUE 'SCR2', "在屏幕中创建的容器名称
*&---------------------------------------------------------------------* *& Report ZALV_2HEADER *& *&---------------------------------------------------------------------* *& *&版权归:Hopesap工作室所有|Http://hopewei.com *&---------------------------------------------------------------------* REPORT zalv_2header. TABLES: sflight. DATA: ok_code LIKE sy-ucomm, save_ok LIKE sy-ucomm, gt_fcat TYPE lvc_t_fcat, "字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等 gt_fcat1 TYPE lvc_t_fcat, "字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等 gs_layout TYPE lvc_s_layo, "ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色. gt_exclude TYPE ui_functions, "排除不需要的标准按钮 此处到后面文章会讲到。 gt_exclude1 TYPE ui_functions, "排除不需要的标准按钮 此处到后面文章会讲到。 container TYPE scrfname VALUE 'SCR1', "在屏幕中创建的容器名称 container1 TYPE scrfname VALUE 'SCR2', "在屏幕中创建的容器名称 alv_grid1 TYPE REF TO cl_gui_alv_grid, alv_grid TYPE REF TO cl_gui_alv_grid, custom_container TYPE REF TO cl_gui_custom_container, "实例化一个容器 custom_container1 TYPE REF TO cl_gui_custom_container. "实例化一个容器 *DATA: gt_list TYPE TABLE OF sflight WITH HEADER LINE. DATA:BEGIN OF gt_list OCCURS 0. DATA selk TYPE c. INCLUDE TYPE sflight. DATA:END OF gt_list. DATA: gt_list1 TYPE TABLE OF sflight WITH HEADER LINE. data: outls type i, outl1 type i, outl2 type i. INITIALIZATION. outlS = 25. outl1 = 12. outl2 = 12. AT SELECTION-SCREEN. START-OF-SELECTION. PERFORM frm_get_data. PERFORM div_tools TABLES gt_exclude. PERFORM div_tools TABLES gt_exclude1. CALL SCREEN 100. *---------------------------------------------------------------------* * MODULE status_0100 OUTPUT *---------------------------------------------------------------------* * PBO 流程处理 *---------------------------------------------------------------------* MODULE status_0100 OUTPUT. PERFORM set_status. IF custom_container1 IS INITIAL. CREATE OBJECT custom_container1 EXPORTING container_name = container1. IF alv_grid1 IS INITIAL. CREATE OBJECT alv_grid1 EXPORTING i_parent = custom_container1. PERFORM frm_build_fcat1. * PERFORM frm_set_layout1. CALL METHOD alv_grid1->set_table_for_first_display EXPORTING * i_structure_name = 'SFLIGHT' “此处说明一下一般程序中要处理的显示数据,都不是在同一个结构表中,所以显示的字段需要手工建立。这就用到了PERFORM frm_build_fcat. * is_layout = gs_layout it_toolbar_excluding = gt_exclude1 CHANGING it_outtab = gt_list1[] it_fieldcatalog = gt_fcat1[]. "要显示的字段列表 ENDIF. ENDIF. IF custom_container IS INITIAL. CREATE OBJECT custom_container EXPORTING container_name = container. IF alv_grid IS INITIAL. CREATE OBJECT alv_grid EXPORTING i_parent = custom_container. PERFORM frm_build_fcat. PERFORM frm_set_layout. * PERFORM frm_set_layout. CALL METHOD alv_grid->set_table_for_first_display EXPORTING * i_structure_name = 'SFLIGHT' “此处说明一下一般程序中要处理的显示数据,都不是在同一个结构表中,所以显示的字段需要手工建立。这就用到了PERFORM frm_build_fcat. is_layout = gs_layout it_toolbar_excluding = gt_exclude * i_callback_pf_status_set = 'SET_STATUS' CHANGING it_outtab = gt_list[] it_fieldcatalog = gt_fcat[]. "要显示的字段列表 ENDIF. ENDIF. ENDMODULE. "status_0100 OUTPUT *&---------------------------------------------------------------------* *& Form SET_STATUS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM set_status . SET PF-STATUS 'GS100'. ENDFORM. "SET_STATUS *&---------------------------------------------------------------------* *& Form frm_set_layout *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM frm_set_layout. * gs_layout gs_layout-sel_mode = 'D'. gs_layout-box_fname = 'SELK'. * APPEND gs_layout . ENDFORM. "frm_set_layout *&---------------------------------------------------------------------* *& Form frm_build_fcat *&---------------------------------------------------------------------* * 建立显示字段 *----------------------------------------------------------------------* FORM frm_build_fcat . DATA: lt_fcat TYPE lvc_t_fcat WITH HEADER LINE, ls_fcat TYPE lvc_s_fcat, l_col_pos LIKE lvc_s_fcat-col_pos, l_tabix LIKE sy-tabix. CLEAR: gt_fcat[]. CLEAR ls_fcat. ls_fcat-fieldname = 'CARRID'. ls_fcat-coltext = '测试1'. ls_fcat-outputlen = OUTLs. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'FLDATE'. ls_fcat-coltext = '测试3'. ls_fcat-outputlen = 10. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'PRICE'. ls_fcat-coltext = '航空运费'. ls_fcat-outputlen = 8. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'CURRENCY'. ls_fcat-coltext = '测试5'. ls_fcat-outputlen = 12. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'PLANETYPE'. ls_fcat-coltext = '飞机类型'. ls_fcat-outputlen = 8. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'SEATSMAX'. ls_fcat-coltext = '最大容量'. ls_fcat-outputlen = 8. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'SEATSOCC'. ls_fcat-coltext = '占据的座位'. ls_fcat-outputlen = 10. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'PAYMENTSUM'. ls_fcat-coltext = '当前预定总数'. ls_fcat-outputlen = 12. APPEND ls_fcat TO gt_fcat. ENDFORM. " frm_build_fcat *&---------------------------------------------------------------------* *& Form frm_get_data *&---------------------------------------------------------------------* * 取出显示数据 *----------------------------------------------------------------------* FORM frm_get_data . SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_list FROM sflight. ENDFORM. " frm_get_data *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* * PAI 流程处理 *----------------------------------------------------------------------* MODULE user_command_0100 INPUT. save_ok = ok_code. CLEAR ok_code. CASE save_ok. WHEN '&BACK' OR '&UP' OR '&CANCEL'. LEAVE PROGRAM. ENDCASE. ENDMODULE. " USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* *& Form FRM_BUILD_FCAT1 *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_build_fcat1 . DATA: lt_fcat1 TYPE lvc_t_fcat WITH HEADER LINE, ls_fcat1 TYPE lvc_s_fcat, l_col_pos LIKE lvc_s_fcat-col_pos, l_tabix LIKE sy-tabix. CLEAR: gt_fcat1[]. CLEAR ls_fcat1. ls_fcat1-fieldname = 'SELK'. * ls_fcat-coltext = '测试1'. ls_fcat1-outputlen = 2. APPEND ls_fcat1 TO gt_fcat1. ls_fcat1-fieldname = 'CARRID'. ls_fcat1-coltext = '航线承运人ID'. ls_fcat1-outputlen = OUTL1. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'CONNID'. ls_fcat1-coltext = '航班连接Id'. ls_fcat1-outputlen = OUTL2. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'FLDATE'. ls_fcat1-coltext = '航班日期'. ls_fcat1-outputlen = 10. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'PRICE'. ls_fcat1-coltext = '航空运费'. ls_fcat1-outputlen = 8. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'CURRENCY'. ls_fcat1-coltext = '航班的本地货币'. ls_fcat1-outputlen = 12. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'PLANETYPE'. ls_fcat1-coltext = '飞机类型'. ls_fcat1-outputlen = 8. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'SEATSMAX'. ls_fcat1-coltext = '最大容量'. ls_fcat1-outputlen = 8. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'SEATSOCC'. ls_fcat1-coltext = '占据的座位'. ls_fcat1-outputlen = 10. APPEND ls_fcat1 TO gt_fcat1. CLEAR ls_fcat1. ls_fcat1-fieldname = 'PAYMENTSUM'. ls_fcat1-coltext = '当前预定总数'. ls_fcat1-outputlen = 12. APPEND ls_fcat1 TO gt_fcat1. ENDFORM. " FRM_BUILD_FCAT1 *&---------------------------------------------------------------------* *& Form DIV_TOOLS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM div_tools TABLES pt_exclude TYPE ui_functions . DATA: ls_exclude TYPE ui_func. ls_exclude = cl_gui_alv_grid=>mc_fc_maximum . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_minimum . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_subtot . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_sum . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_average . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_sum . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_subtot . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_sort_asc. APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_sort_dsc . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_find . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_filter . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_print . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_print_prev . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_export . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_graph . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_view . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_detail . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_help . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_info . APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_variant. APPEND ls_exclude TO pt_exclude. ENDFORM. "DIV_TOOLS