ABAP-发邮件SO_NEW_DOCUMENT_ATT_SEND_API1(本地附件,内表,SmartForms)

本文介绍如何在ABAP中利用SO_NEW_DOCUMENT_ATT_SEND_API1函数发送包含本地附件和内表数据的电子邮件,同时涉及SmartForms的使用。
REPORT Y_ABC_SEND_MAIL.

TABLES: RLGRAP.

DATA: G_SEND_FLG   LIKE SONV-FLAG.
DATA: G_EMAIL_ID   LIKE SOFOLENTI1-OBJECT_ID.

DATA: GT_RECE      TYPE TABLE OF SOMLRECI1  WITH HEADER LINE.
DATA: GT_MAIL_TEXT TYPE TABLE OF SOLISTI1   WITH HEADER LINE.
DATA: GT_FIELD_TAB TYPE TABLE OF SOLIX      WITH HEADER LINE.
DATA: GT_PACK_TAB  TYPE TABLE OF SOPCKLSTI1 WITH HEADER LINE.
DATA: GT_OBJ_HEAD  TYPE TABLE OF SOLISTI1   WITH HEADER LINE.

DATA: GS_DOCMENT   TYPE SODOCCHGI1.
DATA: GV_HEAD_SID  TYPE I.
DATA: GV_BODY_SID  TYPE I.
DATA: GV_BODY_SIDA TYPE I.
DATA: GV_TITLE     TYPE STRING VALUE 'title:C'.

DATA: GT_FILE_PATH TYPE TABLE OF STRING WITH HEADER LINE.

DATA: LT_T001 TYPE TABLE OF T001 WITH HEADER LINE.


PARAMETERS: P_FILE       TYPE RLGRAP-FILENAME DEFAULT 'C:\Users\ABC_a\Desktop\fj3.xlsx'.
SELECT-OPTIONS: S_FILE   FOR  RLGRAP-FILENAME DEFAULT 'C:\Users\ABC_a\Desktop\fj3.xlsx'.
PARAMETERS: L1(84) DEFAULT 'ABC'.
PARAMETERS: L2(84) DEFAULT 'END'.


INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_FILE-LOW.
  PERFORM FRM_ZF4_FILE.


START-OF-SELECTION.
  PERFORM FRM_00_INIT_DATA.
  PERFORM FRM_SEND_MAIL.

END-OF-SELECTION.


*&---------------------------------------------------------------------*
*&      Form  FRM_00_INIT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_00_INIT_DATA .
  CLEAR: GV_HEAD_SID.
  CLEAR: GV_BODY_SIDA.
  CLEAR: GT_FILE_PATH[].
  CLEAR: LT_T001[].

  IF P_FILE IS NOT INITIAL.
    GT_FILE_PATH    = P_FILE.
    APPEND GT_FILE_PATH.
  ENDIF.

  LOOP AT S_FILE.
    GT_FILE_PATH   = S_FILE-LOW.
    APPEND GT_FILE_PATH.
  ENDLOOP.

  SORT GT_FILE_PATH.
  DELETE ADJACENT DUPLICATES FROM GT_FILE_PATH COMPARING ALL FIELDS.

  SELECT * INTO TABLE LT_T001 FROM T001 UP TO 10 ROWS.

ENDFORM.                    " FRM_00_INIT_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_MAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_SEND_MAIL.
  CLEAR: GS_DOCMENT.
  CLEAR: G_SEND_FLG.
  CLEAR: G_EMAIL_ID.
  CLEAR: GT_PACK_TAB[].
  CLEAR: GT_OBJ_HEAD[].
  CLEAR: GT_MAIL_TEXT[].
  CLEAR: GT_FIELD_TAB[].
  CLEAR: GT_RECE[].

  PERFORM FRM_SEND_MAIL_S1_RECEIVER   TABLES GT_RECE.
  PERFORM FRM_SEND_MAIL_S2_TITLE_BODY TABLES GT_PACK_TAB GT_MAIL_TEXT USING GS_DOCMENT GV_TITLE.
  PERFORM FRM_SEND_MAIL_S3_FILE_ITAB.
  BREAK-POINT.
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1' DESTINATION 'DEABK'
    EXPORTING
      DOCUMENT_DATA              = GS_DOCMENT
      PUT_IN_OUTBOX              = 'X'
      COMMIT_WORK                = 'X'
    IMPORTING
      G_SEND_FLG_TO_ALL          = G_SEND_FLG
      NEW_OBJECT_ID              = G_EMAIL_ID
    TABLES
      PACKING_LIST               = GT_PACK_TAB   " 邮件详细列表清单
      OBJECT_HEADER              = GT_OBJ_HEAD   " 邮件附件列表【参数作用不详】
      CONTENTS_TXT               = GT_MAIL_TEXT  " 邮件内容
      CONTENTS_HEX               = GT_FIELD_TAB  " 内容(all)【本地附件、内表】
      RECEIVERS                  = GT_RECE       " 收件人列表
    EXCEPTIONS
      TOO_MANY_RECEIVERS         = 1
      DOCUMENT_NOT_G_SEND_FLG    = 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.
  ENDIF.

  WRITE:/ G_EMAIL_ID.
  WRITE:/ G_SEND_FLG.
  WRITE:/ SY-SUBRC.

ENDFORM.                    "FRM_SEND_MAIL
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_MAIL_S1_RECEIVER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_RECE  text
*----------------------------------------------------------------------*
FORM FRM_SEND_MAIL_S1_RECEIVER  TABLES   PT_RECE STRUCTURE SOMLRECI1.
  PT_RECE-REC_TYPE = 'U'.
  PT_RECE-COM_TYPE = 'INT'.
  PT_RECE-EXPRESS  = 'X'.
  """"""""""""""""""""""""""""""""""""""""""""""""""
  PT_RECE-COPY  = ''.      " 正常收件人
  PT_RECE-RECEIVER = 'cly-apple@hotmail.com'.
  APPEND PT_RECE.

  PT_RECE-COPY  = 'X'.    " 抄送
  PT_RECE-RECEIVER = '262560478@QQ.COM'.
  APPEND PT_RECE.

  CLEAR: PT_RECE.
ENDFORM.                    "FRM_SEND_RECEIVER
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_TITLE_BODY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->GT_PACK_TAB   text
*      -->PT_MAIL_TEXT  text
*      -->GS_DOCMENT    text
*      -->PV_TITLE      text
*----------------------------------------------------------------------*
FORM FRM_SEND_MAIL_S2_TITLE_BODY TABLES PT_PACK_TAB  STRUCTURE SOPCKLSTI1
                                PT_MAIL_TEXT STRUCTURE SOLISTI1
                          USING GS_DOCMENT TYPE SODOCCHGI1
                                PV_TITLE.
  PT_MAIL_TEXT-LINE = L1.
  APPEND PT_MAIL_TEXT.
  PT_MAIL_TEXT-LINE = L2.
  APPEND PT_MAIL_TEXT.

**** Mail Attribute
  GS_DOCMENT-OBJ_NAME   = 'MESSAGE'.
  GS_DOCMENT-OBJ_DESCR  = '邮件主题' .   " 邮件主题
  GS_DOCMENT-OBJ_DESCR  = PV_TITLE.    " 标题
  GS_DOCMENT-OBJ_LANGU  = SY-LANGU.
  GS_DOCMENT-EXPIRY_DAT = SY-DATUM.
  GS_DOCMENT-SENSITIVTY = 'F'.
  GS_DOCMENT-PRIORITY   = ''.   " 优先权 1-9 (高-低) 空-无优先

  DATA: LV_S TYPE I.
  DESCRIBE TABLE PT_MAIL_TEXT LINES LV_S.
  GS_DOCMENT-DOC_SIZE = ( LV_S - 1 ) * 255 + STRLEN( PT_MAIL_TEXT ).


*****************************************************

  DATA : LINES   TYPE I.

  DESCRIBE TABLE PT_MAIL_TEXT LINES LINES.
  PT_PACK_TAB-TRANSF_BIN = SPACE.
  PT_PACK_TAB-HEAD_START = 1.
  PT_PACK_TAB-HEAD_NUM   = 0.
  PT_PACK_TAB-BODY_START = 1.
  PT_PACK_TAB-BODY_NUM   = LINES.
  PT_PACK_TAB-DOC_SIZE   = LV_S * 255.
  PT_PACK_TAB-DOC_TYPE   = 'RAW'.
  APPEND PT_PACK_TAB.
  CLEAR: PT_PACK_TAB.

ENDFORM.                    "FRM_SEND_TITLE_BODY
*&---------------------------------------------------------------------*
*&      Form  FRM_SEND_MAIL_S3_FILE_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SEND_MAIL_S3_FILE_ITAB .
  """""""" 本地附件
  LOOP AT GT_FILE_PATH.
    GV_HEAD_SID = GV_HEAD_SID + 1.
    PERFORM FRM_FILE_A0_UPLOAD TABLES GT_PACK_TAB GT_FIELD_TAB USING GT_FILE_PATH.
  ENDLOOP.
*  """""""" 内表
   PERFORM FRM_FILE_A7_UPLOAD_APPEND_ITAB TABLES GT_PACK_TAB GT_FIELD_TAB.
  """""""" smartforms
  PERFORM FRM_FILE_A7_UPLOAD_APPEND_SMF  TABLES GT_PACK_TAB GT_FIELD_TAB.

ENDFORM.                    " FRM_SEND_MAIL_S3_FILE_ITAB
*&---------------------------------------------------------------------*
*&      Form  FRM_UPLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_PACK_TAB   text
*      -->PT_FIELD_TAB  text
*      -->PV_FILE_PATH  text
*----------------------------------------------------------------------*
FORM FRM_FILE_A0_UPLOAD TABLES PT_PACK_TAB  STRUCTURE SOPCKLSTI1
                       PT_FIELD_TAB STRUCTURE SOLIX
                USING PV_FILE_PATH.

  DATA: LT_FIELD_TAB TYPE TABLE OF SOLIX WITH HEADER LINE.
  DATA: L_FILE_PATH  LIKE RLGRAP-FILENAME.
  DATA: L_FILE_NAME  LIKE RLGRAP-FILENAME.
  DATA: L_FILE_TYPE  LIKE RLGRAP-FILETYPE.
  DATA: L_FILE_SIZE  TYPE I.

  DATA: L_DOC_TYPE   TYPE CHAR3.
  DATA: L_DOC_SIZE   TYPE I.
  DATA: L_TAB_LINES  TYPE I.

*  """ 先选择文件 PV_FILE_PATH
  PERFORM FRM_FILE_A1_UPLOAD_WS_EXITS USING PV_FILE_PATH CHANGING L_FILE_PATH.
  PERFORM FRM_FILE_A2_UPLOAD_WS_ITAB TABLES LT_FIELD_TAB USING L_FILE_PATH CHANGING L_FILE_SIZE.

  """ 可选择文件 路径可能变更 L_FILE_NAME
  PERFORM FRM_FILE_A5_UPLOAD_ITAB TABLES LT_FIELD_TAB USING PV_FILE_PATH CHANGING L_FILE_PATH L_FILE_SIZE.

  CHECK SY-SUBRC = 0 .
  CHECK LT_FIELD_TAB[] IS NOT INITIAL .

  DATA: LV_TAB_LINES  TYPE I.
  DATA: LT_TAB_STR    TYPE TABLE OF STRING WITH HEADER LINE.
  SPLIT L_FILE_PATH AT '\' INTO TABLE LT_TAB_STR .
  DESCRIBE TABLE LT_TAB_STR LINES LV_TAB_LINES.
  READ TABLE LT_TAB_STR INDEX LV_TAB_LINES.
  SPLIT LT_TAB_STR AT '.' INTO L_FILE_NAME L_DOC_TYPE.


  DESCRIBE TABLE LT_FIELD_TAB LINES L_TAB_LINES.
*  L_DOC_SIZE = L_TAB_LINES * 255.

  GV_BODY_SIDA = GV_BODY_SID + 1.
  GV_BODY_SID  = GV_BODY_SID + L_TAB_LINES.

  PT_PACK_TAB-TRANSF_BIN = 'X'.
  PT_PACK_TAB-HEAD_START = GV_HEAD_SID.
  PT_PACK_TAB-HEAD_NUM   = 0.
  PT_PACK_TAB-BODY_START = GV_BODY_SIDA.
  PT_PACK_TAB-BODY_NUM   = L_TAB_LINES.
  PT_PACK_TAB-OBJ_NAME   = 'obj name'.
  PT_PACK_TAB-OBJ_DESCR  = L_FILE_NAME.          " 附件文件名
  PT_PACK_TAB-DOC_TYPE   = L_DOC_TYPE.
  PT_PACK_TAB-DOC_SIZE   = L_FILE_SIZE.          " l_doc_size.
  PT_PACK_TAB-OBJ_LANGU  = SY-LANGU.
  APPEND PT_PACK_TAB.
  CLEAR: PT_PACK_TAB.

*  GT_OBJ_HEAD = L_FILE_NAME.
*  APPEND GT_OBJ_HEAD.

  APPEND LINES OF LT_FIELD_TAB TO PT_FIELD_TAB.


ENDFORM.                    "FRM_UPLOAD
*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_A7_UPLOAD_APPEND_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_PACK_TAB   text
*      -->PT_FIELD_TAB  text
*----------------------------------------------------------------------*
FORM FRM_FILE_A7_UPLOAD_APPEND_ITAB TABLES PT_PACK_TAB  STRUCTURE SOPCKLSTI1
                                 PT_FIELD_TAB STRUCTURE SOLIX.
  CONSTANTS:
    LC_TAB  TYPE CHAR1 VALUE CL_BCS_CONVERT=>GC_TAB,  "CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
    LC_CRLF TYPE CHAR2 VALUE CL_BCS_CONVERT=>GC_CRLF. "CL_ABAP_CHAR_UTILITIES=>CR_LF

  DATA: LV_MIMETYPE TYPE CHAR64 VALUE 'APPLICATION/MSEXCEL;charset=utf-16le'.
  DATA: LV_XSTR1    TYPE XSTRING.
  DATA: LV_STR2     TYPE STRING.
  DATA: L_TAB_LINES LIKE SY-TABIX.

  DATA: LT_FIELD_TAB TYPE TABLE OF SOLIX WITH HEADER LINE.

  LOOP AT LT_T001.
    CONCATENATE LV_STR2
            LT_T001-BUKRS    LC_TAB
            LT_T001-ORT01    LC_TAB
            LT_T001-BUTXT    LC_CRLF
            INTO LV_STR2.
  ENDLOOP.

  " Convert string to xstring type
  " 'APPLICATION/MSEXCEL;charset=utf-16le'
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      TEXT     = LV_STR2
      MIMETYPE = LV_MIMETYPE
    IMPORTING
      BUFFER   = LV_XSTR1
    EXCEPTIONS
      FAILED   = 1
      OTHERS   = 2.
  IF SY-SUBRC = 0.
    " Add the file header for utf-16le. .
    CONCATENATE CL_ABAP_CHAR_UTILITIES=>BYTE_ORDER_MARK_LITTLE
    LV_XSTR1 INTO LV_XSTR1 IN BYTE MODE.
  ENDIF.

  DATA: LV_OUTPUT_LENGTH TYPE I.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER        = LV_XSTR1
    IMPORTING
      OUTPUT_LENGTH = LV_OUTPUT_LENGTH
    TABLES
      BINARY_TAB    = LT_FIELD_TAB.


***set attachment name, count size*******************
  DESCRIBE TABLE LT_FIELD_TAB LINES L_TAB_LINES.

  GV_HEAD_SID  = GV_HEAD_SID + 1.
  GV_BODY_SIDA = GV_BODY_SID + 1.
  GV_BODY_SID  = GV_BODY_SID + L_TAB_LINES.

  PT_PACK_TAB-TRANSF_BIN = 'X'.
  PT_PACK_TAB-HEAD_START = GV_HEAD_SID.
  PT_PACK_TAB-HEAD_NUM   = 0.
  PT_PACK_TAB-BODY_START = GV_BODY_SIDA.
  PT_PACK_TAB-BODY_NUM   = L_TAB_LINES.
  PT_PACK_TAB-DOC_TYPE   = 'XLS'.
  PT_PACK_TAB-OBJ_NAME   = 'ATTACHMENT'.
  PT_PACK_TAB-OBJ_DESCR  = 't001'.
  PT_PACK_TAB-DOC_SIZE   =  L_TAB_LINES * 255.
  PT_PACK_TAB-OBJ_LANGU  = SY-LANGU.
  APPEND PT_PACK_TAB.
  CLEAR: PT_PACK_TAB.


*  GT_OBJ_HEAD = 'T001x.xls'.
*  APPEND GT_OBJ_HEAD.

  APPEND LINES OF LT_FIELD_TAB TO PT_FIELD_TAB.

ENDFORM.                    "FRM_FILE_A7_UPLOAD_APPEND_ITAB
*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_UPLOAD_WS_EXITS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PV_FILE    text
*      <--CV_FILE    text
*----------------------------------------------------------------------*
FORM FRM_FILE_A1_UPLOAD_WS_EXITS  USING    PV_FILE CHANGING CV_FILE.
  DATA: LV_FILE   TYPE STRING.
  DATA: LV_RESULT.                               " 返回值为'X'时,文件存在

  CLEAR: LV_RESULT.
  LV_FILE = PV_FILE.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE                 = LV_FILE
    RECEIVING
      RESULT               = LV_RESULT
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      WRONG_PARAMETER      = 3
      NOT_SUPPORTED_BY_GUI = 4
      OTHERS               = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    IF LV_RESULT IS INITIAL.
      " 不存在
      MESSAGE S001(00) WITH 'File is not exits!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ELSE.
      " 存在
      CV_FILE = PV_FILE.
    ENDIF.
  ENDIF.

ENDFORM.                    "FRM_FILE_UPLOAD_WS_EXITS
*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_UPLOAD_WS_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_FIELD_TAB  text
*      -->PV_FILE       text
*      <--CV_FILE_SIZE  text
*----------------------------------------------------------------------*
FORM FRM_FILE_A2_UPLOAD_WS_ITAB  TABLES   PT_FIELD_TAB STRUCTURE SOLIX
                      USING    PV_FILE
                      CHANGING CV_FILE_SIZE.
  CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
*     CODEPAGE                      = ' '
      FILENAME                      = PV_FILE
      FILETYPE                      = 'BIN'
*     HEADLEN                       = ' '
*     LINE_EXIT                     = ' '
*     TRUNCLEN                      = ' '
*     USER_FORM                     = ' '
*     USER_PROG                     = ' '
*     DAT_D_FORMAT                  = ' '
    IMPORTING
      FILELENGTH                    = CV_FILE_SIZE
    TABLES
      DATA_TAB                      = PT_FIELD_TAB
*   EXCEPTIONS
*     CONVERSION_ERROR              = 1
*     FILE_OPEN_ERROR               = 2
*     FILE_READ_ERROR               = 3
*     INVALID_TYPE                  = 4
*     NO_BATCH                      = 5
*     UNKNOWN_ERROR                 = 6
*     INVALID_TABLE_WIDTH           = 7
*     GUI_REFUSE_FILETRANSFER       = 8
*     CUSTOMER_ERROR                = 9
*     NO_AUTHORITY                  = 10
*     OTHERS                        = 11
    .



ENDFORM.                    "FRM_FILE_UPLOAD_WS_ITAB
*&---------------------------------------------------------------------*
*&      Form  FRM_ZF4_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_ZF4_FILE .

  DATA:
    L_DESKTOP  TYPE STRING,
    L_I_FILES  TYPE FILETABLE WITH HEADER LINE,
    L_RCODE    TYPE INT4.
  DATA: L_ACTION TYPE I .

* Finding desktop
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
    CHANGING
      DESKTOP_DIRECTORY    = L_DESKTOP
    EXCEPTIONS
      CNTL_ERROR           = 1
      ERROR_NO_GUI         = 2
      NOT_SUPPORTED_BY_GUI = 3
      OTHERS               = 4.
  IF SY-SUBRC <> 0.
    MESSAGE E001(00) WITH
    'Desktop not found'.
  ENDIF.

* Update View
  CALL METHOD CL_GUI_CFW=>UPDATE_VIEW
    EXCEPTIONS
      CNTL_SYSTEM_ERROR = 1
      CNTL_ERROR        = 2
      OTHERS            = 3.

*  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
*    EXPORTING
**     WINDOW_TITLE            =
**     DEFAULT_EXTENSION       =
**     DEFAULT_FILENAME        =
**     FILE_FILTER             =
*      INITIAL_DIRECTORY       = 'd:temp'
*      MULTISELECTION          = 'X'
*    CHANGING
*      FILE_TABLE              = L_I_FILES[]
*      RC                      = L_RCODE  "打开文件的数量
**     USER_ACTION             =
*    EXCEPTIONS
*      FILE_OPEN_DIALOG_FAILED = 1
*      CNTL_ERROR              = 2
*      ERROR_NO_GUI            = 3
*      OTHERS                  = 4.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = 'Select Excel file'
      DEFAULT_EXTENSION       = '.xls'
      FILE_FILTER             = '.xls'
      INITIAL_DIRECTORY       = L_DESKTOP
      MULTISELECTION          = 'X'
    CHANGING
      FILE_TABLE              = L_I_FILES[]
      RC                      = L_RCODE
      USER_ACTION             = L_ACTION
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
    MESSAGE E001(00) WITH 'Error while opening file'.
  ENDIF.

  IF L_ACTION EQ 9 . " user cancelled selection
    EXIT .
  ENDIF.

  CLEAR: S_FILE[].
  IF L_I_FILES[] IS NOT INITIAL.
    LOOP AT L_I_FILES.
      S_FILE-SIGN = 'I'.
      S_FILE-OPTION = 'EQ'.
      S_FILE-LOW = L_I_FILES.
      APPEND S_FILE.
      CLEAR: S_FILE.
    ENDLOOP.
  ENDIF.
ENDFORM.                    "FRM_ZF4_FILE
*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_UPLOAD_ITAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PT_FIELD_TAB  text
*      -->PV_FILE_PATH  text
*      <--CV_FILE_PATH  text
*      <--CV_FILE_SIZE  text
*----------------------------------------------------------------------*
FORM FRM_FILE_A5_UPLOAD_ITAB  TABLES   PT_FIELD_TAB STRUCTURE SOLIX
                           USING    PV_FILE_PATH
                           CHANGING CV_FILE_PATH TYPE RLGRAP-FILENAME
                                    CV_FILE_SIZE.

  DATA: LV_FILE_PATH TYPE RLGRAP-FILENAME.
  DATA: LV_FILE_TYPE TYPE RLGRAP-FILETYPE.

  LV_FILE_PATH = PV_FILE_PATH.
  CV_FILE_SIZE = 0.

  CALL FUNCTION 'UPLOAD'
    EXPORTING
      FILENAME                = LV_FILE_PATH
      FILETYPE                = 'BIN'
    IMPORTING
      ACT_FILENAME            = CV_FILE_PATH
      ACT_FILETYPE            = LV_FILE_TYPE
      FILESIZE                = CV_FILE_SIZE
*     CANCEL                  =
    TABLES
      DATA_TAB                = PT_FIELD_TAB
    EXCEPTIONS
      CONVERSION_ERROR        = 1
      INVALID_TABLE_WIDTH     = 2
      INVALID_TYPE            = 3
      NO_BATCH                = 4
      UNKNOWN_ERROR           = 5
      GUI_REFUSE_FILETRANSFER = 6
      OTHERS                  = 7.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE 'E' NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    IF PT_FIELD_TAB[] IS INITIAL.
      " 未选中
      MESSAGE S001(00) WITH 'File is not Selected!' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

ENDFORM.                    "FRM_FILE_UPLOAD_ITAB
*&---------------------------------------------------------------------*
*&      Form  FRM_FILE_A7_UPLOAD_APPEND_SMF
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_PACK_TAB  text
*      -->P_GT_FIELD_TAB  text
*----------------------------------------------------------------------*
FORM FRM_FILE_A7_UPLOAD_APPEND_SMF  TABLES   PT_PACK_TAB STRUCTURE GT_PACK_TAB
                                             PT_FIELD_TAB STRUCTURE GT_FIELD_TAB.
  DATA: LT_RECORD     LIKE TABLE OF SOLIX.
  DATA: LV_FILE_DAT   TYPE XSTRING.
  DATA: LV_FILE_SIZE  TYPE I.
  DATA: L_TAB_LINES   TYPE I.


  DATA: LT_OTF TYPE TSFOTF WITH HEADER LINE.
  PERFORM FRM_SMART_OTF_TAB TABLES LT_OTF.

  PERFORM FRM_CONVERT_OTF_V22 TABLES LT_OTF LT_RECORD USING 'PDF' CHANGING LV_FILE_SIZE.


***set attachment name, count size*******************
  DESCRIBE TABLE LT_RECORD LINES L_TAB_LINES.

  GV_HEAD_SID  = GV_HEAD_SID + 1.
  GV_BODY_SIDA = GV_BODY_SID + 1.
  GV_BODY_SID  = GV_BODY_SID + L_TAB_LINES.


  PT_PACK_TAB-TRANSF_BIN = 'X'.
  PT_PACK_TAB-HEAD_START = GV_HEAD_SID.
  PT_PACK_TAB-HEAD_NUM   = 0.
  PT_PACK_TAB-BODY_START = GV_BODY_SIDA.
  PT_PACK_TAB-BODY_NUM   = L_TAB_LINES.
  PT_PACK_TAB-OBJ_NAME   = 'obj name'.
  PT_PACK_TAB-OBJ_DESCR  = '附件文件名2'.          " 附件文件名
  PT_PACK_TAB-DOC_TYPE   = 'PDF'.
  PT_PACK_TAB-DOC_SIZE   = LV_FILE_SIZE.          " l_doc_size.
  PT_PACK_TAB-OBJ_LANGU  = SY-LANGU.
  APPEND PT_PACK_TAB.
  CLEAR: PT_PACK_TAB.

*  GT_OBJ_HEAD = 'T001x.xls'.
*  APPEND GT_OBJ_HEAD.

  APPEND LINES OF LT_RECORD TO PT_FIELD_TAB.


*  "控制变量
*  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.                                     "邮件属性
*
*
*  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[].



*
*
*  "将转换后的文件添加到邮件附件
*  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'.                  "附件名称
*
*
*
** 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.
*


ENDFORM.                    " FRM_FILE_A7_UPLOAD_APPEND_SMF
*&---------------------------------------------------------------------*
*&      Form  FRM_SMART_OTF_TAB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_OTF  text
*----------------------------------------------------------------------*
FORM FRM_SMART_OTF_TAB  TABLES   PT_OTF TYPE TSFOTF.

  DATA: L_FNAME TYPE RS38L_FNAM.
  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME = 'Y_TEST_ABC_1'
    IMPORTING
      FM_NAME  = L_FNAME.
  DATA: L_OUTPUT_OPTIONS  TYPE SSFCOMPOP ,
        L_TMP_CONTROL_PAR LIKE SSFCTRLOP,
        L_JOB_OUTPUT_INFO TYPE SSFCRESCL  ,
        L_PRINTCOUNT TYPE I.
***以下设置打印预览功能***
****Smart Forms: 控制结构*****
  L_TMP_CONTROL_PAR-GETOTF        = 'X'. "这个参数一定要设:OTF 表的返回。无打印,显示或传真
*   L_TMP_CONTROL_PAR-PREVIEW       = 'X'.            "打印预览
  L_TMP_CONTROL_PAR-NO_DIALOG     = 'X'.            "必须设置
**  L_TMP_CONTROL_PAR-DEVICE        = 'PRINTER'.
****SAP Smart Forms: 智能写作器 (传输) 选项*****
  L_OUTPUT_OPTIONS-TDNOPREV  = 'X'.                      "是否打印预览,X 不预览。
  L_OUTPUT_OPTIONS-TDNOPRINT = 'X'.                      "没有打印输出,X 不显示。
  L_OUTPUT_OPTIONS-TDIMMED   = 'X'.                      "立即打印标志。
  L_OUTPUT_OPTIONS-TDIEXIT   = 'X'.                      "预览打印后直接退出
*  L_OUTPUT_OPTIONS-TDDEST    = 'RED_LOCAL'.              "假脱机,输出设备。

  DATA: LT_DATA TYPE TABLE OF T001 WITH HEADER LINE.
  SELECT  * INTO TABLE LT_DATA FROM T001 UP TO 10 ROWS.
  DATA: L_LINES TYPE I.
  DATA: G_C_X TYPE C VALUE 'X'.
  DESCRIBE TABLE LT_DATA LINES L_LINES.
  LOOP AT LT_DATA.
    CASE SY-TABIX.
      WHEN 1.
        L_TMP_CONTROL_PAR-NO_CLOSE = G_C_X.
        L_TMP_CONTROL_PAR-NO_OPEN  = SPACE.
      WHEN L_LINES.
        L_TMP_CONTROL_PAR-NO_CLOSE = SPACE.
        L_TMP_CONTROL_PAR-NO_OPEN  = G_C_X.
      WHEN OTHERS.
        L_TMP_CONTROL_PAR-NO_CLOSE = G_C_X.
        L_TMP_CONTROL_PAR-NO_OPEN  = G_C_X.
    ENDCASE.
    IF L_LINES = 1 .
      L_TMP_CONTROL_PAR-NO_CLOSE = SPACE.
      L_TMP_CONTROL_PAR-NO_OPEN  = SPACE.
    ENDIF.
    CALL FUNCTION L_FNAME
      EXPORTING
*   ARCHIVE_INDEX              =
*   ARCHIVE_INDEX_TAB          =
*   ARCHIVE_PARAMETERS         =
        CONTROL_PARAMETERS         = L_TMP_CONTROL_PAR
*   MAIL_APPL_OBJ              =
*   MAIL_RECIPIENT             =
*   MAIL_SENDER                =
        OUTPUT_OPTIONS             = L_OUTPUT_OPTIONS
*   USER_SETTINGS              = 'X'
     IMPORTING
*   DOCUMENT_OUTPUT_INFO       =
       JOB_OUTPUT_INFO            = L_JOB_OUTPUT_INFO
*   JOB_OUTPUT_OPTIONS         =
* EXCEPTIONS
*   FORMATTING_ERROR           = 1
*   INTERNAL_ERROR             = 2
*   SEND_ERROR                 = 3
*   USER_CANCELED              = 4
*   OTHERS                     = 5
              .
  ENDLOOP.

  PT_OTF[] = L_JOB_OUTPUT_INFO-OTFDATA[].

ENDFORM.                    " FRM_SMART_OTF_TAB
*&---------------------------------------------------------------------*
*&      Form  FRM_CONVERT_OTF_V22
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_LT_OTF  text
*      -->P_LT_RECORD  text
*      -->P_L_PDF  text
*      <--P_L_LEN  text
*----------------------------------------------------------------------*
FORM FRM_CONVERT_OTF_V22 TABLES   P_T_OTF TYPE TSFOTF
                                  PT_RECORD TYPE STANDARD TABLE
                         USING    PV_TYP
                         CHANGING P_L_LEN.
  DATA: LV_XSTR   TYPE XSTRING.
  DATA: LT_RECORD LIKE SOLIX OCCURS 0 WITH HEADER LINE.
  DATA: LT_LINES  TYPE TABLE OF TLINE WITH HEADER LINE..
  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = PV_TYP " 'PDF'
*     MAX_LINEWIDTH         = 132
*     ARCHIVE_INDEX         = ' '
*     COPYNUMBER            = 0
*     ASCII_BIDI_VIS2LOG    = ' '
    IMPORTING
      BIN_FILESIZE          = P_L_LEN
      BIN_FILE              = LV_XSTR
    TABLES
      OTF                   = P_T_OTF[]
      LINES                 = LT_LINES[]
    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.


  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER        = LV_XSTR
    IMPORTING
      OUTPUT_LENGTH = P_L_LEN
    TABLES
      BINARY_TAB    = LT_RECORD[].

  FIELD-SYMBOLS: <FS_DAT1> TYPE ANY.
  DATA: LV_STR1 TYPE STRING.
  FIELD-SYMBOLS: <FS_DAT2> TYPE ANY.
  DATA: LV_STR2 TYPE STRING.

  LV_STR1 = 'LT_RECORD[]'.
  ASSIGN (LV_STR1) TO <FS_DAT1>.
  LV_STR2 = 'PT_RECORD[]'.
  ASSIGN (LV_STR2) TO <FS_DAT2>.
  <FS_DAT2> = <FS_DAT1>.

ENDFORM.                    " FRM_CONVERT_OTF_V22

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值