• 实现效果

  •  缺点:下载到附件时标题不会被下载,需要结合ole实现; 布局栏位不支持变更

1.创建类

zcl_gui_alv_grid

 

 类源代码:

class ZCL_GUI_ALV_GRID definition
  public
  inheriting from CL_GUI_ALV_GRID
  create public .

*"* public components of class ZCL_GUI_ALV_GRID
*"* do not include other source files here!!
public section.

  methods Z_SET_MERGE_HORIZ
    importing
      !ROW type I
      !VALUE type STRING optional
    changing
      !TAB_COL_MERGE type LVC_T_CO01 .
  methods Z_SET_MERGE_VERT
    importing
      !ROW type I
      !VALUE type STRING optional
    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 .
  methods Z_SET_HEADER_VALUE
    importing
      !ROW type I
      !COL type I
      !VALUE type STRING .
  PROTECTED SECTION.
  PRIVATE SECTION.


ENDCLASS.



CLASS ZCL_GUI_ALV_GRID IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_DISPLAY
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_INIT_CELL_STYLES
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_SET_CELL_STYLE
* +-------------------------------------------------------------------------------------------------+
* | [--->] ROW                            TYPE        I(optional)
* | [--->] COL                            TYPE        I(optional)
* | [--->] STYLE                          TYPE        LVC_STYLE
* | [--->] STYLE2                         TYPE        LVC_STYLE(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_SET_FIXED_COL_ROW
* +-------------------------------------------------------------------------------------------------+
* | [--->] COL                            TYPE        I
* | [--->] ROW                            TYPE        I
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD z_set_fixed_col_row.

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

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_SET_HEADER_VALUE
* +-------------------------------------------------------------------------------------------------+
* | [--->] ROW                            TYPE        I
* | [--->] COL                            TYPE        I
* | [--->] VALUE                          TYPE        STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_SET_MERGE_HORIZ
* +-------------------------------------------------------------------------------------------------+
* | [--->] ROW                            TYPE        I
* | [--->] VALUE                          TYPE        STRING(optional)
* | [<-->] TAB_COL_MERGE                  TYPE        LVC_T_CO01
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GUI_ALV_GRID->Z_SET_MERGE_VERT
* +-------------------------------------------------------------------------------------------------+
* | [--->] ROW                            TYPE        I
* | [--->] VALUE                          TYPE        STRING(optional)
* | [<-->] TAB_COL_MERGE                  TYPE        LVC_T_CO01
* +--------------------------------------------------------------------------------------</SIGNATURE>
  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.
ENDCLASS.
View Code

2.创建程序

************************************************************************
* 程 序 名:xxx
* 程序描述:商城、SAP、支付宝对账
* 事务代码:xxx
************************************************************************
* 修改日志
************************************************************************
* 日期     版本 修改人       描述
* -------- ---- ------------ -------------------------------------------
* 20230609 1.0  Amell        创建程序
*
************************************************************************
REPORT zsdrtest MESSAGE-ID 00.

INCLUDE <cl_alv_control>.
INCLUDE <icon>.

************************************************************************
* Type Pools Definitions          定义类型池
************************************************************************
TYPE-POOLS slis.

************************************************************************
* Tables Definitions
************************************************************************
TABLES: mkpf.
************************************************************************
* Data Definitions                定义数据
************************************************************************
TYPES: BEGIN OF ty_account,
         field01 TYPE string,
         field02 TYPE string,
         field03 TYPE string,
         field04 TYPE string,
         field05 TYPE string,
         field06 TYPE char4,
         field07 TYPE string,
         field08 TYPE string,
         field09 TYPE string,
         field10 TYPE char4,
         field11 TYPE string,
         field12 TYPE string,
         field13 TYPE string,
         field14 TYPE string,
         field15 TYPE string,
         field16 TYPE string,
       END OF ty_account.

DATA: gt_account         TYPE TABLE OF ty_account.

DATA: ok_code             TYPE sy-ucomm,
      gv_container        TYPE scrfname VALUE 'ACCOUNT',
      go_custom_container TYPE REF TO cl_gui_custom_container,
      go_alv_grid         TYPE REF TO zcl_gui_alv_grid,
      gv_save             TYPE c,
      gs_variant          TYPE disvariant.

DATA: gs_layout    TYPE lvc_s_layo, "布局
      gs_style     TYPE lvc_s_styl, "样式
      gt_fieldcat  TYPE lvc_t_fcat, "字段
      gt_col_merge TYPE lvc_t_co01, "列布局
      gs_col_merge TYPE lvc_s_co01. "列布局

CLASS cl_gui_cfw DEFINITION LOAD.

************************************************************************
* Includes Module                 包含模块
************************************************************************

************************************************************************
* Selection Screen                选择屏幕
************************************************************************
SELECT-OPTIONS: s_erdat FOR mkpf-budat.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name = 'S_ERDAT-LOW'.
      screen-required = '1'.
      MODIFY SCREEN.
    ENDIF.

    IF screen-name = 'S_ERDAT-HIGH'.
      screen-required = '1'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.

  "显示容器
  CALL SCREEN 0200.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
  SET PF-STATUS '0200'.
  SET TITLEBAR '001'.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Module INIT_ALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_alv_0200 OUTPUT.

  "初始化对象
  PERFORM frm_init_object.
  "构建ALV的栏位
  PERFORM frm_create_field.
  "构建数据
  PERFORM frm_create_data.
  "显示数据
  PERFORM frm_display_data.
  "合并
  PERFORM frm_merge_data.
  "样式
  PERFORM frm_set_style.
  "显示数据
  go_alv_grid->z_display( ).
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.

  cl_gui_cfw=>dispatch( ).

  CASE ok_code.
    WHEN 'BACK'.
      SET SCREEN 0. LEAVE SCREEN.
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Form FRM_INIT_OBJECT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_object .

  IF go_custom_container IS INITIAL.

    CREATE OBJECT go_custom_container
      EXPORTING
        container_name = gv_container.

    CREATE OBJECT go_alv_grid
      EXPORTING
        i_parent = go_custom_container.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE lvc_s_fcat,
        lv_count(2) TYPE n.

  DO 16 TIMES.

    lv_count = sy-index.

    "栏位显示顺序
    ls_fieldcat-col_pos    = lv_count.

    "内表栏位
    ls_fieldcat-fieldname  = 'FIELD' && lv_count.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  ENDDO.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_data .


  DATA: ls_account TYPE ty_account,
        lv_num TYPE n LENGTH 5.

  "空行数据,用于客户标题合并
  APPEND ls_account TO gt_account.
  CLEAR ls_account.

  ls_account-field01 = '客户'.
  ls_account-field02 = '订单'.
  ls_account-field03 = '建立时间'.
  ls_account-field04 = '金额'.
  ls_account-field05 = '币别'.
  ls_account-field06 = '匹配'.
  ls_account-field07 = '订单'.
  ls_account-field08 = '出货单'.
  ls_account-field09 = '金额'.
  ls_account-field10 = '币别'.
  ls_account-field11 = '匹配'.
  ls_account-field12 = '交易ID'.
  ls_account-field13 = '交易状态'.
  ls_account-field14 = '交易时间'.
  ls_account-field15 = '金额'.
  ls_account-field16 = '币别'.
  APPEND ls_account TO gt_account.
  CLEAR ls_account.

  DO 10 TIMES.
    ADD 1 TO lv_num.
    ls_account-field01 = '客户A'.
    ls_account-field02 = 'EC' && '00000' && lv_num.
    ls_account-field03 = '2023/06/09'.
    ls_account-field04 = '100'.
    ls_account-field05 = 'CNY'.
    ls_account-field06 = icon_led_green.
    ls_account-field07 = '20000' && lv_num.
    ls_account-field08 = '62000' && lv_num.
    ls_account-field09 = '100'.
    ls_account-field10 = 'CNY'.
    IF lv_num > 8.
      ls_account-field11 = icon_led_red.
    ELSE.
      ls_account-field11 = icon_led_green.
    ENDIF.
    ls_account-field12 = '20230610' && lv_num.
    ls_account-field13 = '已到账'.
    ls_account-field14 = '2023/06/10'.
    IF lv_num > 8.
      ls_account-field15 = '90'.
    ELSE.
      ls_account-field15 = '100'.
    ENDIF.
    ls_account-field16 = 'CNY'.
    APPEND ls_account TO gt_account.
    CLEAR ls_account.
  ENDDO.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  "内表字段名称
  gs_layout-stylefname = 'CELL'.

  "隐藏列标题
  gs_layout-no_headers = 'X'.

  "栏位最适宽度
  gs_layout-cwidth_opt = 'X'.

  "隐藏工具栏
  gs_layout-no_toolbar = 'X'.

  "解决多表头ALV行数据有限制的问题
  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_variant                    = gs_variant
      i_save                        = gv_save
      is_layout                     = gs_layout
    CHANGING
      it_fieldcatalog               = gt_fieldcat
      it_outtab                     = gt_account
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_MERGE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_merge_data .

  "合并客户标题
  gs_col_merge-col_id    = 1.
  gs_col_merge-outputlen = 2.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_vert
    EXPORTING
      row           = 1
      value         = '客户'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并商城标题
  gs_col_merge-col_id    = 2.
  gs_col_merge-outputlen = 5.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = '商城'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并SAP标题
  gs_col_merge-col_id    = 7.
  gs_col_merge-outputlen = 10.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = 'SAP'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并支付宝标题
  gs_col_merge-col_id    = 12.
  gs_col_merge-outputlen = 16.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = '支付宝'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "固定标题
  go_alv_grid->z_set_fixed_col_row( EXPORTING col = 0 row = 2 ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_SET_STYLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_style .

  "客户标题、商城标题、SAP标题、支付宝标题设置粗体和居中
  gs_style-style = alv_style_font_bold + alv_style_align_center_center.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 1
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 2
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 7
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 12
      style = gs_style-style.

  CLEAR gs_style.

  "商城列样式(第2列到第5列)
  gs_style-style = alv_style_color_heading.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 2
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 3
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 4
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 5
      style = gs_style-style.

  CLEAR gs_style.

  "SAP列样式(第7列到第10列)
  gs_style-style = alv_style_color_group.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 7
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 8
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 9
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 10
      style = gs_style-style.

  CLEAR gs_style.

  "支付宝列样式(第12列到第16列)
  gs_style-style = alv_style_color_total.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 12
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 13
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 14
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 15
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 16
      style = gs_style-style.

  CLEAR gs_style.
ENDFORM.
View Code

3.创建屏幕

 

控件名需要和container_name 相同

 

 

 

PROCESS BEFORE OUTPUT.
  MODULE status_0200.
  MODULE init_alv_0200.

PROCESS AFTER INPUT.
  MODULE user_command_0200.
View Code

 源代码

************************************************************************
* 程 序 名:xxx
* 程序描述:商城、SAP、支付宝对账
* 事务代码:xxx
************************************************************************
* 修改日志
************************************************************************
* 日期     版本 修改人       描述
* -------- ---- ------------ -------------------------------------------
* 20230609 1.0  Amell        创建程序
*
************************************************************************
REPORT zsdrtest MESSAGE-ID 00.

INCLUDE <cl_alv_control>.
INCLUDE <icon>.

************************************************************************
* Type Pools Definitions          定义类型池
************************************************************************
TYPE-POOLS slis.

************************************************************************
* Tables Definitions
************************************************************************
TABLES: mkpf.
************************************************************************
* Data Definitions                定义数据
************************************************************************
TYPES: BEGIN OF ty_account,
         field01 TYPE string,
         field02 TYPE string,
         field03 TYPE string,
         field04 TYPE string,
         field05 TYPE string,
         field06 TYPE char4,
         field07 TYPE string,
         field08 TYPE string,
         field09 TYPE string,
         field10 TYPE char4,
         field11 TYPE string,
         field12 TYPE string,
         field13 TYPE string,
         field14 TYPE string,
         field15 TYPE string,
         field16 TYPE string,
       END OF ty_account.

DATA: gt_account         TYPE TABLE OF ty_account.

DATA: ok_code             TYPE sy-ucomm,
      gv_container        TYPE scrfname VALUE 'ACCOUNT',
      go_custom_container TYPE REF TO cl_gui_custom_container,
      go_alv_grid         TYPE REF TO zcl_gui_alv_grid,
      gv_save             TYPE c,
      gs_variant          TYPE disvariant.

DATA: gs_layout    TYPE lvc_s_layo, "布局
      gs_style     TYPE lvc_s_styl, "样式
      gt_fieldcat  TYPE lvc_t_fcat, "字段
      gt_col_merge TYPE lvc_t_co01, "列布局
      gs_col_merge TYPE lvc_s_co01. "列布局

CLASS cl_gui_cfw DEFINITION LOAD.

************************************************************************
* Includes Module                 包含模块
************************************************************************

************************************************************************
* Selection Screen                选择屏幕
************************************************************************
SELECT-OPTIONS: s_erdat FOR mkpf-budat.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF screen-name = 'S_ERDAT-LOW'.
      screen-required = '1'.
      MODIFY SCREEN.
    ENDIF.

    IF screen-name = 'S_ERDAT-HIGH'.
      screen-required = '1'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.

  "显示容器
  CALL SCREEN 0200.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
  SET PF-STATUS '0200'.
  SET TITLEBAR '001'.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Module INIT_ALV_0200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_alv_0200 OUTPUT.

  "初始化对象
  PERFORM frm_init_object.
  "构建ALV的栏位
  PERFORM frm_create_field.
  "构建数据
  PERFORM frm_create_data.
  "显示数据
  PERFORM frm_display_data.
  "合并
  PERFORM frm_merge_data.
  "样式
  PERFORM frm_set_style.
  "显示数据
  go_alv_grid->z_display( ).
ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0200  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.

  cl_gui_cfw=>dispatch( ).

  CASE ok_code.
    WHEN 'BACK'.
      SET SCREEN 0. LEAVE SCREEN.
  ENDCASE.
ENDMODULE.

*&---------------------------------------------------------------------*
*& Form FRM_INIT_OBJECT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_object .

  IF go_custom_container IS INITIAL.

    CREATE OBJECT go_custom_container
      EXPORTING
        container_name = gv_container.

    CREATE OBJECT go_alv_grid
      EXPORTING
        i_parent = go_custom_container.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_CREATE_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_field .

  DATA: ls_fieldcat TYPE lvc_s_fcat,
        lv_count(2) TYPE n.

  DO 16 TIMES.

    lv_count = sy-index.

    "栏位显示顺序
    ls_fieldcat-col_pos    = lv_count.

    "内表栏位
    ls_fieldcat-fieldname  = 'FIELD' && lv_count.

    APPEND ls_fieldcat TO gt_fieldcat.
    CLEAR ls_fieldcat.
  ENDDO.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create_data .


  DATA: ls_account TYPE ty_account,
        lv_num TYPE n LENGTH 5.

  "空行数据,用于客户标题合并
  APPEND ls_account TO gt_account.
  CLEAR ls_account.

  ls_account-field01 = '客户'.
  ls_account-field02 = '订单'.
  ls_account-field03 = '建立时间'.
  ls_account-field04 = '金额'.
  ls_account-field05 = '币别'.
  ls_account-field06 = '匹配'.
  ls_account-field07 = '订单'.
  ls_account-field08 = '出货单'.
  ls_account-field09 = '金额'.
  ls_account-field10 = '币别'.
  ls_account-field11 = '匹配'.
  ls_account-field12 = '交易ID'.
  ls_account-field13 = '交易状态'.
  ls_account-field14 = '交易时间'.
  ls_account-field15 = '金额'.
  ls_account-field16 = '币别'.
  APPEND ls_account TO gt_account.
  CLEAR ls_account.

  DO 10 TIMES.
    ADD 1 TO lv_num.
    ls_account-field01 = '客户A'.
    ls_account-field02 = 'EC' && '00000' && lv_num.
    ls_account-field03 = '2023/06/09'.
    ls_account-field04 = '100'.
    ls_account-field05 = 'CNY'.
    ls_account-field06 = icon_led_green.
    ls_account-field07 = '20000' && lv_num.
    ls_account-field08 = '62000' && lv_num.
    ls_account-field09 = '100'.
    ls_account-field10 = 'CNY'.
    IF lv_num > 8.
      ls_account-field11 = icon_led_red.
    ELSE.
      ls_account-field11 = icon_led_green.
    ENDIF.
    ls_account-field12 = '20230610' && lv_num.
    ls_account-field13 = '已到账'.
    ls_account-field14 = '2023/06/10'.
    IF lv_num > 8.
      ls_account-field15 = '90'.
    ELSE.
      ls_account-field15 = '100'.
    ENDIF.
    ls_account-field16 = 'CNY'.
    APPEND ls_account TO gt_account.
    CLEAR ls_account.
  ENDDO.


ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_data .

  "内表字段名称
  gs_layout-stylefname = 'CELL'.

  "隐藏列标题
  gs_layout-no_headers = 'X'.

  "栏位最适宽度
  gs_layout-cwidth_opt = 'X'.

  "隐藏工具栏
  gs_layout-no_toolbar = 'X'.

  "解决多表头ALV行数据有限制的问题
  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_variant                    = gs_variant
      i_save                        = gv_save
      is_layout                     = gs_layout
    CHANGING
      it_fieldcatalog               = gt_fieldcat
      it_outtab                     = gt_account
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_MERGE_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_merge_data .

  "合并客户标题
  gs_col_merge-col_id    = 1.
  gs_col_merge-outputlen = 2.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_vert
    EXPORTING
      row           = 1
      value         = '客户'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并商城标题
  gs_col_merge-col_id    = 2.
  gs_col_merge-outputlen = 5.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = '商城'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并SAP标题
  gs_col_merge-col_id    = 7.
  gs_col_merge-outputlen = 10.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = 'SAP'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "合并支付宝标题
  gs_col_merge-col_id    = 12.
  gs_col_merge-outputlen = 16.
  APPEND gs_col_merge TO gt_col_merge.
  CLEAR gs_col_merge.

  CALL METHOD go_alv_grid->z_set_merge_horiz
    EXPORTING
      row           = 1
      value         = '支付宝'
    CHANGING
      tab_col_merge = gt_col_merge.

  CLEAR gt_col_merge.

  "固定标题
  go_alv_grid->z_set_fixed_col_row( EXPORTING col = 0 row = 2 ).

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_SET_STYLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_set_style .

  "客户标题、商城标题、SAP标题、支付宝标题设置粗体和居中
  gs_style-style = alv_style_font_bold + alv_style_align_center_center.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 1
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 2
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 7
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      row   = 1
      col   = 12
      style = gs_style-style.

  CLEAR gs_style.

  "商城列样式(第2列到第5列)
  gs_style-style = alv_style_color_heading.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 2
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 3
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 4
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 5
      style = gs_style-style.

  CLEAR gs_style.

  "SAP列样式(第7列到第10列)
  gs_style-style = alv_style_color_group.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 7
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 8
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 9
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 10
      style = gs_style-style.

  CLEAR gs_style.

  "支付宝列样式(第12列到第16列)
  gs_style-style = alv_style_color_total.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 12
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 13
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 14
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 15
      style = gs_style-style.

  CALL METHOD go_alv_grid->z_set_cell_style
    EXPORTING
      col   = 16
      style = gs_style-style.

  CLEAR gs_style.
ENDFORM.
View Code

 

原文连接

 
posted on 2024-10-17 14:33  淡淡-祥  阅读(3)  评论(0编辑  收藏  举报