SAMRTFORMS 转换PDF 发送邮件

本文详细描述了如何在SAP系统中,通过T-CODE查询并利用BADI增强功能,创建SMARTFORMS表单进行打印操作,并将打印结果转换为PDF,附带邮件发送的过程。
摘要由CSDN通过智能技术生成

最终成果:

*&---------------------------------------------------------------------*

*& Report ZLC_FIND_EXIT

*&---------------------------------------------------------------------*

*&根据T-CODE / 程序名查询出口、BADI增强

*&---------------------------------------------------------------------*

REPORT ZEDIT_G.





"打印参数

DATA:LV_FMNAME  TYPE RS38L_FNAM,

     LS_CTRLOP  TYPE SSFCTRLOP,

     LS_COMPOP  TYPE SSFCOMPOP,

     LS_RETURN  TYPE SSFCRESCL,

     LS_INFO    TYPE SSFCRESCL,

     LS_OPTIONS TYPE SSFCRESOP.





"附件参数

DATA:LT_OTF    TYPE ITCOO OCCURS 0 WITH HEADER LINE,

     LT_TLINE  TYPE TLINE OCCURS 0 WITH HEADER LINE,

     LT_RECORD LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE.





"邮件参数

DATA:LV_SIZE      TYPE I, "邮件附件大小

     LV_LINES_TXT TYPE I, "邮件文本行数

     LV_LINES_BIN TYPE I, "邮件附件行数

     LV_BENFILE   TYPE XSTRING,

     LV_OBJECT    TYPE CHAR50, "邮件主题

     LV_PDFNAME   TYPE CHAR50,

     GT_OBJPACK   LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE, "邮件内容 正文+附件

     GT_OBJTXT    LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE, "正文内容

     GT_OBJBIN    LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE, "附件内容

     GT_RECLIST   LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE, "收件人

     LS_DOC_CHNG  TYPE SODOCCHGI1. "邮件属性





"打印控制

LS_CTRLOP-NO_OPEN = 'X'.

LS_CTRLOP-NO_CLOSE = 'X'.

LS_CTRLOP-GETOTF = 'X'.    "这个必须要打上标记,否则无法获取打印页面数据

LS_CTRLOP-LANGU = '1'.

LS_CTRLOP-NO_DIALOG = 'X'.





LS_COMPOP-TDNOPREV = 'X'.





CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'

  EXPORTING

    FORMNAME           = 'ZTEST001'  "创建的SMARTFORMS表单名称

  IMPORTING

    FM_NAME            = LV_FMNAME

  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.





CALL FUNCTION 'SSF_OPEN'                 "打开打印页面

  EXPORTING

    OUTPUT_OPTIONS     = LS_COMPOP

    CONTROL_PARAMETERS = LS_CTRLOP

    USER_SETTINGS      = 'X'

  IMPORTING

    JOB_OUTPUT_OPTIONS = LS_OPTIONS

  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.





CALL FUNCTION LV_FMNAME              调用打印表单接口函数

  EXPORTING

    OUTPUT_OPTIONS     = LS_COMPOP

    CONTROL_PARAMETERS = LS_CTRLOP

    USER_SETTINGS      = ' '

  IMPORTING

    JOB_OUTPUT_INFO    = LS_RETURN

  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.

ELSE.

ENDIF.





CALL FUNCTION 'SSF_CLOSE'                "关闭打印表单

  IMPORTING

    JOB_OUTPUT_INFO  = LS_INFO

  EXCEPTIONS

    FORMATTING_ERROR = 1

    INTERNAL_ERROR   = 2

    SEND_ERROR       = 3

    OTHERS           = 4.

IF SY-SUBRC <> 0.

  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ELSE.

  APPEND LINES OF LS_INFO-OTFDATA TO LT_OTF.

ENDIF.





CALL FUNCTION 'CONVERT_OTF'            "转换PDF格式

  EXPORTING

    FORMAT                = 'PDF'

    PDF_USERNAME          = 'TIANCZ'

  IMPORTING

    BIN_FILESIZE          = LV_SIZE

    BIN_FILE              = LV_BENFILE

  TABLES

    OTF                   = LT_OTF

    LINES                 = LT_TLINE

  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 LV_BENFILE IS NOT INITIAL.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'      "转换PDF添加邮件附件

    EXPORTING

      BUFFER        = LV_BENFILE

    IMPORTING

      OUTPUT_LENGTH = LV_SIZE

    TABLES

      BINARY_TAB    = LT_RECORD.

ENDIF.





REFRESH:GT_RECLIST,GT_OBJTXT,GT_OBJBIN,GT_OBJPACK.

CLEAR: LS_DOC_CHNG.





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

APPEND LINES OF LT_RECORD TO GT_OBJBIN.





"添加邮件正文

GT_OBJTXT = ''.

APPEND GT_OBJTXT.





GT_OBJTXT = '邮件测试,包含一个PDF附件'.

APPEND GT_OBJTXT.





"邮件正文行数

LV_LINES_TXT = LINES( GT_OBJTXT ).





LV_OBJECT = '邮件测试'.

LV_PDFNAME = 'SM转换的PDF文件.pdf'.





LS_DOC_CHNG-OBJ_LANGU = SY-LANGU.

LS_DOC_CHNG-OBJ_NAME = 'Email'.

LS_DOC_CHNG-EXPIRY_DAT = SY-DATUM + 10.

LS_DOC_CHNG-OBJ_DESCR = LV_OBJECT.  "邮件主题

LS_DOC_CHNG-SENSITIVTY = 'F'.

LS_DOC_CHNG-DOC_SIZE = LV_LINES_TXT * 255 + LV_SIZE.

LS_DOC_CHNG-PRIORITY = '1'.





CLEAR GT_OBJPACK-TRANSF_BIN.

GT_OBJPACK-HEAD_START = 1.

GT_OBJPACK-HEAD_NUM = 0.

GT_OBJPACK-BODY_START = 1.

GT_OBJPACK-BODY_NUM = LV_LINES_TXT.

GT_OBJPACK-DOC_TYPE = 'RAW'.

APPEND GT_OBJPACK.





CLEAR:LV_LINES_BIN.

GT_OBJPACK-TRANSF_BIN = 'X'.

GT_OBJPACK-HEAD_START = 1.

GT_OBJPACK-HEAD_NUM = 1.

GT_OBJPACK-BODY_START = 1.





LV_LINES_BIN = LINES( LT_RECORD ).





GT_OBJPACK-DOC_SIZE = LV_SIZE .

GT_OBJPACK-BODY_NUM = LV_LINES_BIN.

GT_OBJPACK-DOC_TYPE = 'PDF'.

GT_OBJPACK-OBJ_NAME = 'PO'.

GT_OBJPACK-OBJ_DESCR = LV_PDFNAME.

APPEND GT_OBJPACK.





GT_RECLIST-RECEIVER = 'XXXXX@163.com'."收件人邮箱

GT_RECLIST-REC_TYPE = 'U'.

APPEND GT_RECLIST.





CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'

  EXPORTING

    DOCUMENT_DATA              = LS_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.

  MESSAGE '发送成功!' TYPE 'S'.

  WAIT UP TO 1 SECONDS.

  SUBMIT RSCONN01 WITH MODE = 'INT'

  WITH OUTPUT = ''

  AND RETURN.

ELSE.

  MESSAGE '发送失败!' TYPE 'S'.

ENDIF.

T-CODE:SOST--查看邮件发送情况:

可参考学习笔记:https://www.cnblogs.com/StephenAmell/p/17414767.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值