运行效果:
代码:
************************************************************************ * 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