ABAP——SUBMIT调用COOIS组件报表获取运行结果后发送ZIP压缩文件

运行效果:

代码:

************************************************************************
* Program Name      :
* Descriptions      :
* T-Code            :
* Updates Tables    :
* Input  Parameters :
* Output Parameters :
* Return Codes      :
* Special Logic     :
* Includes          :
************************************************************************
* Modification Log
************************************************************************
*   Date   Ver. Programmer   Descriptions
* -------- ---- ------------ -------------------------------------------
* 2020 9.9   xxx Create
*
************************************************************************
REPORT ZPPRTEST.

***********************************************************************
* Tables Definitions
************************************************************************
TABLES: aufk,marc.
************************************************************************

* Data Definitions
************************************************************************
DATA: gt_ioopcomp    TYPE TABLE OF ioopcomp,
      g_mail_address TYPE ad_smtpadr.

TYPE-POOLS: slis.
DATA: gs_layout   TYPE slis_layout_alv,
      gs_variant  TYPE disvariant,
      gt_fieldcat TYPE slis_t_fieldcat_alv,
      wa_fieldcat TYPE slis_fieldcat_alv.

************************************************************************
* Includes Module
************************************************************************

************************************************************************
* Selection Screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.
SELECT-OPTIONS: s_aufnr FOR aufk-aufnr,
                         s_matnr FOR marc-matnr,
                         s_auart FOR aufk-auart,
                         s_werks FOR marc-werks,
                         s_dispo FOR marc-dispo.
PARAMETERS: p_selid LIKE tj48t-selid DEFAULT 'ZPP0005'.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-b02.
PARAMETERS: p_vari TYPE disvariant-variant.
SELECTION-SCREEN END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-b03.
PARAMETERS: p_mail  AS CHECKBOX,
            p_title TYPE so_obj_des.
SELECT-OPTIONS: s_ads FOR g_mail_address NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b3.

************************************************************************
* Initialization
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
  PERFORM frm_alv_variant_f4.

************************************************************************
* At Selection Screen Output
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.
************************************************************************
* Main Process
************************************************************************
START-OF-SELECTION.
  PERFORM get_data.
  IF p_mail = 'X'.
    PERFORM send_mail TABLES s_ads USING p_title.
  ENDIF.
  PERFORM display_data.

END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_VARIANT_F4
*&---------------------------------------------------------------------*
FORM frm_alv_variant_f4.

  DATA: ls_variant TYPE disvariant,
        l_exit     TYPE c.

  ls_variant-report = sy-repid.
  ls_variant-username = sy-uname.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant    = ls_variant
      i_save        = 'A'
    IMPORTING
      e_exit        = l_exit
      es_variant    = ls_variant
    EXCEPTIONS
      not_found     = 1
      program_error = 2
      OTHERS        = 3.

  IF sy-subrc <> 0 OR l_exit = 'X'.
    EXIT.
  ENDIF.

  p_vari = ls_variant-variant.

ENDFORM.                "FRM_ALV_VARIANT_F4

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
FORM get_data.
  FIELD-SYMBOLS:<fs_table> TYPE ANY TABLE,
                <fs_any>   TYPE any.
  DATA:lr_data TYPE REF TO data.

  cl_salv_bs_runtime_info=>clear_all( ).
  cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false
      metadata = abap_false
      data   = abap_true ).

  SUBMIT ppio_entry  "COOIS工单资讯系统
      "VIA SELECTION-SCREEN      "停留在选择界面
      USING SELECTION-SET 'IT_USE' "COOIS保存的变式
      WITH s_aufnr IN s_aufnr "工单
      WITH s_matnr IN s_matnr "物料
      WITH s_werks IN s_werks "工厂
      WITH s_auart IN s_auart "工单类型
      WITH s_dispo IN s_dispo "MRP控制员
      WITH p_selid = p_selid "状态选择设定档案
      AND RETURN. "返回当前程序

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data = lr_data ).
      ASSIGN lr_data->* TO <fs_table>.
      IF sy-subrc = 0.
        gt_ioopcomp = <fs_table>.
      ENDIF.
    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE 'Unable to retrieve data! Please try other conditions.'
      TYPE 'E'.
  ENDTRY.

  cl_salv_bs_runtime_info=>clear_all( ).

ENDFORM.                "GET_DATA

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
FORM send_mail TABLES lt_mail_addr STRUCTURE s_ads
                         USING in_subject.

  DATA send_request TYPE REF TO cl_bcs.
  DATA document TYPE REF TO cl_document_bcs.
  DATA recipient TYPE REF TO if_recipient_bcs.
  DATA bcs_exception TYPE REF TO cx_bcs.

  DATA main_text TYPE bcsy_text.
  DATA binary_content TYPE solix_tab.
  DATA size TYPE so_obj_len.
  DATA sent_to_all TYPE os_boolean.
  DATA l_filename TYPE sood-objdes.

  TYPES: BEGIN OF bin_file,
           name TYPE string,
           size TYPE i,
           data TYPE solix_tab,
         END OF bin_file.

  DATA: ls_bindata TYPE bin_file,
        lt_bindata TYPE TABLE OF bin_file,
        l_xstring  TYPE xstring,
        l_zip      TYPE REF TO cl_abap_zip,
        l_zipname  TYPE string,
        l_zip_xstr TYPE xstring,
        lt_content TYPE solix_tab,
        l_obj_len  TYPE so_obj_len.

  DATA:l_txt   TYPE string,
       l_line  TYPE string,
       ls_data TYPE ioopcomp.

* change type
  DATA: l_bdmng(17)  TYPE c,
        l_enmng(17)  TYPE c,
        l_dvmeng(17) TYPE c,
        l_bdter(10)  TYPE c.

  CONSTANTS:
    gc_tab  TYPE c VALUE cl_bcs_convert=>gc_tab,
    gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf.

  "标题
  CONCATENATE '工单'
                         '需求日期'
                         '元件'
                         '元件说明'
                         '承约量'
                         '需求数量'
                         '领料数量'
                         '虚拟件'
                         '已删除'
                         INTO l_txt SEPARATED BY gc_tab.
  "断行
  CONCATENATE l_txt l_line gc_crlf INTO l_txt.

  LOOP AT gt_ioopcomp INTO ls_data.

    CLEAR: l_dvmeng,l_bdmng,l_enmng,l_bdter.

    "转换
    WRITE: ls_data-dvmeng TO l_dvmeng,
      ls_data-bdmng TO l_bdmng,
      ls_data-enmng TO l_enmng.

    CONCATENATE ls_data-bdter+0(4) '/' ls_data-bdter+4(2)
                 '/' ls_data-bdter+6(2) INTO l_bdter.

    "内容
    CONCATENATE ls_data-aufnr
                           l_bdter
                           ls_data-matnr
                           ls_data-matxt
                           l_dvmeng
                           l_bdmng
                           l_enmng
                           ls_data-dumps
                           ls_data-xloek
                           INTO l_line SEPARATED BY gc_tab.
    "断行
    CONCATENATE l_txt l_line gc_crlf INTO l_txt.

  ENDLOOP.

  CONCATENATE in_subject '_' sy-datum INTO l_filename.

* --------------------------------------------------------------
* convert the text string into UTF-16LE binary data including
* byte-order-mark. Mircosoft Excel prefers these settings
* all this is done by new class cl_bcs_convert (see note 1151257)

  TRY.
      cl_bcs_convert=>string_to_solix(
        EXPORTING
          iv_string   = l_txt
          iv_codepage = '4103'  "suitable for MS Excel, leave empty
          iv_add_bom  = 'X'     "for other doc types
        IMPORTING
          et_solix  = binary_content
          ev_size   = size ).
    CATCH cx_bcs.
      MESSAGE e445(so).
  ENDTRY.

* string转xstring start
  ls_bindata-data = binary_content.
  ls_bindata-size = size.
  APPEND ls_bindata TO lt_bindata.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = ls_bindata-size
    IMPORTING
      buffer       = l_xstring
    TABLES
      binary_tab   = ls_bindata-data.
* string转xstring end

  TRY.

*     -------- create persistent send request ------------------------
      send_request = cl_bcs=>create_persistent( ).

*     -------- create and set document with attachment ---------------
*     create document object from internal table with text
*     append 'Hello world!' to main_text.                  "#EC NOTEXT

*     邮件内容
      APPEND 'Dear Mr and Miss:' TO main_text.
      APPEND '' TO main_text.
      APPEND'     Please check attachment in time!' TO main_text.
      APPEND '' TO main_text.
      APPEND '     This Email is sent by SAP, Do not Return the Email.' TO main_text.
      APPEND '' TO main_text.
      APPEND '     If you have any problem, please contact with IT user.' TO main_text.
      APPEND '' TO main_text.
      APPEND 'Thanks.' TO main_text.

      document = cl_document_bcs=>create_document(
        i_type    = 'RAW'
        i_text    = main_text
        i_subject = in_subject ).

*     压缩zip start
      CREATE OBJECT l_zip.

      "CONCATENATE in_subject '_' sy-datum '.xls' INTO l_zipname.

      CONCATENATE 'COOIS_Component_' sy-datum '.xls' INTO l_zipname.

      CALL METHOD l_zip->add
        EXPORTING
          name    = l_zipname
          content = l_xstring.

      CALL METHOD l_zip->save
        RECEIVING
          zip = l_zip_xstr.

      CALL METHOD cl_bcs_convert=>xstring_to_solix
        EXPORTING
          iv_xstring = l_zip_xstr
        RECEIVING
          et_solix   = lt_content.

      l_obj_len = XSTRLEN( l_zip_xstr ).

      CALL METHOD document->add_attachment
        EXPORTING
          i_attachment_size    = l_obj_len
          i_attachment_type    = 'ZIP'
          i_attachment_subject = in_subject
          i_att_content_hex    = lt_content.

*     压缩zip end

*     add the spread sheet as attachment to document object

*      document->add_attachment(
*        i_attachment_type    = 'xls'
*        i_attachment_subject = l_filename
*        i_attachment_size    = size
*        i_att_content_hex    = binary_content ).

*     add document object to send request
      send_request->set_document( document ).

*     --------- add recipient (e-mail address) -----------------------
      LOOP AT lt_mail_addr.
*     create recipient object
        recipient =
        cl_cam_address_bcs=>create_internet_address( lt_mail_addr-low ).
*     add recipient object to send request
        send_request->add_recipient( recipient ).
      ENDLOOP.

*     ---------- send document ---------------------------------------
      sent_to_all = send_request->send( i_with_error_screen = 'X' ).

      COMMIT WORK.

      IF sent_to_all IS INITIAL.
        MESSAGE i500(sbcoms).
      ELSE.
        MESSAGE s022(so).
      ENDIF.

*   ------------ exception handling ----------------------------------
*   replace this rudimentary exception handling with your own one !!!
    CATCH cx_bcs INTO bcs_exception.
      MESSAGE i865(so) WITH bcs_exception->error_type.
  ENDTRY.
ENDFORM.                    "SEND_MAIL

*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
FORM display_data.
  DATA: l_repid    TYPE sy-repid,
        l_inclname TYPE trdir-name,
        l_index    LIKE sy-tabix.

  CLEAR: gt_fieldcat[],wa_fieldcat.

  l_repid = l_inclname = sy-cprog.

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

  "ALV布局
  gs_variant-variant = p_vari.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = l_repid
      i_structure_name       = 'IOOPCOMP'
      i_inclname             = l_inclname
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      is_layout          = gs_layout
      is_variant         = gs_variant
      it_fieldcat        = gt_fieldcat[]
      i_save             = 'A'
    TABLES
      t_outtab           = gt_ioopcomp
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.                    "DISPLAY_DATA

原文地址:https://www.cnblogs.com/StephenAmell/p/13664770.html