天天看点

ABAP-如何发用邮件附件的方式发送订单打印的PDF

在工作中,我们常常会遇到以邮件附件的方式发送SAP的订单,出库单或者发票等信息给客户。我这里将实现摘抄下来,供大家参考:

1、设计订单打印smarfform(这就不累述了)

2、设计订单打印程序:几个关键代码照抄如下:

2.1 调用打印程序生成PDF

*---------------------------------------------------------------------*

*       FORM PROCESSING                                               *

*---------------------------------------------------------------------*

FORM processing.

DATA: it_otf   TYPE STANDARD TABLE OF itcoo,

      lt_docs  TYPE STANDARD TABLE OF docs,

      lt_lines TYPE STANDARD TABLE OF tline.

........

*获取smartform的函数

      CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

        EXPORTING

          formname           = lf_formname

        IMPORTING

          fm_name            = lf_fm_name

        EXCEPTIONS

          no_form            = 1

          no_function_module = 2

          OTHERS             = 3.

      IF sy-subrc <> 0.

*   error handling

        retcode = sy-subrc.

        IF sy-subrc = 1.

          MESSAGE e006(/kyk/ops_sd) INTO g_dummy.

        ENDIF.

        IF sy-subrc = 2.

          MESSAGE e007(/kyk/ops_sd) WITH lf_formname INTO g_dummy.

        ENDIF.

        PERFORM protocol_update.

        RETURN.

      ENDIF.

*准备打印的数据

      tvbdpa1[] = tvbdpa[].

      REFRESH tvbdpa.

      LOOP AT gt_items INTO gs_items.

        READ TABLE tvbdpa1 INTO ls_tvbdpa WITH KEY posnr = gs_items-posnr.

        IF sy-subrc = 0.

          APPEND ls_tvbdpa TO tvbdpa.

        ENDIF.

      ENDLOOP.

*调用smartform的函数,输出

      CALL FUNCTION lf_fm_name

        EXPORTING

          archive_index        = toa_dara

          archive_parameters   = arc_params

          control_parameters   = ls_control_param

          mail_recipient       = ls_recipient

          mail_sender          = ls_sender

          output_options       = ls_composer_param

          user_settings        = ' '

          is_nast              = nast

          is_vbdka             = vbdka

          is_addres            = addr_key

          is_items             = gt_items

        IMPORTING

          document_output_info = document_output_info

          job_output_info      = job_output_info

          job_output_options   = job_output_options

        TABLES

          it_vbdpa             = tvbdpa    "Item information

          it_vbdpau            = tvbdpau   "Subitem numbers

          it_vedpa             = tkomservp  "Contract Item Validity

          it_vedka             = tkomservh  "Contract Header Validity

          it_vedpn             = tkomservpn "Contract Item Cancellation Data

          it_vedkn             = tkomservhn "Contract Header Cancellation DA

        EXCEPTIONS

          formatting_error     = 1

          internal_error       = 2

          send_error           = 3

          user_canceled        = 4

          OTHERS               = 5.

*将答应输出转成PDF文件并存储到内标 lt_lines用于发送

      CLEAR : lt_lines.

      CALL FUNCTION 'CONVERT_OTF_2_PDF'

        IMPORTING

          bin_filesize               = v_bin_filesize

        TABLES

          otf                             = job_output_info-otfdata

          doctab_archive         = lt_docs

          lines                          = lt_lines

        EXCEPTIONS

          err_conv_not_possible  = 1

          err_otf_mc_noendmarker = 2

          OTHERS                 = 3.

*将lt_lines 转换到

    PERFORM zqce1_convert

           TABLES

                lt_lines

                objbin.

.........

ENDFORM.

FORM zqce1_convert TABLES   t_source_tab STRUCTURE g_pdf_tab

                            t_target_tab STRUCTURE objbin.

  DATA:  l_hfeld(1600)      TYPE c,

         l_offset           TYPE p,

         l_tabix            LIKE sy-tabix,

         l_max              TYPE i,

         l_linecount_source TYPE i,

         l_length_source    TYPE i,

         l_length_target    TYPE i.

* line length source pdf files

  DESCRIBE FIELD t_source_tab LENGTH l_length_source IN CHARACTER MODE.

* line length of the goal MIME table

  DESCRIBE FIELD t_target_tab LENGTH l_length_target IN CHARACTER MODE.

* number of lines source pdf files

  DESCRIBE TABLE t_source_tab LINES l_linecount_source.

* the maximum goal size is limited by the field l_hfeld.

  l_max = l_length_target + l_length_source.

  IF l_max > 1600.

    RAISE convert_not_possible.

  ENDIF.

  REFRESH t_target_tab.

  LOOP AT t_source_tab.

    l_tabix = sy-tabix.

    MOVE t_source_tab TO l_hfeld+l_offset.

* falls letzte zeile der quelltabelle erreicht

    IF l_tabix = l_linecount_source.

      l_length_source = strlen( t_source_tab ).

    ENDIF.

    l_offset = l_offset + l_length_source.

    WHILE l_offset GE l_length_target.

      CLEAR t_target_tab.

      t_target_tab = l_hfeld(l_length_target).

      APPEND t_target_tab.

      SHIFT l_hfeld BY l_length_target PLACES.

      l_offset = l_offset - l_length_target.

    ENDWHILE.                          " l_offset ge p_length_targ

* falls letzte zeile der quelltabelle erreicht

    IF l_tabix = l_linecount_source.

      IF l_offset GT 0.

        CLEAR t_target_tab.

        t_target_tab = l_hfeld(l_offset).

        APPEND t_target_tab.

      ENDIF.                           " l_offset gt 0

    ENDIF.                             " l_tabix = l_linecount_lin

  ENDLOOP.                             " p_source_tab

ENDFORM.

2.2 调用程序发送邮件

*填写邮件内容内表

    MOVE '<body bgcolor = "#E6E6FA">' TO ls_body_msg-line.

    APPEND ls_body_msg TO lt_body_msg.

........

    MOVE '</body>' TO ls_body_msg-line.

    APPEND ls_body_msg TO lt_body_msg.

*准备邮件发送内表

    "Write Packing List for Body

    CLEAR: lt_packing_list, ls_packing_list.

    DESCRIBE TABLE lt_body_msg LINES g_tab_lines.

    ls_packing_list-head_start = 1.

    ls_packing_list-head_num   = 0.

    ls_packing_list-body_start = 1.

    ls_packing_list-body_num   = g_tab_lines.

*    ls_packing_list-doc_type   = 'RAW'.                       "V005

    ls_packing_list-doc_type   = 'HTM'.                       "V005

    APPEND ls_packing_list TO lt_packing_list .

*准备Packing List for Attachment

      ls_packing_list-transf_bin = 'X'.

      ls_packing_list-head_start = 1.

      ls_packing_list-head_num   = 1.

      ls_packing_list-body_start = 1.

      DESCRIBE TABLE objbin LINES ls_packing_list-body_num.

      ls_packing_list-doc_type   = 'PDF'.

      ls_packing_list-obj_descr  = 'PDF Attachment'.

      ls_packing_list-obj_name   = 'PDF_ATTACHMENT'.

      ls_packing_list-doc_size   = ls_packing_list-body_num * 255.

      APPEND ls_packing_list TO lt_packing_list.

*Fill the document data and get size of attachment

    ls_document_data-obj_langu  = nast-spras.

    READ TABLE lt_packing_list  INTO ls_packing_list INDEX g_tab_lines.

    ls_document_data-doc_size = ( g_tab_lines - 1 ) * 255 + strlen( ls_packing_list ).

*填写邮件地址

    "Receivers List.

    ls_receivers-rec_type   = 'U'.  "Internet address

    ls_receivers-receiver   = p_mail.

    ls_receivers-com_type   = 'INT'.

    ls_receivers-notif_del  = 'X'.

    ls_receivers-notif_ndel = 'X'.

    APPEND ls_receivers TO lt_receivers .

    CLEAR:ls_receivers.

*发送邮件

    CLEAR g_sent_to_all.

    "Function module to send mail to Recipients

    CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

      EXPORTING

        document_data              = ls_document_data

        put_in_outbox              = 'X'

        commit_work                = 'X'

      IMPORTING

        sent_to_all                = g_sent_to_all

      TABLES

        packing_list               = lt_packing_list

        contents_bin               = objbin

        contents_txt               = lt_body_msg

        receivers                  = lt_receivers

      EXCEPTIONS

        too_many_receivers         = 1

        document_not_sent          = 2

        document_type_not_exist    = 3

        operation_no_authorization = 4

        parameter_error            = 5

        x_error                    = 6

        enqueue_error              = 7

        OTHERS                     = 8.

    IF sy-subrc = 0 .

      MESSAGE i303(me) WITH 'Mail has been Successfully Sent.'.

      REFRESH : lt_packing_list,

                objbin,

                lt_body_msg,

                lt_receivers.

      CLEAR :

           ls_document_data.

    ELSE.

      WAIT UP TO 2 SECONDS.

      "This program starts the SAPconnect send process.

      SUBMIT rsconn01 WITH mode = 'INT'

      WITH output = 'X'

      AND RETURN.

    ENDIF.

3、定义订单输出

ABAP-如何发用邮件附件的方式发送订单打印的PDF

4、创建后台任务定期发送打印

使用sm36创建后台任务,任务调用SD70AV1A,SD70AV2A,SD70AV3A程序即可。

完成以上步骤,系统就能够自动通过邮件的方式发送订单的PDF文件了。

供大家参考!

继续阅读