zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    powershell 模拟IE行为
    php获取post中的json数据
    转:实例学习PHP程序对用户身份认证实现两种方法
    PHP中间件ICE
    常用的PHP数据库操作方法(MYSQL版)
    PHP 读取网页文件
    解决当distinct和join同时存在distinct失效问题
    web test LoadRunner web_reg_find / jianchadian / flag / placeflag
    my ReadHealth / drink / body cancer
    my ReadFood_Nanking Delicious / food / delicious
  • 原文地址:https://www.cnblogs.com/StephenAmell/p/13664770.html
Copyright © 2011-2022 走看看