SAP-ABAP-普通OOALV,OOALV分屏展示,发送邮件excel附件合并单元格,附件带框线,附件居中。

2023-11-20

功能展示

1.三个可拖动变换大小的屏幕

2.普通OOALV

 3.带格式的邮件附件,三个表格,合并居中,单元格带框线,指定列宽。

代码如下,复制可直接激活,没有include,创建程序后还有一些其他步骤,详情见后文

*&---------------------------------------------------------------------*
*& Report ZLQT_OOALV_SPLIT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLQT_OOALV_SPLIT.
TABLES : t001,BKPF,SSCRFIELDS." ---TODO
TYPE-POOLS:icon.

DATA: ok_code LIKE sy-ucomm.


CLASS lcl_event_receiver DEFINITION DEFERRED.
DATA: event_receiver TYPE REF TO lcl_event_receiver.

DATA: gt_fieldcat          TYPE lvc_t_fcat,
      gt_fieldcat1         TYPE lvc_t_fcat,
      gt_fieldcat2         TYPE lvc_t_fcat,
      gt_fieldcat3         TYPE lvc_t_fcat,
      gs_layout            TYPE lvc_s_layo,
      gs_variant           TYPE disvariant,
      gt_t_f4              TYPE lvc_t_f4,
      GT_SELCELL           TYPE LVC_T_CELL,
      it_toolbar_excluding TYPE ui_functions.

DATA: stbl TYPE lvc_s_stbl. "鼠标游标位置
DATA: et_filtered TYPE lvc_t_fidx.
DATA: gv_code TYPE sy-tcode .

DATA alv_grid TYPE REF TO cl_gui_alv_grid. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
DATA gs_parent TYPE REF TO cl_gui_custom_container . "定义容器
DATA gt_select TYPE lvc_t_cell . "定義選中單元格方法參數
DATA gt_selrow TYPE lvc_t_row  . "定義選中行方法參數

*DATA: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.


"$. Region 此处定义改为需要用到的定义-TODO
TYPES : BEGIN OF ty_item ,
    XH       TYPE C LENGTH 3,
    SUM      TYPE C LENGTH 3,
    YUE01    TYPE C LENGTH 3,
    YUE02    TYPE C LENGTH 3,
    YUE03    TYPE C LENGTH 3,
    YUE04    TYPE C LENGTH 3,
    YUE05    TYPE C LENGTH 3,
    YUE06    TYPE C LENGTH 3,
    YUE07    TYPE C LENGTH 3,
    YUE08    TYPE C LENGTH 3,
    YUE09    TYPE C LENGTH 3,
    YUE10    TYPE C LENGTH 3,
    YUE11    TYPE C LENGTH 3,
    YUE12    TYPE C LENGTH 3,
 END OF ty_item .
DATA gt_item TYPE TABLE OF ty_item .

TYPES : BEGIN OF TY_HB1 ,
    XH       TYPE C LENGTH 3,
    SUM      TYPE C LENGTH 3,
    YUE01    TYPE C LENGTH 3,
    YUE02    TYPE C LENGTH 3,
    YUE03    TYPE C LENGTH 3,
    YUE04    TYPE C LENGTH 3,
    YUE05    TYPE C LENGTH 3,
    YUE06    TYPE C LENGTH 3,
    YUE07    TYPE C LENGTH 3,
    YUE08    TYPE C LENGTH 3,
    YUE09    TYPE C LENGTH 3,
    YUE10    TYPE C LENGTH 3,
    YUE11    TYPE C LENGTH 3,
    YUE12    TYPE C LENGTH 3,
END OF TY_HB1 .
DATA gt_HB1 TYPE TABLE OF TY_HB1 .
DATA gS_HB1 TYPE  TY_HB1 .
DATA gt_HB1S TYPE TABLE OF TY_HB1 .
DATA gS_HB1S TYPE  TY_HB1 .

TYPES : BEGIN OF TY_HB2 ,
    XH       TYPE C LENGTH 3,
    SUM      TYPE C LENGTH 3,
    YC01     TYPE C LENGTH 3,
    YC02     TYPE C LENGTH 3,
    YC03     TYPE C LENGTH 3,
    YC04     TYPE C LENGTH 3,
END OF TY_HB2 .
DATA gt_HB2 TYPE TABLE OF TY_HB2 .
DATA gS_HB2 TYPE  TY_HB2 .
DATA gS_HB2S TYPE  TY_HB2 .

TYPES : BEGIN OF TY_HB3 ,
    XH       TYPE C LENGTH 3,
    SUM      TYPE C LENGTH 3,
    YUE01    TYPE C LENGTH 3,
    YUE02    TYPE C LENGTH 3,
    YUE03    TYPE C LENGTH 3,
    YUE04    TYPE C LENGTH 3,
    YUE05    TYPE C LENGTH 3,
    YUE06    TYPE C LENGTH 3,
    YUE07    TYPE C LENGTH 3,
    YUE08    TYPE C LENGTH 3,
    YUE09    TYPE C LENGTH 3,
    YUE10    TYPE C LENGTH 3,
    YUE11    TYPE C LENGTH 3,
    YUE12    TYPE C LENGTH 3,
END OF TY_HB3 .
DATA gt_HB3 TYPE TABLE OF TY_HB3 .
DATA gS_HB3 TYPE  TY_HB3 .
DATA gS_HB3S TYPE  TY_HB3 .

DATA: gt_xml_table_forecast   TYPE TABLE OF x255.
"拆分屏幕定义
DATA: g_doc_cont   TYPE REF TO cl_gui_docking_container.
DATA: g_grid_left   TYPE REF TO cl_gui_alv_grid.
DATA: g_grid_right  TYPE REF TO cl_gui_alv_grid.
DATA: g_grid2       TYPE REF TO cl_gui_alv_grid.
"$. Endregion 此处定义改为需要用到的定义-TODO

*&---------------------------------------------------------------------*
*&       Class LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
*        Text
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.

    METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid    "定义类中的方法---双击
      IMPORTING e_row e_column es_row_no.                                    "
    "                                                 "
    METHODS handle_onf4 FOR EVENT onf4 OF cl_gui_alv_grid                    "定义类中的方法---F4帮助
      IMPORTING e_fieldname es_row_no er_event_data .                        "
    "
    METHODS handle_toolbar      FOR EVENT toolbar OF cl_gui_alv_grid         "定义类中的方法---ALV状态栏按钮
      IMPORTING e_object e_interactive .                                     "
    "
    METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid    "定义类中的方法---按钮触发方法
      IMPORTING e_ucomm .                                                    "
    "
    METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid    "定义类中的方法---数据修改时的方法
      IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.   "

    METHODS  handle_data_changed_finished FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.
ENDCLASS. "LCL_EVENT_RECEIVER
"$. Endregion 定义

"$. Region 选择屏幕-TODO

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS : P_ZYEAR TYPE BKPF-GJAHR DEFAULT SY-DATUM(4) .
  SELECTION-SCREEN SKIP 1 .

  PARAMETERS : P_MX RADIOBUTTON GROUP G1 DEFAULT 'X'.  "明细数据
  PARAMETERS : P_HZ1 RADIOBUTTON GROUP G1 .            "责任部门与异常零件点数统计"
"  PARAMETERS : P_HZ2 RADIOBUTTON GROUP G1.            "责任部门与延迟天数统计汇总
"  PARAMETERS : P_HZ3 RADIOBUTTON GROUP G1.            "责任部门与责任人异常零件点数统计TOP10

SELECTION-SCREEN END OF BLOCK b1 .

SELECTION-SCREEN FUNCTION KEY 1. "
"$. Endregion 选择屏幕-TODO
INITIALIZATION.
  stbl-row = 'X'.
  stbl-col = 'X'.
  SSCRFIELDS-FUNCTXT_01 = '维护邮箱'.


AT SELECTION-SCREEN.

  "$. Region 权限-TODO

* SELECT T001~BUKRS FROM T001 WHERE T001~BUKRS IN @S_BUKRS INTO TABLE @DATA(GT_BUKRS) .
*
* LOOP AT GT_BUKRS INTO DATA(GS_BUKRS).
*  AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
*              ID 'BUKRS' FIELD GS_BUKRS-BUKRS
*               ID 'ACTVT' FIELD '03'.
*  IF SY-SUBRC <> 0.
*      MESSAGE '您没有公司代码' && GS_BUKRS-BUKRS  && '的操作权限!'   TYPE 'E' .
*
*  ENDIF.
*
* ENDLOOP.

  "$. Endregion 权限-TODO

  CASE SSCRFIELDS-UCOMM.          "处理按钮命令
    WHEN'FC01'.

      CALL FUNCTION 'VIEW_MAINTENANCE_CALL'
        EXPORTING
          ACTION    = 'U'
          VIEW_NAME = 'ZTMM200_MAIL'.  "改成自己维护邮箱的表或者删掉在后面写死
    WHEN OTHERS.

  ENDCASE.

START-OF-SELECTION.
  PERFORM frm_get_data.
  IF P_MX = 'X'.
    CALL SCREEN 9000.
  ELSEIF P_HZ1 = 'X' .
    CALL SCREEN 8000.
  ENDIF.

  "$. Region FORM
MODULE status_9000 OUTPUT.
  SET PF-STATUS '9000'.
  SET TITLEBAR '9000'.
  DATA(gv_frist) = 'X' . "判断是不是第一次运行,自添加按钮需要刷新才能显示

  PERFORM prepare_field_catalog USING 0 CHANGING gt_fieldcat.
  PERFORM prepare_field_catalog USING 1 CHANGING gt_fieldcat1.
  PERFORM prepare_field_catalog USING 2 CHANGING gt_fieldcat2.
  PERFORM prepare_field_catalog USING 3 CHANGING gt_fieldcat3.
  PERFORM prepare_layout        CHANGING gs_layout.
  IF P_MX = 'X'.
    PERFORM frm_display_alv .
  ELSEIF P_HZ1 = 'X' .
    PERFORM frm_display_alv_SPLIT .
  ENDIF.
  IF gv_frist = 'X' AND alv_grid IS NOT INITIAL.
    CALL METHOD alv_grid->refresh_table_display  "增加按钮需要刷新才会显示出来,否则无法显示。
      EXPORTING
        is_stable = stbl.
    gv_frist = '0' ."判断是否为第一次,为第一次则刷新
  ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9000  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
  gv_code = ok_code .
  CASE ok_code.
    WHEN 'BACK'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'CANCEL'.
      CLEAR: gt_item.
      LEAVE TO SCREEN 0.
    WHEN 'MAIL'.
      PERFORM frm_process_xml_data.
      PERFORM frm_send_email .
  ENDCASE.
ENDMODULE.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_double_click.
    MESSAGE  '双击' TYPE 'S'. "  e_row  e_column  es_row_no
    CALL METHOD alv_grid->get_selected_cells
      IMPORTING
        et_cell = GT_SELCELL
        .

  ENDMETHOD.                    "HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能

  METHOD handle_onf4.

    DATA: ls_modi    TYPE lvc_s_modi,
          lt_ret_tab TYPE TABLE OF ddshretval.
    IF e_fieldname = 'REPTEXT'.
      READ TABLE gt_item INDEX es_row_no-row_id ASSIGNING FIELD-SYMBOL(<fs_item>).
*      CHECK sy-subrc = 0.
      IF sy-subrc = 0.
        .
        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield   = 'DDTEXT'
            value_org  = 'S'
          TABLES
            value_tab  = gt_item
            return_tab = lt_ret_tab.
        IF sy-subrc = 0.
          READ TABLE lt_ret_tab INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_ret>).
          IF sy-subrc = 0.
          ENDIF.
        ENDIF.
        er_event_data->m_event_handled = 'X'.
        CALL METHOD alv_grid->refresh_table_display
          EXPORTING
            is_stable = stbl.
      ENDIF .
    ENDIF .
  ENDMETHOD.                    "需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用

  METHOD handle_toolbar.    "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法

    DATA: ls_toolbar        TYPE stb_button.
    CLEAR ls_toolbar.
    MOVE 3                  TO ls_toolbar-butn_type.      "分隔符
    APPEND ls_toolbar       TO e_object->mt_toolbar.

"    CLEAR ls_toolbar.
"    MOVE 'MAIL'            TO ls_toolbar-function.        "功能码
"    MOVE '发送邮件'         TO ls_toolbar-quickinfo.
"    MOVE '发送邮件'         TO ls_toolbar-text.            "显示名称
"    MOVE ' '                TO ls_toolbar-disabled.
"    APPEND ls_toolbar       TO e_object->mt_toolbar.

  ENDMETHOD.                    "在ALV状态栏增加按钮,一般是汇总按钮

  METHOD handle_user_command.
    CASE e_ucomm.
      WHEN 'MAIL'.
      WHEN OTHERS.
    ENDCASE.
    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.
    CALL METHOD alv_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.
  ENDMETHOD.                    "一般与HANDLE_TOOLBAR同用

  METHOD handle_data_changed.   "er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
"用途在于检查这行是否能修改,数据是否合法
    LOOP AT er_data_changed->mt_good_cells  ASSIGNING FIELD-SYMBOL(<ls_good>).
    ENDLOOP .
  ENDMETHOD.                    "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段


  METHOD handle_data_changed_finished.
    "用途在于修改后的数据联动,
    DATA: ls_et_good_cell  TYPE lvc_s_modi.
      LOOP AT et_good_cells INTO ls_et_good_cell.
        READ TABLE gt_item ASSIGNING FIELD-SYMBOL(<fs_item>) INDEX ls_et_good_cell-row_id.
        IF sy-subrc = '0'.
          IF ls_et_good_cell-fieldname = 'SCRTEXT_L'.
          ENDIF.
        ENDIF.
      ENDLOOP.

      CALL METHOD alv_grid->refresh_table_display
        EXPORTING
          is_stable = stbl.
  ENDMETHOD.


ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION

*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv  .
 " CLEAR: gt_fieldcat,gt_fieldcat1,gt_fieldcat2,gt_fieldcat3,gs_layout,it_toolbar_excluding.
  gs_variant-report = sy-repid.
  gs_variant-handle = '0001'.
******实例化 容器
    CREATE OBJECT gs_parent
      EXPORTING
        container_name = 'ALV'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
    "使用这个控件把名称赋值给CONTAINER_NAME

******将alv植入到容器中
    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = gs_parent.
    PERFORM toolbar_excluding_item     CHANGING it_toolbar_excluding.  "ALV按钮排除
        CALL METHOD alv_grid->set_table_for_first_display
          EXPORTING
            is_layout            = gs_layout
            i_save               = 'A'
            i_default            = 'X'
            is_variant           = gs_variant
            it_toolbar_excluding = it_toolbar_excluding
          CHANGING
            it_outtab            = gt_item
            it_fieldcatalog      = gt_fieldcat.

    CREATE OBJECT event_receiver. "创建事件
    SET HANDLER event_receiver->handle_double_click          FOR alv_grid. "双击事件
*    SET HANDLER event_receiver->handle_onf4                  FOR alv_grid. "F4帮助事件
    SET HANDLER event_receiver->handle_toolbar               FOR alv_grid. "ALV状态栏
    SET HANDLER event_receiver->handle_user_command          FOR alv_grid. "按钮事件
    SET HANDLER event_receiver->handle_data_changed          FOR alv_grid. "修改事件
    SET HANDLER event_receiver->handle_data_changed_finished FOR alv_grid. "数据修改后触发事件


"    gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'REPTEXT'  register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
"    CALL METHOD alv_grid->register_f4_for_fields "注册F4帮助事件
"      EXPORTING
"        it_f4 = gt_t_f4.

    CALL METHOD alv_grid->register_edit_event "注册编辑事件,否则不会触发更新事件
      EXPORTING
        i_event_id = cl_gui_alv_grid=>mc_evt_modified.

    CALL METHOD alv_grid->set_frontend_layout
      EXPORTING
        is_layout = gs_layout.

    CALL METHOD alv_grid->SET_FRONTEND_FIELDCATALOG
      EXPORTING
        IT_FIELDCATALOG = gt_fieldcat.

    CALL METHOD cl_gui_control=>set_focus
      EXPORTING
        control = alv_grid.
    CALL METHOD cl_gui_cfw=>flush.
"  IF  alv_grid IS INITIAL .
"  ELSE.
"    CALL METHOD alv_grid->set_frontend_layout
"      EXPORTING
"        is_layout = gs_layout.
"    CALL METHOD alv_grid->refresh_table_display
"      EXPORTING
"        is_stable = stbl.
"  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_FIELDCAT  text
*----------------------------------------------------------------------*
FORM prepare_field_catalog USING I CHANGING p_gt_fieldcat TYPE lvc_t_fcat.
  DATA ls_fcat TYPE lvc_s_fcat.
  DEFINE set_fcat.
    CLEAR ls_fcat.
    ls_fcat-fieldname = &1.   "字段
    ls_fcat-outputlen = &2.   "列的字符宽度
    ls_fcat-key       = &3.   "主键
    ls_fcat-edit      = &4.   "可编辑
    ls_fcat-ref_table = &5.   "参考表
    ls_fcat-ref_field = &6.   "参考字段
    ls_fcat-icon      = &7.   "以圖標輸出
*    ls_fcat-NO_ZERO   = &8.   "前导0
    ls_fcat-coltext   = &9.   "描述
    ls_fcat-f4availabl = &8.
    APPEND ls_fcat TO p_gt_fieldcat.
  END-OF-DEFINITION.

  CLEAR :p_gt_fieldcat[],ls_fcat .
  CASE I.
    WHEN 0.
      set_fcat 'ZSYSTEM'   ''   ''   ''    'ZTMM200_LOG'    'ZSYSTEM'       ''       ''      '订单发送外围系统'.
      set_fcat 'EKGRP'     ''   ''   ''    'ZTMM200_LOG'    'EKGRP'         ''       ''      '采购组'.
      set_fcat 'VERKF'     ''   ''   ''    'ZTMM200_LOG'    'VERKF'         ''       ''      '卖方业务伙伴订单'.
      set_fcat 'TELF1'     ''   ''   ''    'ZTMM200_LOG'    'TELF1'         ''       ''      '订购用途'.
      set_fcat 'LIFNR'     ''   ''   ''    'ZTMM200_LOG'    'LIFNR'         ''       ''      '供应商或债权人的帐号'.
      set_fcat 'UNSEZ'     ''   ''   ''    'ZTMM200_LOG'    'UNSEZ'         ''       ''      '出货地'.
      set_fcat 'MATNR'     ''   ''   ''    'ZTMM200_LOG'    'MATNR'         ''       ''      '物料编号'.
      set_fcat 'MENGE'     ''   ''   ''    'ZTMM200_LOG'    'MENGE'         ''       ''      '采购订单数量'.
      set_fcat 'ZSTATUS'   ''   ''   ''    'ZTMM200_LOG'    'ZSTATUS'       ''       ''      '采购状态'.
      set_fcat 'WERKS'     ''   ''   ''    'ZTMM200_LOG'    'WERKS'         ''       ''      '工厂'.
      set_fcat 'LGORT'     ''   ''   ''    'ZTMM200_LOG'    'LGORT'         ''       ''      '库存地点'.
      set_fcat 'EEIND'     ''   ''   ''    'ZTMM200_LOG'    'EEIND'         ''       ''      '交货日期'.
      set_fcat 'ZDATE'     ''   ''   ''    'ZTMM200_LOG'    'ZDATE'         ''       ''      '接口传输日期'.
      set_fcat 'ZTIME'     ''   ''   ''    'ZTMM200_LOG'    'ZTIME'         ''       ''      '接口传输时间'.
      set_fcat 'UNAME'     ''   ''   ''    'ZTMM200_LOG'    'UNAME'         ''       ''      '用户名'.
      set_fcat 'EBELN'     ''   ''   ''    'ZTMM200_LOG'    'EBELN'         ''       ''      '采购凭证编号'.
      set_fcat 'EBELP'     ''   ''   ''    'ZTMM200_LOG'    'EBELP'         ''       ''      '采购凭证的项目编号'.
      set_fcat 'TEXT2'     ''   ''   ''    'ZTMM200_LOG'    'TEXT2'         ''       ''      '参考字段'.
      set_fcat 'NAME1'     ''   ''   ''    'ZTMM200_LOG'    'NAME1'         ''       ''      '名称'.
      set_fcat 'MAKTX'     ''   ''   ''    'ZTMM200_LOG'    'MAKTX'         ''       ''      '物料描述'.
      set_fcat 'ZDATE1'    ''   ''   ''    'ZTMM200_LOG'    'ZDATE1'        ''       ''      '重处理日期'.
      set_fcat 'ZTIME1'    ''   ''   ''    'ZTMM200_LOG'    'ZTIME1'        ''       ''      '重处理时间'.
    WHEN 1.
      set_fcat ' XH   '   ''   ''   ''    ''    ''       ''       ''      '序号'.
      set_fcat ' ZRESD'   ''   ''   ''    ''    ''       ''       ''      '责任部门'.
      set_fcat ' SUM  '   ''   ''   ''    ''    ''       ''       ''      '年度累计'.
      set_fcat ' YUE01'   ''   ''   ''    ''    ''       ''       ''      '1月'.
      set_fcat ' YUE02'   ''   ''   ''    ''    ''       ''       ''      '2月'.
      set_fcat ' YUE03'   ''   ''   ''    ''    ''       ''       ''      '3月'.
      set_fcat ' YUE04'   ''   ''   ''    ''    ''       ''       ''      '4月'.
      set_fcat ' YUE05'   ''   ''   ''    ''    ''       ''       ''      '5月'.
      set_fcat ' YUE06'   ''   ''   ''    ''    ''       ''       ''      '6月'.
      set_fcat ' YUE07'   ''   ''   ''    ''    ''       ''       ''      '7月'.
      set_fcat ' YUE08'   ''   ''   ''    ''    ''       ''       ''      '8月'.
      set_fcat ' YUE09'   ''   ''   ''    ''    ''       ''       ''      '9月'.
      set_fcat ' YUE10'   ''   ''   ''    ''    ''       ''       ''      '10月'.
      set_fcat ' YUE11'   ''   ''   ''    ''    ''       ''       ''      '11月'.
      set_fcat ' YUE12'   ''   ''   ''    ''    ''       ''       ''      '12月'.
    WHEN 2.
      set_fcat 'XH   '   ''   ''   ''    ''    ''       ''       ''      '序号'.
      set_fcat 'ZRESD'   ''   ''   ''    ''    ''       ''       ''      '责任部门'.
      set_fcat 'SUM  '   ''   ''   ''    ''    ''       ''       ''      '年度累计'.
      set_fcat 'YC01 '   ''   ''   ''    ''    ''       ''       ''      '1-3天'.
      set_fcat 'YC02 '   ''   ''   ''    ''    ''       ''       ''      '4-7天'.
      set_fcat 'YC03 '   ''   ''   ''    ''    ''       ''       ''      '8-14天'.
      set_fcat 'YC04 '   ''   ''   ''    ''    ''       ''       ''      '15天以上'.
    WHEN 3.
      set_fcat ' XH   '   ''   ''   ''    ''    ''       ''       ''      '序号'.
      set_fcat ' ZRESD'   ''   ''   ''    ''    ''       ''       ''      '责任部门'.
      set_fcat ' ZRESP'   ''   ''   ''    ''    ''       ''       ''      '责任人'.
      set_fcat ' SUM  '   ''   ''   ''    ''    ''       ''       ''      '年度累计'.
      set_fcat ' YUE01'   ''   ''   ''    ''    ''       ''       ''      '1月'.
      set_fcat ' YUE02'   ''   ''   ''    ''    ''       ''       ''      '2月'.
      set_fcat ' YUE03'   ''   ''   ''    ''    ''       ''       ''      '3月'.
      set_fcat ' YUE04'   ''   ''   ''    ''    ''       ''       ''      '4月'.
      set_fcat ' YUE05'   ''   ''   ''    ''    ''       ''       ''      '5月'.
      set_fcat ' YUE06'   ''   ''   ''    ''    ''       ''       ''      '6月'.
      set_fcat ' YUE07'   ''   ''   ''    ''    ''       ''       ''      '7月'.
      set_fcat ' YUE08'   ''   ''   ''    ''    ''       ''       ''      '8月'.
      set_fcat ' YUE09'   ''   ''   ''    ''    ''       ''       ''      '9月'.
      set_fcat ' YUE10'   ''   ''   ''    ''    ''       ''       ''      '10月'.
      set_fcat ' YUE11'   ''   ''   ''    ''    ''       ''       ''      '11月'.
      set_fcat ' YUE12'   ''   ''   ''    ''    ''       ''       ''      '12月'.
    WHEN OTHERS.
  ENDCASE.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  PREPARE_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM prepare_layout CHANGING p_gs_layout TYPE lvc_s_layo.
  p_gs_layout-zebra      = 'X'.      "斑馬紋顯示
  p_gs_layout-sel_mode   = 'A'.      "選擇模式
  p_gs_layout-cwidth_opt = 'X'.      "最佳列寬
ENDFORM.



FORM toolbar_excluding_item CHANGING pt_exclude TYPE ui_functions.
  DATA ls_exclude TYPE ui_func.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut.
  APPEND ls_exclude TO pt_exclude.
  ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo.
  APPEND ls_exclude TO pt_exclude.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
ENDFORM.

FORM frm_display_alv_SPLIT .
  IF g_doc_cont IS INITIAL.
    CREATE OBJECT g_doc_cont
      EXPORTING
        ratio = '95'
        side  = cl_gui_docking_container=>dock_at_left.  " 1

    PERFORM frm_alv_global_splitter_object
              USING g_doc_cont
              CHANGING g_grid_left g_grid_right g_grid2.

  ENDIF.
ENDFORM .

*&---------------------------------------------------------------------*
*&      Form  ALV_GLOBAL_SPLITTER_OBJECT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PA_DCON    text
*      -->PA_TOP     text
*      -->PA_BOTTOM  text
*      -->PV_HEIGHT  text
*----------------------------------------------------------------------*
FORM frm_alv_global_splitter_object USING
                      pv_dcont  TYPE REF TO cl_gui_docking_container
                                    CHANGING
                      cv_grid1   TYPE REF TO cl_gui_alv_grid
                      cv_grid2   TYPE REF TO cl_gui_alv_grid
                      cv_grid3   TYPE REF TO cl_gui_alv_grid.

  DATA: lv_split  TYPE REF TO cl_gui_splitter_container.
  DATA: lv_split2 TYPE REF TO cl_gui_splitter_container.

*-- 分开
  DATA: lv_t1 TYPE i VALUE 1.
  DATA: lv_t2 TYPE i VALUE 2.

  PERFORM frm_split_cont  USING pv_dcont 2 1     CHANGING lv_split.
  PERFORM frm_split_cont2 USING lv_split 1 1 1 2 CHANGING lv_split2.

  PERFORM frm_split_set_grid USING lv_split2 1 1 1 CHANGING cv_grid1.
  PERFORM frm_split_set_grid USING lv_split2 1 2 2 CHANGING cv_grid2.
  PERFORM frm_split_set_grid USING lv_split  2 1 3 CHANGING cv_grid3.

  lv_split->set_row_height( id = 1 height = 50 ).
  lv_split2->set_column_width( id = 1 width = 50 ).

ENDFORM. "alv_splitter_object

*&---------------------------------------------------------------------*
*&      Form  FRM_SPLIT_CONT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_SPLITTER1PA_DCON  text
*      -->P_1      text
*      -->P_2      text
*----------------------------------------------------------------------*
FORM frm_split_cont
        USING    pv_dco_cont TYPE REF TO cl_gui_docking_container
                 pv_c1 pv_c2
        CHANGING pv_splitter TYPE REF TO cl_gui_splitter_container.

  IF pv_dco_cont IS NOT INITIAL.

    CREATE OBJECT pv_splitter
      EXPORTING
        parent  = pv_dco_cont
        rows    = pv_c1
        columns = pv_c2.
  ENDIF.


ENDFORM.                    " FRM_SPLIT_CONT
*&---------------------------------------------------------------------*
*&      Form  frm_split_cont2
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_SPLIT     text
*      -->PV_P1        text
*      -->PV_P2        text
*      -->PV_C1        text
*      -->PV_C2        text
*      <--PV_SPLITTER  text
*----------------------------------------------------------------------*
FORM frm_split_cont2
          USING   pv_split    TYPE REF TO cl_gui_splitter_container
                  pv_p1 pv_p2 pv_c1 pv_c2
         CHANGING pv_splitter TYPE REF TO cl_gui_splitter_container.

  IF pv_split IS NOT INITIAL.
    CREATE OBJECT pv_splitter
      EXPORTING
        parent  = pv_split->get_container( row = pv_p1 column = pv_p2 )
        rows    = pv_c1
        columns = pv_c2.
  ENDIF.


ENDFORM.                    " FRM_SPLIT_CONT
*&---------------------------------------------------------------------*
*&      Form  FRM_SPLIT_CONT_SET
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_G_SPLITTER1  text
*      -->P_1      text
*      -->P_1      text
*      <--P_PA_TOP1  text
*----------------------------------------------------------------------*
FORM frm_split_set_grid
                  USING pv_split TYPE REF TO cl_gui_splitter_container
                                  p_v1
                                  p_v2
                                  I
                         CHANGING cv_grid TYPE REF TO cl_gui_alv_grid.

  DATA: pv_cont TYPE REF TO cl_gui_container.

  CALL METHOD pv_split->get_container
    EXPORTING
      row       = p_v1
      column    = p_v2
    RECEIVING
      container = pv_cont.
  IF sy-subrc = 0.
    CREATE OBJECT cv_grid  "创建第一个ALV,并放在容器中
      EXPORTING
        i_parent = pv_cont.
    CASE I.
      WHEN 1.
        gs_layout-GRID_TITLE = '责任部门与异常零件点数统计' .
        CALL METHOD cv_grid->set_frontend_layout
          EXPORTING
            is_layout = gs_layout.

        CALL METHOD cv_grid->set_table_for_first_display
          EXPORTING
            is_layout       = gs_layout
          CHANGING
            it_outtab       = gt_HB1[]
            it_fieldcatalog = gt_fieldcat1[].
      WHEN 2.
        gs_layout-GRID_TITLE = '责任部门与延迟天数统计' .
        CALL METHOD cv_grid->set_frontend_layout
          EXPORTING
            is_layout = gs_layout.
        CALL METHOD cv_grid->set_table_for_first_display
          EXPORTING
            is_layout       = gs_layout
          CHANGING
            it_outtab       = gt_HB2[]
            it_fieldcatalog = gt_fieldcat2[].
      WHEN 3.
        gs_layout-GRID_TITLE = '责任部门与责任人异常零件点数统计TOP10' .
        CALL METHOD cv_grid->set_frontend_layout
          EXPORTING
            is_layout = gs_layout.
        CALL METHOD cv_grid->set_table_for_first_display
          EXPORTING
            is_layout       = gs_layout
          CHANGING
            it_outtab       = gt_HB3[]
            it_fieldcatalog = gt_fieldcat3[].
      WHEN OTHERS.
    ENDCASE.

  ENDIF.
ENDFORM.                    " FRM_SPLIT_CONT_SET
        " FRM_FORECAST_COLUMN_FORMAT
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_EMAIL
*&---------------------------------------------------------------------*
*       发邮件
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_send_email .
  DATA:ls_solix          TYPE solix,
       lc_xls_type       TYPE so_obj_tp VALUE 'XLS', "文件格式
       lr_sender         TYPE REF TO if_sender_bcs, "发送者对象
       lt_binary_content TYPE solix_tab,
       lv_mailto         TYPE ad_smtpadr,
       lt_binary         TYPE solix_tab,
       lv_sent_to_all    TYPE os_boolean,
       lt_main_text      TYPE bcsy_text,
       lr_send_req       TYPE REF TO cl_bcs,
       lr_document       TYPE REF TO cl_document_bcs,
       lr_recipient      TYPE REF TO if_recipient_bcs,
       lr_bcs_exception  TYPE REF TO cx_bcs.

* - 获取发送的邮箱

  "二进制文件
  LOOP AT gt_xml_table_forecast INTO ls_solix-line.
    APPEND ls_solix TO lt_binary.
    CLEAR ls_solix.
  ENDLOOP.

  TRY .
      "创建发送请求
      lr_send_req = cl_bcs=>create_persistent( ).

      "创建和设置带有附件的文档
      "从带有文本的内部表创建文档对象
      APPEND '邮件正文!' TO lt_main_text.
      lr_document = cl_document_bcs=>create_document(
      i_type = 'HTM'
      i_text = lt_main_text
      i_subject = '邮件标题' ).

      "将电子表格作为附件添加到文档对象
      lr_document->add_attachment(
      i_attachment_type = lc_xls_type
      i_attachment_subject = '邮件附件名称'
      i_att_content_hex = lt_binary ).

      "添加文档对象以发送请求
      lr_send_req->set_document( lr_document ).

      "取得发送者
      lr_sender = cl_sapuser_bcs=>create( 'BASIS').
      lr_send_req->set_sender( lr_sender ).

      "添加收件人(电子邮件地址)
      lv_mailto = '979621537@qq.com'. ""测试邮箱,需要修改为自己的邮箱,不要给博客作者发邮件
      "创建接收对象
      lr_recipient = cl_cam_address_bcs=>create_internet_address( lv_mailto ).

      "添加接收对象以发送请求
      lr_send_req->add_recipient( lr_recipient ).


      "立即发送
      CALL METHOD lr_send_req->set_send_immediately( 'X' ).
      lr_send_req->set_status_attributes( i_requested_status = 'E' i_status_mail = 'R' ).
      lv_sent_to_all = lr_send_req->send( i_with_error_screen = 'X' ).

      COMMIT WORK.

      IF lv_sent_to_all IS INITIAL.
        MESSAGE i500(sbcoms) WITH lv_mailto.
      ELSE.
        MESSAGE s022(so).
      ENDIF.

      "异常处理
    CATCH cx_bcs INTO lr_bcs_exception.
      MESSAGE i865(so) WITH lr_bcs_exception->error_type.
  ENDTRY.
ENDFORM.                    " FRM_SEND_EMAIL

*&---------------------------------------------------------------------*
*&      Form  FRM_PROCESS_XML_DATA
*&---------------------------------------------------------------------*
*       附件xml
*----------------------------------------------------------------------*
*      -->P_1      text
*----------------------------------------------------------------------*
FORM frm_process_xml_data.
  DATA: l_ixml          TYPE REF TO if_ixml,
        l_streamfactory TYPE REF TO if_ixml_stream_factory,
        l_ostream       TYPE REF TO if_ixml_ostream,
        l_renderer      TYPE REF TO if_ixml_renderer,
        l_document      TYPE REF TO if_ixml_document.

  DATA: l_element_root TYPE REF TO if_ixml_element,
        r_element      TYPE REF TO if_ixml_element,
        r_worksheet    TYPE REF TO if_ixml_element,
        r_table        TYPE REF TO if_ixml_element,
        r_column       TYPE REF TO if_ixml_element,
        r_row          TYPE REF TO if_ixml_element,
        r_cell         TYPE REF TO if_ixml_element,
        r_data         TYPE REF TO if_ixml_element,
        l_xml_size     TYPE i,
        lv_rc          TYPE i,
        l_value        TYPE string.

*  create a ixml factory
  l_ixml = cl_ixml=>create( ).

*  create the DOM object model
  l_document = l_ixml->create_document( ).

*  create workbook
  PERFORM create_workbook USING l_document r_worksheet r_table.

*  column formatting
  PERFORM frm_forecast_column_format USING l_document r_table.


* XML作为二进制数据流保存到内表
*   creating a stream factory
  l_streamfactory = l_ixml->create_stream_factory( ).

*   connect internal xml table to stream factory
  l_ostream = l_streamfactory->create_ostream_itable( table = gt_xml_table_forecast ).

*   rendering the document
  l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ).
  lv_rc = l_renderer->render( ).

* saving the xml document
  l_xml_size = l_ostream->get_num_written_raw( ).
ENDFORM.             " FRM_PROCESS_XML_DATA
             " FRM_PROCESS_XML_DATA
*&---------------------------------------------------------------------*
*&      Form  CREATE_WORKBOOK
*&---------------------------------------------------------------------*
*       新建工作区
*----------------------------------------------------------------------*
*      -->P_L_DOCUMENT  text
*      -->P_R_WORKSHEET  text
*      -->P_R_TABLE  text
*----------------------------------------------------------------------*
FORM create_workbook USING l_document  TYPE REF TO if_ixml_document
      r_worksheet TYPE REF TO if_ixml_element
      r_table     TYPE REF TO if_ixml_element.

  DATA: l_element_root       TYPE REF TO if_ixml_element,
        lr_ns_attribute         TYPE REF TO if_ixml_attribute,
        lr_element_properties TYPE REF TO if_ixml_element,
        lr_styles             TYPE REF TO if_ixml_element,
        lr_style              TYPE REF TO if_ixml_element,
        lr_border             TYPE REF TO if_ixml_element,
        lr_format             TYPE REF TO if_ixml_element,
        l_value              TYPE string.

*  create root node 'workbook'
  l_element_root = l_document->create_simple_element( name = 'Workbook' parent = l_document ).
  l_element_root->set_attribute( name = 'xmlns' value = 'urn:schemas-microsoft-com:office:spreadsheet' ).

  lr_ns_attribute = l_document->create_namespace_decl( name = 'ss' prefix = 'xmlns'  uri = 'urn:schemas-microsoft-com:office:spreadsheet' ).
  l_element_root->set_attribute_node( lr_ns_attribute ).

  lr_ns_attribute = l_document->create_namespace_decl( name = 'x'  prefix = 'xmlns'  uri = 'urn:schemas-microsoft-com:office:excel' ).
  l_element_root->set_attribute_node( lr_ns_attribute ).

*  create node for document properties
  lr_element_properties = l_document->create_simple_element( name = 'TEST_REPORT' parent = l_element_root ).
  l_value = sy-uname.
  l_document->create_simple_element( name = 'Author' value = l_value parent = lr_element_properties ).

* Styles(类似css,可以被cell使用)
  lr_styles = l_document->create_simple_element( name = 'Styles' parent = l_element_root ).
* 预定义明细格式格式:Detail
  lr_style = l_document->create_simple_element( name = 'Style' parent = lr_styles ).
  lr_style->set_attribute_ns( name = 'ID'  prefix = 'ss' value = 'Detail' ).
"格式居中
  Lr_format = l_document->create_simple_element( name = 'Alignment' parent = lr_style ).
  Lr_format->set_attribute_ns( name = 'Horizontal' prefix = 'ss' value = 'Center' ).
  Lr_format->set_attribute_ns( name = 'Vertical' prefix = 'ss' value = 'Center' ).
  Lr_format->set_attribute_ns( name = 'WrapText'  prefix = 'ss'  value = '1' ).
  "边框
  lr_border = l_document->create_simple_element( name = 'Borders' parent = lr_style ).

  lr_format = l_document->create_simple_element( name = 'Border' parent = lr_border ).
  lr_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Bottom' ).
  lr_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  lr_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '2' ).

  lr_format = l_document->create_simple_element( name = 'Border' parent = lr_border ).
  lr_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Left' ).
  lr_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  lr_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '2' ).

  lr_format = l_document->create_simple_element( name = 'Border' parent = lr_border ).
  lr_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Top' ).
  lr_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  lr_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '2' ).

  lr_format = l_document->create_simple_element( name = 'Border' parent = lr_border ).
  lr_format->set_attribute_ns( name = 'Position'  prefix = 'ss'  value = 'Right' ).
  lr_format->set_attribute_ns( name = 'LineStyle'  prefix = 'ss'  value = 'Continuous' ).
  lr_format->set_attribute_ns( name = 'Weight'  prefix = 'ss'  value = '2' ).
*  worksheet
  r_worksheet = l_document->create_simple_element( name = 'Worksheet' parent = l_element_root ).
  r_worksheet->set_attribute_ns( name = 'Name' prefix = 'ss' value = 'Sheet1' ).

*  table
  r_table = l_document->create_simple_element( name = 'Table' parent = r_worksheet ).
  r_table->set_attribute_ns( name = 'FullColumns' prefix = 'x' value = '1' ).
  r_table->set_attribute_ns( name = 'FullRows'    prefix = 'x' value = '1' ).
ENDFORM.                    " CREATE_WORKBOOK

*&---------------------------------------------------------------------*
*&      Form  FRM_FORECAST_COLUMN_FORMAT
*&---------------------------------------------------------------------*
*       表头与格式设置
*----------------------------------------------------------------------*
*      -->P_L_DOCUMENT  text
*      -->P_R_TABLE  text
*----------------------------------------------------------------------*
FORM frm_forecast_column_format  USING    l_document TYPE REF TO if_ixml_document
      r_table TYPE REF TO if_ixml_element.

  DATA: l_element_root TYPE REF TO if_ixml_element,
        lr_column       TYPE REF TO if_ixml_element,
        lr_row          TYPE REF TO if_ixml_element,
        lr_cell         TYPE REF TO if_ixml_element,
        r_format        TYPE REF TO if_ixml_element,
        lr_data         TYPE REF TO if_ixml_element,
        l_value        TYPE string.
*  设定列宽
    lr_column = l_document->create_simple_element( name = 'Column' parent = r_table ).
    lr_column->set_attribute_ns( name = 'Width' prefix = 'ss' value = '30' ).

  DO 15 TIMES.
    lr_column = l_document->create_simple_element( name = 'Column' parent = r_table ).
    lr_column->set_attribute_ns( name = 'Width' prefix = 'ss' value = '66' ).
  ENDDO.


*  设定列名
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table  ).
  lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
  lr_cell->set_attribute_ns(  name = 'MergeAcross' prefix = 'ss' value = '14').
  lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
  lr_data = l_document->create_simple_element( name = 'Data' value = '责任部门与异常零件点数统计'  parent = lr_cell ).
  lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).

  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' ).
  DATA lv_value TYPE string.
*  data table1
  LOOP AT gt_fieldcat1 INTO DATA(ls_fieldcat).
    lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
    lv_value =  ls_fieldcat-coltext.
    lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
    lr_data = l_document->create_simple_element( name = 'Data' value = lv_value  parent = lr_cell ).
    lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
  ENDLOOP.

  LOOP AT gt_HB1 ASSIGNING FIELD-SYMBOL(<lfs_alv>).
    lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
    LOOP AT gt_fieldcat1 INTO ls_fieldcat.
      ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE <lfs_alv> TO FIELD-SYMBOL(<lfs_value>).
      lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
      lv_value = <lfs_value>.
      lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
      lr_data = l_document->create_simple_element( name = 'Data' value = lv_value parent = lr_cell ).
      lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
    ENDLOOP.
  ENDLOOP.


  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table  ).
  lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
  lr_cell->set_attribute_ns(  name = 'MergeAcross' prefix = 'ss' value = '6').
  lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
  lr_data = l_document->create_simple_element( name = 'Data' value = '责任部门与延迟天数统计'  parent = lr_cell ).
  lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).

  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' ).
*  data table1
  LOOP AT gt_fieldcat2 INTO ls_fieldcat.
    lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
    lv_value =  ls_fieldcat-coltext.
    lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
    lr_data = l_document->create_simple_element( name = 'Data' value = lv_value  parent = lr_cell ).
    lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
  ENDLOOP.

  LOOP AT gt_HB2 ASSIGNING FIELD-SYMBOL(<lfs_alv2>) .
    lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
    LOOP AT gt_fieldcat2 INTO ls_fieldcat.
      ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE <lfs_alv2> TO <lfs_value>.
      lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
      lv_value = <lfs_value>.
      lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
      lr_data = l_document->create_simple_element( name = 'Data' value = lv_value parent = lr_cell ).
      lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
    ENDLOOP.
  ENDLOOP.


  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' ).
  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table  ).
  lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
  lr_cell->set_attribute_ns(  name = 'MergeAcross' prefix = 'ss' value = '15').
  lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
  lr_data = l_document->create_simple_element( name = 'Data' value = '责任部门与责任人异常零件点数统计TOP10'  parent = lr_cell ).
  lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).

  lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
  lr_row->set_attribute_ns( name = 'AutoFitHeight' prefix = 'ss' value = '1' ).
*  data table1
  LOOP AT gt_fieldcat3 INTO ls_fieldcat.
    lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
    lv_value =  ls_fieldcat-coltext.
    lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
    lr_data = l_document->create_simple_element( name = 'Data' value = lv_value  parent = lr_cell ).
    lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
  ENDLOOP.

  LOOP AT gt_HB3 ASSIGNING FIELD-SYMBOL(<lfs_alv3>) .
    lr_row = l_document->create_simple_element( name = 'Row' parent = r_table ).
    LOOP AT gt_fieldcat3 INTO ls_fieldcat.
      ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE <lfs_alv3> TO <lfs_value>.
      lr_cell = l_document->create_simple_element( name = 'Cell' parent = lr_row ).
      lv_value = <lfs_value>.
      lr_cell->set_attribute_ns(  name = 'StyleID' prefix = 'ss' value = 'Detail').
      lr_data = l_document->create_simple_element( name = 'Data' value = lv_value parent = lr_cell ).
      lr_data->set_attribute_ns( name = 'Type' prefix = 'ss' value = 'String' ).
    ENDLOOP.
  ENDLOOP.

ENDFORM.                    " FRM_FORECAST_COLUMN_FORMAT

分别双击红框中的代码创建屏幕,按钮,标题

双击 CALL SCREEN 9000.中的9000创建9000屏幕,

 屏幕画出表控件,命名为ALV,勾选垂直和水平,然后激活

 元素清单给OK_CODE

双击 CALL SCREEN 8000.中的8000创建8000屏幕,分屏展示的alv不用画屏幕

 双击 SET PF-STATUS '9000'.中的9000 创建按钮

 双击SET TITLEBAR '9000'.中的9000创建标题

 常驻CSDN有什么问题欢迎留言

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SAP-ABAP-普通OOALV,OOALV分屏展示,发送邮件excel附件合并单元格,附件带框线,附件居中。 的相关文章

  • 何恺明组《Designing Network Design Spaces》的整体解读(一篇更比六篇强)

    本文原载自知乎 已获原作者授权转载 请勿二次转载 https zhuanlan zhihu com p 122557226 statistics 大法好 DL不是statistics 因为DL不如statistics 基本全文从统计学的角度
  • 编程猫python讲师面试_【编程猫教师面试】笔试:试题+打字测速-看准网

    985师范本加硕 想要从事k12教育 坚挺到最后一轮但是未通过的小姐姐掩面飘过 来谈谈我的面试感受吧 个人觉得猫厂管培生的面试整体流程安排挺合理的 有感觉确实是在用心的挑选人才 然后所有的面试官都很nice 我是直接在boss直聘上投的简历
  • ffmpeg最简单的解码保存YUV数据

    文章转载自 http blog chinaunix net xmlrpc php r blog article id 4584541 uid 24922718 video的raw data一般都是YUV420p的格式 简单的记录下这个格式的
  • 技术英雄会【新闻】CSDN最有价值博客TOP10颁奖【图】【我在左边数第四个】

    2007年04月06日 10 04 新浪科技夹带些私货 呵呵 社区英雄会 一 问周鸿祎一个问题 社区英雄会 二 问CSDN一个信息过滤器的问题 技术英雄会 三 社区英雄们的与会感言大赏 技术英雄会 四 也谈如何发掘到需要的内容和英雄 图为
  • linux_compress

    tar 解包 tar xvf FileName tar 打包 tar cvf FileName tar DirName 注 tar是打包 不是压缩 gz 解压1 gunzip FileName gz 解压2 gzip d FileName
  • 调试器GDB的基本使用方式(一)

    GDB的功能及其丰富 我们按照调试的流程进行说明 基本用法很简单 流程如下所示 带着调试选项编译 构建调试对象 启动调试器 GDB 设置断点 显示栈帧 显示值 继续执行 一 准备 通过 gcc 的 g 选项生成调试信息 gcc Wall O
  • Qt bool转QString再转回bool方法

    可能在传递参数的过程中 传的一是个bool值 而后面 在参数的转换传递过程中 只能传一个QString 最后又需要得到一个bool值 这时就可以使用这种方法 bool testParam QString tempParam QString
  • matlab傅里叶变换漫谈

    Introduction 由于research需要 不得已开始回顾关于高数的基本知识 写在这里方便记录 这个故事告诉我们 What goes around comes around meaning that life has a funny
  • java二维数组随机赋值_java 二维数组随机赋值

    java 二维数组随机赋值 2021 01 31 00 08 55 简介 目的 使用二维数组打印一个 10 行杨辉三角 视频教程推荐 java课程 思路 1 第一行有 1 个元素 第 n 行有 n 个元素 2 每一行的第一个元素和最后一个元
  • HTML头部

    目录 实例 HTML 元素 HTML
  • Linux命令·rm

    linux中删除文件和目录的命令 rm命令 rm是常用的命令 该命令的功能为删除一个目录中的一个或多个文件或目录 它也可以将某个目录及其下的所有文件及子目录均删除 对于链接文件 只是删除了链接 原有文件均保持不变 rm是一个危险的命令 使用
  • angular2 Http请求

    提供HTTP服务 HttpModule并不是Angular的核心模块 它是Angular用来进行Web访问的一种可选方式 并位于一个名叫 angular http的独立附属模块中 编辑app module ts import HttpMod
  • Fortran基础1——声明及数据类型

    声明及数据类型 一 声明的意义 告诉编译器要预留一些存放数据的内存空间 二 基本数据类型 数据类型 描述 整数 integer a 浮点数 real a 字符 character a 逻辑变量 logical a 复数 complex a
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • httpclient 聚合

    文章目录 依赖 DefaultHttpClient 废弃 设置代理 传文件 HttpClientUtil version 4 3 6 依赖
  • html+js实现输入用户名和密码点击登录跳转页面

    html js实现 输入用户名和密码点击登录跳转其他页面 这里主页是index html 跳转的页面名字是随机点名 html 1 index html 用户名
  • OpenCV-Python调整图像对比度和带文字白纸照片背景漂白方法

    一 引言 在前面我们介绍了直方图均衡可以调整图像的对比度 那么还有没有其他方式调整对比度呢 答案是肯定的 今天就来招硬核的 二 对比度调整的硬核方法 这招硬核方法就是参考灰度图像的阈值处理 我们知道灰度图像的阈值处理的基本思想是 将图像中灰
  • SVN使用手册【简洁明了】

    这里写自定义目录标题 欢迎观看我的文档 废话不多说直接上方法 适合新手小白 SVN的工作原理 SVN的主要操作 1 SVN检出 SVN Checkout 2 SVN提交 上传SVN Commit SVN更新 下载 SVN Update 4
  • Kafka性能保证和延时队列实现原理

    数据不丢不漏 不重不错 一 不丢 生产写入消息不丢失 数据组织形式 首先 从数据组织形式来说 kafka有三层形式 kafka有多个主题 topic 每个主题有多个分区 分区分为主分区和副本分区 每个分区又有多条消息 而每个分区可以分布到不

随机推荐

  • epoll文件服务器,基于epoll实现的一个简单的web服务器

    详解1 EPOLLIN 文件描述符可以读 EPOLLOUT 文件描述符可以写 EPOLLPRI 文件描述符有紧急的数据可写 EPOLLERR 文件描述符发生错误 EPOLLHUP 文件描述符被挂起 EPOLLET 文件描述符有事件发生 所用
  • 服务器2012怎么安装无线网卡驱动,如何安装usb无线网卡驱动,教您如何安装电脑usb驱动...

    现在很多人都喜欢用无线上网 其原因就是摆脱了有限的束缚 使得电脑可以随时随地的上网 如果想要使用无线网卡的话 首先需要安装无线网卡驱动 那么无线网卡驱动怎么安装 这里 小编就来给大家分享无线网卡驱动安装的图文教程 对于没有内置无线网卡的台式
  • MacOS全套详细介绍如何下载Nginx

    前言 最近心血来潮试着用Mac下载Nginx 下载过程中也出现了一些下载问题 为了方便诸位更加舒心使用Nginx 避免走一些弯路和阅读大量文档 减少大量不必要的时间 这里就集中从0 1做个详细介绍 1 查看是否有HomeBrew Homeb
  • 理解 Linux 配置文件 [转载]

    理解 Linux 配置文件 转载 http www 900 ibm com developerWorks cn linux management configuration index shtml 分类和使用 Subodh Soni sub
  • echarts坐标轴

    坐标轴 直角坐标系中的 x y 轴 x 轴 y 轴 x 轴和 y 轴都由轴线 刻度 刻度标签 轴标题四个部分组成 部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有 x 轴和 y 轴 通常情况下 x 轴显示在图表的底部 y
  • 服务器处理数据和信息吗,1.1 NG搭建服务器 与 动态数据处理介绍

    fastCGI 动态请求数据处理 1 fastcgi安装步骤 1 configure 生成makefile 2 在 make运行makefile sudo make instll 安装即可 出现错误如下 image png 解决方案如下 找
  • 微服务配置中心springcloud从nacos动态获取最新配置信息

    1 添加nacos配置中心依赖
  • springBoot+MongoTemplate,往多个数据库中插入数据

    一 准备 1 建立一个springBoot的maven项目 使用spring initailizr 或者建立一个maven后自己添加相关springBoot配置
  • 使用Pritunl OpenVPN远程连接:实现安全高效的远程访问

    文章目录 前言 1 环境安装 2 开始安装 3 访问测试 4 创建连接 5 局域网测试连接 6 安装cpolar 7 配置固定公网访问地址 8 远程连接测试 前言 Pritunl是一款免费开源的 VPN 平台软件 但使用的不是标准的开源许可
  • 使用PyCharm Professional Edition开发Flask Web程序

    PyCharm官方页面 https www jetbrains com pycharm 注意 只有专业版支持以下全部操作 社区版和教育版均不支持 一 使用PyCharm创建VirtualEnv File Default Settings D
  • 组合测试方法PK正交分析方法

    测试过程中 我们经常遇到需要覆盖多个变化参数的测试场景 如我们测试BS配置控制客户端组织资源远程配置一个设备时 进行一个设备通道视频参数设置的各种组合测试 如下图 多数情况下 类似于这种多组合测试时 老员工则是依靠经验去进行有针对性的测试
  • C++ 实现获取系统名称

    项目中需要用到操作系统名及版本信息 下面是用两种方法实现的 一种是通过查询注册表 include stdafx h include
  • Qt QGraphicsItem及派生类设置是否可选中,是否可移动

    设置可选中 可移动 setFlags ItemIsSelectable ItemIsMovable 设置不可选中 setFlags flags ItemIsSelectable
  • 在计算机上搭建云服务

    首先是安装VirtualBox虚拟机 这里由于之前已经安装完成 所以不再一一演示 对于虚拟机储存位置的设置 VirtualBox菜单 管理 gt 全局设定 常规页面 选择 默认虚拟电脑位置 即可 创建虚拟机内部虚拟网络 VirtualBox
  • 堆栈01--用两个栈实现队列

    堆栈01 用两个栈实现队列 jz05 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 测试用例 队列先进先出 输入 1 2 输出 1 2 解析
  • U盘装系统教程,一键安装和U盘安装的区别

    装系统教程U盘安装篇 一键安装和U盘安装的区别 一键重装系统工具 优点 1 集成线上重装和本地备份还原功能 让用户多重选择 2 无人值守 无需电脑知识的小白用户也可以使用 3 用户可选择工具自带系统镜像安装 不需要单独下载 缺点 1 线上重
  • Elo评分算法原理与实现

    社交网络 里的Mark Zackburg被女朋友甩后 在舍友的启发下 充分发挥了技术宅男自娱自乐的恶搞天分 做出了Facemash网站 对学校女生的相貌进行排名打分 结果网站访问流量过大 直接把学校网络搞瘫痪了 Facemask大受欢迎的关
  • 创建vue项目,完整步骤

    1 安装nodejs node官网 https nodejs org en 检测是否安装成功 node v npm v 电脑上有多版本node时 需要用 nvm 管理工具 2 全局安装脚手架 vue cli npm install vue
  • Qt的信号和槽机制

    在C 中 对象与对象之间通信 要通过调用成员函数的方式来完成 而在Qt中提供了一种对象间的通信方式 信号与槽的机制 Qt通过QObject来提供这个通信机制 它的工作方式也很简单 通过QObject对象提供的connect连接函数将信号与处
  • SAP-ABAP-普通OOALV,OOALV分屏展示,发送邮件excel附件合并单元格,附件带框线,附件居中。

    功能展示 1 三个可拖动变换大小的屏幕 2 普通OOALV 3 带格式的邮件附件 三个表格 合并居中 单元格带框线 指定列宽 代码如下 复制可直接激活 没有include 创建程序后还有一些其他步骤 详情见后文 Report ZLQT OO