ABAP 多表头合并

在日常开发中如果不使用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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值