程序运行效果:
Tcode SOST:
代码:
*&---------------------------------------------------------------------* *& Report ZPPRTEST *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZPPRTEST. TABLES: afko. DATA: BEGIN OF gt_data OCCURS 0, aufnr LIKE afko-aufnr, plnbez LIKE afko-plnbez, gstrp LIKE afko-gstrp, gltrp LIKE afko-gltrp, END OF gt_data. DATA: BEGIN OF gt_stock OCCURS 0, matnr LIKE marc-matnr, lgort LIKE mard-lgort, labst LIKE mard-labst, END OF gt_stock. DATA:g_string TYPE string, g_string2 TYPE string, g_mail_address TYPE ad_smtpadr, g_def_sel_ord TYPE c. CONSTANTS: gc_tab TYPE c VALUE cl_bcs_convert=>gc_tab, gc_crlf TYPE c VALUE cl_bcs_convert=>gc_crlf. TYPE-POOLS : slis. DATA: gs_layout TYPE slis_layout_alv, gt_fieldcat TYPE slis_t_fieldcat_alv, wa_fieldcat TYPE slis_fieldcat_alv. SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01. SELECT-OPTIONS: s_aufnr FOR afko-aufnr. SELECTION-SCREEN END OF BLOCK B1. SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-B02. PARAMETERS: c_m1 AS CHECKBOX, p_t1 TYPE so_obj_des. SELECT-OPTIONS: s_m1 FOR g_mail_address NO INTERVALS. SELECTION-SCREEN END OF BLOCK B2. START-OF-SELECTION. PERFORM get_data. PERFORM display_data. END-OF-SELECTION. FORM get_data. *-->工单 SELECT afko~aufnr afko~plnbez afko~gstrp afko~gltrp INTO CORRESPONDING FIELDS OF TABLE gt_data FROM afko WHERE aufnr IN s_aufnr. *-->库存 SELECT afko~plnbez AS matnr mard~lgort mard~labst INTO CORRESPONDING FIELDS OF TABLE gt_stock FROM afko INNER JOIN mard ON afko~plnbez EQ mard~matnr WHERE aufnr IN s_aufnr AND mard~werks = '2000'. ENDFORM. FORM display_data. DATA: l_repid TYPE sy-repid, l_inclname TYPE trdir-name, l_idx LIKE sy-tabix. CLEAR: gt_fieldcat[], wa_fieldcat. l_repid = l_inclname = sy-cprog. gs_layout-colwidth_optimize = 'X'. CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' EXPORTING I_PROGRAM_NAME = l_repid I_INTERNAL_TABNAME = 'GT_DATA' I_INCLNAME = l_inclname CHANGING CT_FIELDCAT = gt_fieldcat EXCEPTIONS INCONSISTENT_INTERFACE = 1 PROGRAM_ERROR = 2 OTHERS = 3. LOOP AT gt_fieldcat INTO wa_fieldcat. l_idx = sy-tabix. CASE wa_fieldcat-fieldname. * WHEN 'sortl'. * wa_fieldcat-seltext_s = wa_fieldcat-seltext_m = * wa_fieldcat-seltext_l = '供应商简称'. * wa_fieldcat-ddictxt = 's'. ENDCASE. CLEAR wa_fieldcat-key. MODIFY gt_fieldcat FROM wa_fieldcat INDEX l_idx. ENDLOOP. IF c_m1 = 'X'. PERFORM process_data. PERFORM process_data_stock. PERFORM send_mail TABLES s_m1 USING p_t1. ENDIF. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_CALLBACK_PROGRAM = sy-repid IS_LAYOUT = gs_layout IT_FIELDCAT = gt_fieldcat[] * I_CALLBACK_PF_STATUS_SET = 'ALV_PF_STATUS' " 触发事件调用子程序 * I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND' " 鼠标事件操作子程序 I_SAVE = 'A' TABLES T_OUTTAB = GT_DATA EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. ENDFORM. FORM process_data. DATA: l_line TYPE string, l_gstrp(10), l_gltrp(10). CLEAR g_string. *-->Header Line CONCATENATE '工单' '物料' '基本开工日' '基本完工日' INTO g_string SEPARATED BY gc_tab. *-->断行 CONCATENATE g_string l_line gc_crlf INTO g_string. *-->Data LOOP AT gt_data. CLEAR: l_gstrp,l_gltrp. CONCATENATE gt_data-gstrp+0(4) '/' gt_data-gstrp+4(2) '/' gt_data-gstrp+6(2) INTO l_gstrp. CONCATENATE gt_data-gltrp+0(4) '/' gt_data-gltrp+4(2) '/' gt_data-gltrp+6(2) INTO l_gltrp. CONCATENATE gt_data-aufnr gt_data-plnbez l_gstrp l_gltrp INTO l_line SEPARATED BY gc_tab. *-->断行 CONCATENATE g_string l_line gc_crlf INTO g_string. ENDLOOP. ENDFORM. FORM process_data_stock. DATA: l_line TYPE string, l_labst(20). CLEAR g_string2. CONCATENATE '物料' '仓库' '库存' INTO g_string2 SEPARATED BY gc_tab. CONCATENATE g_string2 l_line gc_crlf INTO g_string2. LOOP AT gt_stock. CLEAR: l_labst. WRITE gt_stock-labst TO l_labst. "数字要转换成字符 CONCATENATE gt_stock-matnr gt_stock-lgort l_labst INTO l_line SEPARATED BY gc_tab. CONCATENATE g_string2 l_line gc_crlf INTO g_string2. ENDLOOP. ENDFORM. FORM send_mail TABLES lt_mail_addr STRUCTURE s_m1 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, binary_content2 TYPE solix_tab. DATA: size TYPE so_obj_len, size2 TYPE so_obj_len. DATA sent_to_all TYPE os_boolean. DATA: l_filename TYPE sood-objdes, l_filename2 TYPE sood-objdes. CONCATENATE '生产订单' '_' sy-datum INTO l_filename. CONCATENATE '库存' '_' sy-datum INTO l_filename2. * -------------------------------------------------------------- * 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 = g_string 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. * 库存 TRY. cl_bcs_convert=>string_to_solix( EXPORTING iv_string = g_string2 iv_codepage = '4103' "suitable for MS Excel, leave empty iv_add_bom = 'X' "for other doc types IMPORTING et_solix = binary_content2 ev_size = size2 ). CATCH cx_bcs. MESSAGE e445(so). ENDTRY. 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 ' This Email is sent by systme, Do not Return the Email.' 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 ). * add the spread sheet as attachment to document object * 工单 document->add_attachment( i_attachment_type = 'xls' "#EC NOTEXT i_attachment_subject = l_filename i_attachment_size = size i_att_content_hex = binary_content ). * 库存 document->add_attachment( i_attachment_type = 'xls' "#EC NOTEXT i_attachment_subject = l_filename2 i_attachment_size = size2 i_att_content_hex = binary_content2 ). * 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.
其他博主的好文——SAP压缩excel并发送mail案例