ALV单元格合并

一、使用WRITE方法

REPORT yalvmultipleheader
NO STANDARD PAGE HEADING.

type-pools: slis.

data :t_fieldcat  type slis_t_fieldcat_alv,
      w_fieldcat  type slis_fieldcat_alv,
      layout      type slis_layout_alv,
      t_sort      type slis_t_sortinfo_alv,
      t_event     type slis_t_event with header line,
      d_repid     like sy-repid,
      d_layout    type slis_layout_alv,
      key         type slis_keyinfo_alv.

types : begin of ty_data,
        store(15),
        book(30),
        author(30),
        amount(7) type p,
        price type dmbtr,
        total type dmbtr, "(10) TYPE p DECIMALS 2,
        curr type waers,
        end of ty_data.

data : t_data type ty_data occurs 0 with header line.


START-OF-SELECTION.
PERFORM f_process_data.
PERFORM f_write_data.

*&---------------------------------------------------------------------*
*&      Form  F_PROCESS_DATA
*&---------------------------------------------------------------------*
form f_process_data .
*fill data t_data
  t_data-store = 'Gramedia'.
  t_data-book = 'Negeri 5 Menara'.
  t_data-author = 'A. Fuadi'.
  t_data-amount = 1000.
  t_data-price = 50000.
  t_data-total = t_data-amount * t_data-price.
  t_data-curr = 'IDR'.
  append t_data.
  t_data-store = 'Eureka'.
  t_data-amount = 1000.
  t_data-price = 50000.
  t_data-total = t_data-amount * t_data-price.
  append t_data.
endform.                    " F_PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  F_WRITE_DATA
*&---------------------------------------------------------------------*
form f_write_data .
  perform field_catalog.
  perform build_layout.
  perform build_event.

  d_repid = sy-repid.

    call function 'REUSE_ALV_LIST_DISPLAY'
    exporting
      i_callback_program = d_repid
      is_layout          = d_layout
      i_bypassing_buffer = 'X'
      it_fieldcat        = t_fieldcat
      i_default          = 'X'
      i_save             = 'A'
      it_events          = t_event[]
      it_sort            = t_sort
    tables
      t_outtab           = t_data[]
    exceptions
      program_error      = 1
      others             = 2.
endform.                    " F_WRITE_DATA
*&---------------------------------------------------------------------*
*&      Form  FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form field_catalog .
  perform f_fieldcats using :
 'STORE'  'STORE'       '20' ''  ''     ''  ''  '',
 'BOOK'   'BOOK'        '20' ''  ''     ''  ''  '',
 'AUTHOR' 'AUTHOR'      '20' ''  ''     ''  ''  '',
 'AMOUNT' 'AMOUNT'      '10' ''  ''     ''  ''  '',
 'PRICE'  'PRICE'       '15' ''  ''     ''  ''  '',
 'TOTAL'  'TOTAL'       '20' '' ''     ''  ''  ''.
endform.                    " FIELD_CATALOG
*&---------------------------------------------------------------------*
*&      Form  F_FIELDCATS
*&---------------------------------------------------------------------*
form f_fieldcats using fu_fname
                       fu_text
                       fu_len
                       fu_sum
                       fu_curr
                       fu_spot
                       fu_out
                       fu_sign.

  data : lt_fieldcat type slis_fieldcat_alv.
  lt_fieldcat-fieldname      = fu_fname.  "field name
  lt_fieldcat-seltext_l      = lt_fieldcat-seltext_m =  "text
  lt_fieldcat-seltext_s      = fu_text.
  lt_fieldcat-reptext_ddic   = fu_text.
  lt_fieldcat-outputlen      = fu_len.  "text length
  lt_fieldcat-do_sum         = fu_sum.  "summing
  lt_fieldcat-cfieldname     = fu_curr. "currency
  lt_fieldcat-hotspot        = fu_spot.
  lt_fieldcat-no_out         = fu_out.
  lt_fieldcat-no_sign        = fu_sign.

  append lt_fieldcat to t_fieldcat.
  clear: lt_fieldcat.

endform.                    " F_FIELDCATS
*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
form build_layout .
  d_layout-colwidth_optimize = ''.
  d_layout-zebra = 'X'.
  d_layout-no_colhead         = 'X'. "space.

endform.                    " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  BUILD_EVENT
*&---------------------------------------------------------------------*
form build_event .
  t_event-form = 'TOP_PAGE'.
  t_event-name = 'TOP_OF_PAGE'.
  append t_event.
endform.                    " BUILD_EVENT

*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
form top_page.
  uline (295) .
  format color 1 .
  write: / sy-vline, (18) 'Store' centered,
           sy-vline, (18) 'Book' centered,
           sy-vline, (18) 'Author' centered,
           sy-vline, (8) 'Amount' centered,
           sy-vline, (34) 'Price' centered,
           sy-vline.

  write: / sy-vline, (18) ' ' centered,
         sy-vline, (18)  ' ' centered,
         sy-vline, (18) ' ' centered,
         sy-vline, (8) ' ' centered,
         sy-vline, (13) 'per Unit' centered,
         sy-vline, (18) 'Total' centered,
         sy-vline.
  format COLOR off.
endform.                    "top_of_page

效果:

二、使用 SE80 或事务 SE24 创建类 ZCL_GUI_ALV_GRID_MERGE。然后继承类 CL_GUI_ALV_GRID 并实现以下方法(网址:Zellen verbinden - Tricktresor)

*SE24基于源代码创建类
CLASS zcl_gui_alv_grid_merge DEFINITION
  PUBLIC
  INHERITING FROM cl_gui_alv_grid
  CREATE PUBLIC .

  PUBLIC SECTION.
    METHODS z_set_merge_horiz
      IMPORTING
        row           TYPE i
      CHANGING
        tab_col_merge TYPE lvc_t_co01 .
    METHODS z_set_merge_vert
      IMPORTING
        row           TYPE i
      CHANGING
        tab_col_merge TYPE lvc_t_co01 .
    METHODS z_display .
    METHODS z_set_cell_style
      IMPORTING
        row    TYPE i OPTIONAL
        col    TYPE i OPTIONAL
        style  TYPE lvc_style
        style2 TYPE lvc_style OPTIONAL .
    METHODS z_set_fixed_col_row
      IMPORTING
        col TYPE i
        row TYPE i .
    METHODS z_init_cell_styles .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS ZCL_GUI_ALV_GRID_MERGE IMPLEMENTATION.

  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.

  METHOD z_init_cell_styles.

    FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.

    LOOP AT mt_data ASSIGNING <fs_data>.
      <fs_data>-style = 0.
    ENDLOOP.

  ENDMETHOD.

  METHOD z_set_cell_style.

    FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
    IF row IS INITIAL.
      IF col IS INITIAL.

        EXIT.
      ELSE.

        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.

        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.

  METHOD z_set_fixed_col_row.

    me->set_fixed_cols( col ).
    me->set_fixed_rows( row ).

  ENDMETHOD.

  METHOD z_set_merge_horiz.

    FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
    FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
    DATA outputlen TYPE i.

    SORT tab_col_merge.
    LOOP AT tab_col_merge ASSIGNING <fs_cols>.

      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 ).

        IF <fs_data>-col_pos = <fs_cols>-col_id.
          <fs_data>-mergehoriz = outputlen.

        ELSE.
          CLEAR <fs_data>-mergehoriz.
          CLEAR <fs_data>-value.
        ENDIF.
      ENDLOOP.

    ENDLOOP.

  ENDMETHOD.

  METHOD z_set_merge_vert.

    FIELD-SYMBOLS <fs_cols> TYPE lvc_s_co01.
    FIELD-SYMBOLS <fs_data> TYPE lvc_s_data.
    DATA outputlen TYPE i.

    SORT tab_col_merge.

    LOOP AT tab_col_merge ASSIGNING <fs_cols>.

      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 ).

        IF <fs_data>-col_pos = <fs_cols>-col_id.
          <fs_data>-mergevert = outputlen.

        ELSE.
          CLEAR <fs_data>-mergevert.
          CLEAR <fs_data>-value.
        ENDIF.
      ENDLOOP.

    ENDLOOP.

  ENDMETHOD.
ENDCLASS.

SE38创建程序创建0200的屏幕并画一个CU_CON控件

*SE38直接复制粘贴
REPORT y4_b4_test16.
INCLUDE <cl_alv_control>.
INCLUDE <icon>.
DATA retc TYPE sy-subrc. .
DATA ok_code TYPE sy-ucomm.
DATA it_grp TYPE lvc_t_sgrp.
DATA it_fil TYPE lvc_t_filt.
DATA wa_fil TYPE lvc_s_filt.

* **** ALV_GRID    ****************************************************
TYPES: BEGIN OF t_check_styles,
         field01(20),
         field02(20),
         field03(20),
         field04(20),
         field05(20),
         field06(20),
         field07(20),
         field08(20),
         field09(20),
         field10(20),
         field11(20),
         field12(20).
TYPES END OF t_check_styles.

DATA it_styles TYPE t_check_styles OCCURS 0.
DATA wa_styles TYPE t_check_styles.
FIELD-SYMBOLS <fs_styles> TYPE t_check_styles.
DATA : lt_fieldcatalog TYPE lvc_t_fcat.
DATA : ls_fieldcatalog TYPE lvc_t_fcat.
DATA : wa_cat TYPE lvc_s_fcat.
DATA : fieldname(40).
DATA : fieldnr(2) TYPE n.

FIELD-SYMBOLS <fs_cat> TYPE lvc_s_fcat.

DATA lt_iinfo TYPE lvc_t_info.
DATA wa_iinfo TYPE lvc_s_info.
DATA lt_idata TYPE lvc_t_data.
DATA wa_idata TYPE lvc_s_data.

DATA it_col_merge TYPE lvc_t_co01.
DATA wa_col_merge TYPE lvc_s_co01.
DATA: g_container TYPE scrfname VALUE 'CU_CON'.
DATA: g_custom_container TYPE REF TO cl_gui_custom_container.
DATA g_alv_grid TYPE REF TO zcl_gui_alv_grid_merge.
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.

START-OF-SELECTION.
  CALL SCREEN 0200.

END-OF-SELECTION.

MODULE status_0200 OUTPUT.

** Status und Titel setzen
  SET PF-STATUS '0200'.
  SET TITLEBAR '001'.

** Objekte instanzieren und zuordnen: Grid
  IF g_custom_container IS INITIAL.

    CREATE OBJECT g_custom_container
      EXPORTING
        container_name = g_container.

    CREATE OBJECT g_alv_grid
      EXPORTING
        i_parent = g_custom_container.

    gs_layout-stylefname = 'CELL'.
    gs_layout-no_headers = 'X'.
    gs_layout-cwidth_opt = ' '.
    gs_layout-no_toolbar = 'X'.

** Feldkatalog erzeugen
    REFRESH lt_fieldcatalog.

    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
      EXPORTING
        i_internal_tabname     = 'IT_STYLES'
      CHANGING
        ct_fieldcat            = lt_fieldcatalog
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.

    REFRESH lt_fieldcatalog.
    REFRESH lt_iinfo.

    DO 12 TIMES.
      CLEAR wa_cat.
      fieldnr = sy-index.
      wa_cat-col_pos = sy-index.
      CONCATENATE 'FIELD' fieldnr INTO fieldname.
      wa_cat-fieldname = fieldname.
      wa_cat-tabname   = '1'.
      wa_cat-datatype  = 'CHAR'.
      wa_cat-inttype   = 'C'.
      wa_cat-intlen    = 20.
      IF sy-index > 1.
        wa_cat-outputlen    = 6.
      ELSE.
        wa_cat-outputlen    = 20.
      ENDIF.
      wa_cat-reptext   = fieldname.
      wa_cat-scrtext_l = fieldname.
      wa_cat-scrtext_m = fieldname.
      wa_cat-scrtext_s = fieldname.
      wa_cat-scrtext_l = fieldname.
      APPEND wa_cat TO lt_fieldcatalog.
    ENDDO.

* 1 Zeile
    CLEAR wa_styles.
    wa_styles-field01 = 'TRICKTRESOR'.
    wa_styles-field03 = 'F'.
    wa_styles-field04 = 'P'.
    wa_styles-field09 = 'M'.
    wa_styles-field10 = 'K'.
    APPEND wa_styles TO it_styles.
* 2 Zeile
    CLEAR wa_styles.
    wa_styles-field03 = 'HQ'.
    wa_styles-field04 = 'HC'.
    wa_styles-field08 = 'HW'.
    wa_styles-field09 = 'HC'.
    wa_styles-field10 = 'HC'.
    wa_styles-field12 = 'HW'.
    APPEND wa_styles TO it_styles.
* 3-Zeile
    CLEAR wa_styles.
    wa_styles-field01 = 'Bezeichnung'.
    wa_styles-field02 = 'Radius'.
    wa_styles-field03 = 'WPX 12'.
    wa_styles-field04 = 'WAP 25'.
    wa_styles-field05 = 'WAP 35'.
    wa_styles-field06 = 'WTP 35'.
    wa_styles-field07 = 'WXP 45'.
    wa_styles-field08 = 'WPM'.
    wa_styles-field09 = 'WXM 35'.
    wa_styles-field10 = 'WAK 15'.
    wa_styles-field11 = 'WAK 25'.
    wa_styles-field12 = 'WKM'.
    APPEND wa_styles TO it_styles.

* 4..Zeile
    CLEAR wa_styles.
    wa_styles-field01 = 'SPMW 060304 T - A 27'.
    wa_styles-field02 = '0.54'.
    wa_styles-field03 = icon_led_green.
    wa_styles-field04 = icon_led_yellow.
    wa_styles-field05 = icon_led_red.
    wa_styles-field08 = icon_led_yellow.
    APPEND wa_styles TO it_styles.

    CLEAR wa_styles.
    wa_styles-field01 = 'SPMW 060304 - A 57'.
    wa_styles-field02 = '0.43'.
    wa_styles-field03 = icon_led_yellow.
    wa_styles-field05 = icon_led_red.
    wa_styles-field08 = icon_led_yellow.
    wa_styles-field10 = icon_led_yellow.
    wa_styles-field11 = icon_led_red.
    wa_styles-field12 = icon_led_yellow.
    APPEND wa_styles TO it_styles.

    CLEAR wa_styles.
    wa_styles-field01 = 'SPMW 060304 - D 51'.
    wa_styles-field02 = '0.76'.
    wa_styles-field04 = icon_led_yellow.
    wa_styles-field05 = icon_led_red.
    wa_styles-field06 = icon_led_red.
    wa_styles-field07 = icon_led_red.
    APPEND wa_styles TO it_styles.

    CLEAR wa_styles.
    wa_styles-field01 = 'SPMW 060304 - F 55'.
    wa_styles-field02 = '0.44'.
    wa_styles-field03 = icon_led_red.
    wa_styles-field05 = icon_led_green.
    wa_styles-field06 = icon_led_yellow.
    wa_styles-field07 = icon_led_red.
    wa_styles-field09 = icon_led_yellow.
    wa_styles-field10 = icon_led_green.
    wa_styles-field11 = icon_led_yellow.
    wa_styles-field12 = icon_led_yellow.
    APPEND wa_styles TO it_styles.

    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       = it_styles.

    REFRESH it_col_merge.

*** DEMO vertikal verbinden
    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 "第一行
      CHANGING
        tab_col_merge = it_col_merge.
    "设置格式
    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.

*** VERTIKAL verbinden
    CLEAR it_col_merge.

    wa_col_merge-col_id    = 4.
    wa_col_merge-outputlen = 8.
    APPEND wa_col_merge TO 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
      CHANGING
        tab_col_merge = it_col_merge.

    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.

    REFRESH 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
      CHANGING
        tab_col_merge = it_col_merge.

    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 ).

    g_alv_grid->z_display( ).

  ENDIF.
ENDMODULE. "status_0100 OUTPUT

MODULE user_command_0200 INPUT.

  cl_gui_cfw=>dispatch( ).

  CASE ok_code.
    WHEN '&F03' OR '&F12' OR '&F15'.
      SET SCREEN 0. LEAVE SCREEN.
  ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值