有时候不需要打印smartforms,而是以pdf格式发邮件发过去,下面是部分代码


REPORT  zlm_cvrt_smart_to_pdf_mail .


"控制变量



DATA  fm_name                          TYPE rs38l_fnam .


DATA : control_parameters    TYPE ssfctrlop ,

 

          l_output_options        TYPE ssfcompop .



DATA job_output_info            TYPE ssfcrescl .


DATA job_output_options      TYPE ssfcresop .



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


"转OTF


DATA : gt_otf            LIKE  TABLE  OF itcoo        WITH  HEADER  LINE ,

 

          gt_pdf_line  LIKE  TABLE  OF tline        WITH  HEADER  LINE ,

 

          gt_record      LIKE  TABLE  OF solisti1  WITH  HEADER  LINE . DATA: g_len_in TYPE i,                                                 "OTF 文件大小(邮件附件大小)

      g_lines_txt TYPE i,                                              "邮件文本行数

      g_lines_bin TYPE i.                                              "邮件附件行数

DATA: g_benfile   TYPE xstring.                                        "二进制格式的邮件

DATA: g_object(50) TYPE c.                                             "邮件主题


DATA pdf_name     TYPE string.                                         "附件名称


DATA: gt_objpack  LIKE TABLE OF sopcklsti1   WITH HEADER LINE,         "邮件内容 正文+附件

      gt_objtxt   LIKE TABLE OF solisti1     WITH HEADER LINE,         "正文内容

      gt_objbin   LIKE TABLE OF solisti1     WITH HEADER LINE,         "附件内容

      gt_reclist  LIKE TABLE OF somlreci1    WITH HEADER LINE,         "收件人

      wa_doc_chng TYPE sodocchgi1.                                     "邮件属性


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


"选择屏幕


PARAMETERS :

 

                      p_email  TYPE so_recname  OBLIGATORY  DEFAULT  'LIUMENG@…….com' . 

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

START-OF-SELECTION.

  CLEAR: job_output_options,

         job_output_info,

         g_len_in,

         g_lines_txt,

         g_lines_bin,

         g_benfile.

  CLEAR  : gt_otf[], gt_pdf_line[],gt_record[].


  "控制变量赋值   control_parameters-getotf    = 'X'.   "此参数必须,否则不会导出PDF而直接显示smartform

  control_parameters-no_close  = ''.

  control_parameters-no_dialog = 'X'.   "不显示打印对话框


  "输出参数设置

  l_output_options-tddest      = 'ZLM_PL'. "选择打印设备,可选

  l_output_options-xsfoutdev   = 'ZLM_PL'. "选择打印设备,可选

  l_output_options-tdprinter   = 'CNSAPWIN'.



CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

    EXPORTING

      formname           = 'ZLM_SMTFM'

    IMPORTING

      fm_name            = fm_name

    EXCEPTIONS

      no_form            = 1

      no_function_module = 2

      OTHERS             = 3.


  CHECK: sy-subrc = 0.

  CALL FUNCTION fm_name

    EXPORTING

      control_parameters = control_parameters

      output_options     = l_output_options      "默认打印选项设置传输

*     user_settings      = 'X'                   "是否从用户主记录中获取信息

      i_acct_head        = l_acct_head

    IMPORTING

      job_output_info    = job_output_info

      job_output_options = job_output_options

    TABLES

      it_acct_item       = lt_acct_item

    EXCEPTIONS

      formatting_error   = 1

      internal_error     = 2

      send_error         = 3

      user_canceled      = 4

      OTHERS             = 5.


  CHECK: sy-subrc = 0.


* convert smartforms to pdf

  "将SMARTFOMR转换成PDF格式

  CALL FUNCTION 'CONVERT_OTF'

    EXPORTING

      format                = 'PDF'

    IMPORTING

      bin_filesize          = g_len_in                    "文件大小

      bin_file              = g_benfile                   "16进制的文件数据

    TABLES

      otf                   = job_output_info-otfdata     "由SMARTFORM生成的OTF格式的数据

      lines                 = gt_pdf_line                 "生成的PDF格式的数据

    EXCEPTIONS

      err_max_linewidth     = 1

      err_format            = 2

      err_conv_not_possible = 3

      err_bad_otf           = 4

      OTHERS                = 5.

  IF sy-subrc <> 0.

    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.


  IF g_benfile IS NOT INITIAL.

    "将16进制的字符串转换成二进制数据

    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'

      EXPORTING

        buffer        = g_benfile

      IMPORTING

        output_length = g_len_in                        "邮件附件大小

      TABLES

        binary_tab    = gt_record.                      "二进制文件数据

  ENDIF.


  REFRESH:gt_reclist,gt_objtxt,gt_objbin,gt_objpack.

  CLEAR: wa_doc_chng.




  "将转换后的文件添加到邮件附件

  APPEND LINES OF gt_record TO gt_objbin.


  "添加邮件正文

  gt_objtxt = ' '.

  APPEND gt_objtxt.


  gt_objtxt = ' 本邮件由系统自动发出,请勿直接回复!'.

  APPEND gt_objtxt.


  "邮件正文行数

  DESCRIBE TABLE gt_objtxt LINES g_lines_txt.


  g_object = '测试邮件!'.                "邮件主题

  pdf_name = '测试.pdf'.                  "附件名称


**** Mail Attribute

  wa_doc_chng-obj_langu = sy-langu.

  wa_doc_chng-obj_name = 'Email'.

  wa_doc_chng-expiry_dat = sy-datum + 10.

  wa_doc_chng-obj_descr = g_object .  " 邮件主题

  wa_doc_chng-sensitivty = 'F'.

  wa_doc_chng-doc_size = g_lines_txt * 255 + g_len_in.    "邮件大小

  wa_doc_chng-priority = '1'.


* Main Text

  CLEAR gt_objpack-transf_bin.

  gt_objpack-head_start = 1.

  gt_objpack-head_num = 0.

  gt_objpack-body_start = 1.

  gt_objpack-body_num = g_lines_txt.

  gt_objpack-doc_type = 'RAW'.

  APPEND gt_objpack.


* Attachment (pdf-Attachment)

  CLEAR :g_lines_bin.

  gt_objpack-transf_bin = 'X'.

  gt_objpack-head_start = 1.

  gt_objpack-head_num = 1.

  gt_objpack-body_start = 1.

  DESCRIBE TABLE gt_record LINES g_lines_bin.

  "此处附件大小应该按照SCMS_XSTRING_TO_BINARY返回值赋值,如果按照g_lines_bin*225计算,可能出现文件损坏情况

  gt_objpack-doc_size = g_len_in .

  gt_objpack-body_num = g_lines_bin.

  gt_objpack-doc_type = 'PDF'.

  gt_objpack-obj_name = 'PO'.

  gt_objpack-obj_descr = pdf_name.                "附件名称

  APPEND gt_objpack.


  "收件人邮箱

  gt_reclist-receiver = p_email.

  gt_reclist-rec_type = 'U'.

  APPEND gt_reclist.


  " 发送邮件

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

    EXPORTING

      document_data              = wa_doc_chng  " 邮件属性

      put_in_outbox              = ''

      commit_work                = 'X'

    TABLES

      packing_list               = gt_objpack  " 邮件内容

      contents_bin               = gt_objbin   " 附件内容(二进制)

      contents_txt               = gt_objtxt   " 邮件内容(直接填入)

      receivers                  = gt_reclist  " 收件箱地址

    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.

* 考虑系统时延,等待两秒

    WAIT UP TO 2 SECONDS.

* 执行邮件立即发送程序

    SUBMIT rsconn01 WITH mode = 'INT'

                  WITH output = '' " 不显示发送结果

                  AND RETURN.

    MESSAGE 'send mail successful!' TYPE 'S'.

  ELSE.

    MESSAGE 'send mail failed!' TYPE 'S'.

  ENDIF.