ABAP——SmartForms转pdf后发送邮件

鲸与海 / 2023-08-16 / 原文

效果:

 

代码:(参考SAP系统程序BCS_EXAMPLE_8案例)

PARAMETERS: p_mail  TYPE ad_smtpadr OBLIGATORY.

DATA: go_send_request  TYPE REF TO cl_bcs,           "请求
      go_document      TYPE REF TO cl_document_bcs,  "文档
      go_recipient     TYPE REF TO if_recipient_bcs, "收件人
      go_bcs_exception TYPE REF TO cx_bcs.           "异常

DATA: gt_main_text   TYPE bcsy_text, "主要内容
      gt_pdf_content TYPE solix_tab,
      gv_pdf_size    TYPE so_obj_len,
      gv_pdf_xstring TYPE xstring,
      gv_sent_to_all TYPE os_boolean.

START-OF-SELECTION.

  "Smartforms转换pdf
  PERFORM convert_sf_to_pdf.

  "邮件发送pdf
  PERFORM send_mail.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  CONVERT_SF_TO_PDF
*&---------------------------------------------------------------------*
* Smartforms转换pdf
* 1) smartforms假脱机打印
* 2) 获取假脱机请求的属性
* 3) 根据文档类型将假脱机请求转换为PDF
*----------------------------------------------------------------------*
FORM convert_sf_to_pdf .

  DATA: ls_ssfctrlop TYPE ssfctrlop,
        ls_ssfcrescl TYPE ssfcrescl,
        ls_sscompop  TYPE ssfcompop,
        ls_spoolid   TYPE rspoid,
        lv_fnam      TYPE rs38l_fnam,
        lv_spoolid   TYPE rqident.

  DATA: lt_attr     TYPE TABLE OF rspoattr,
        ls_rq       TYPE tsp01,
        lv_bin_size TYPE i.

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      formname           = 'ZPPS999'
    IMPORTING
      fm_name            = lv_fnam
    EXCEPTIONS
      no_form            = 1
      no_function_module = 2
      OTHERS             = 3.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  ls_ssfctrlop-no_dialog = 'X'.
  ls_ssfctrlop-langu     = sy-langu.
  ls_sscompop-tddest     = 'FPW1'.
  ls_sscompop-tdnewid    = 'X'.

  CALL FUNCTION lv_fnam
    EXPORTING
      control_parameters = ls_ssfctrlop
      output_options     = ls_sscompop
      user_settings      = ' '
    IMPORTING
      job_output_info    = ls_ssfcrescl
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 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.

  LOOP AT ls_ssfcrescl-spoolids INTO ls_spoolid.

    "获取假脱机请求的属性
    CALL FUNCTION 'RSPO_GET_ATTRIBUTES_SPOOLJOB'
      EXPORTING
        rqident     = ls_spoolid
      IMPORTING
        rq          = ls_rq
      TABLES
        attributes  = lt_attr
      EXCEPTIONS
        no_such_job = 1
        OTHERS      = 2.
    IF sy-subrc <> 0.
      MESSAGE e126(po) WITH ls_spoolid.
    ELSE.
      "根据文档类型将假脱机请求转换为PDF
      IF ls_rq-rqdoctype = 'OTF' OR ls_rq-rqdoctype = 'SMART'.
        CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
          EXPORTING
            src_spoolid              = ls_spoolid
            no_dialog                = 'X'
            pdf_destination          = 'X'
            no_background            = 'X'
          IMPORTING
            pdf_bytecount            = lv_bin_size
            bin_file                 = gv_pdf_xstring
          EXCEPTIONS
            err_no_otf_spooljob      = 1
            err_no_spooljob          = 2
            err_no_permission        = 3
            err_conv_not_possible    = 4
            err_bad_dstdevice        = 5
            user_cancelled           = 6
            err_spoolerror           = 7
            err_temseerror           = 8
            err_btcjob_open_failed   = 9
            err_btcjob_submit_failed = 10
            err_btcjob_close_failed  = 11
            OTHERS                   = 12.
        IF sy-subrc <> 0.
          MESSAGE e712(po) WITH sy-subrc 'CONVERT_OTFSPOOLJOB_2_PDF'.
        ENDIF.
      ELSEIF ls_rq-rqdoctype = 'LIST'.
        CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
          EXPORTING
            src_spoolid              = ls_spoolid
            no_dialog                = 'X'
            pdf_destination          = 'X'
            no_background            = 'X'
          IMPORTING
            pdf_bytecount            = lv_bin_size
            bin_file                 = gv_pdf_xstring
          EXCEPTIONS
            err_no_abap_spooljob     = 1
            err_no_spooljob          = 2
            err_no_permission        = 3
            err_conv_not_possible    = 4
            err_bad_destdevice       = 5
            user_cancelled           = 6
            err_spoolerror           = 7
            err_temseerror           = 8
            err_btcjob_open_failed   = 9
            err_btcjob_submit_failed = 10
            err_btcjob_close_failed  = 11
            OTHERS                   = 12.
        IF sy-subrc <> 0.
          MESSAGE e712(po) WITH sy-subrc 'CONVERT_ABAPSPOOLJOB_2_PDF'.
        ENDIF.
      ELSE.
        MESSAGE e789(po) WITH ls_rq-rqdoctype.
      ENDIF.
    ENDIF.

    gv_pdf_size = lv_bin_size.

    "列印ID
    lv_spoolid = ls_spoolid.

    lv_spoolid = |{ lv_spoolid ALPHA = IN }|.

    "删除列印请求
    CALL FUNCTION 'RSPO_R_RDELETE_SPOOLREQ'
      EXPORTING
        spoolid = lv_spoolid.

  ENDLOOP.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM send_mail .
  TRY.
*     -------- CREATE persistent send request ------------------------
      go_send_request = cl_bcs=>create_persistent( ).

*     -------- create and set document -------------------------------
      gt_pdf_content = cl_document_bcs=>xstring_to_solix( gv_pdf_xstring ).

*     append 'Hello world!' to main_text.                  "#EC NOTEXT

*     邮件内容
      APPEND 'Dear Mr and Miss:' TO gt_main_text.
      APPEND '' TO gt_main_text.
      APPEND '     这是一封测试邮件,请勿回复.' TO gt_main_text.
      APPEND '' TO gt_main_text.
      APPEND 'Thanks.' TO gt_main_text.

      go_document = cl_document_bcs=>create_document(
        i_type    = 'RAW'
        i_text    = gt_main_text
        i_subject = '这是一封pdf测试邮件' ).

      go_document->add_attachment(
        i_attachment_type    = 'PDF'
        i_attachment_subject = 'XX合同'
        i_attachment_size    = gv_pdf_size
        i_att_content_hex    = gt_pdf_content ).

*     add document object to send request
      go_send_request->set_document( go_document ).

*     --------- add recipient (e-mail address) -----------------------
*     create recipient object
      go_recipient = cl_cam_address_bcs=>create_internet_address( p_mail ).

*     add recipient object to send request
      go_send_request->add_recipient( go_recipient ).

*     ---------- send document ---------------------------------------
      gv_sent_to_all = go_send_request->send( i_with_error_screen = 'X' ).

      COMMIT WORK.

      IF gv_sent_to_all IS INITIAL.
        MESSAGE i500(sbcoms) WITH p_mail.
      ELSE.
        MESSAGE s022(so).
      ENDIF.

*   ------------ exception handling ----------------------------------
*   replace this rudimentary exception handling with your own one !!!
    CATCH cx_bcs INTO go_bcs_exception.
      MESSAGE i865(so) WITH go_bcs_exception->error_type.
  ENDTRY.
ENDFORM.