SAP/ABAP

스마트폼을 PDF 파일로 이메일에 첨부하기

Buggie 2024. 5. 9. 11:09

너무 예전에 해봤고,

그만큼 자주 안하고,

그래서 할때마다 기억이 안나고,

눈금자와 노가다가 필수인

스마트하지 않은 스마트폼..

 

Excel, Adobe Form, OZ Report 등 출력의 방법은 여러가지가 있지만..

개발하다보면, 원하지 않을지라도 출력물 양식 개발을 스마트폼으로 해야 하는 경우가 있다.

 

그리고,

화면에서 출력한 스마트폼 결과 양식을 이메일로 첨부하여 전송해야 하는 경우.

아래와 같이 하면 되겠다.

 

참고로 메일 전송하는 기능을 제공하는 표준 함수가 있는데,

SO_DOCUMENT_SEND_API1

SO_NEW_DOCUMENT_ATT_SEND_API1 

 

바로 전송하기 위해서

CL_DOCUMENT_BCS 클래스를 사용했다.


0. 변수 선언부

 

(Src)  

DATA: LV_FM_NAME TYPE RS38L_FNAM.

  DATA: CONTROL_PARAMETERS TYPE  SSFCTRLOP,
        OUTPUT_OPTIONS     TYPE  SSFCOMPOP.

  DATA: LT_OTFDATA         TYPE  SSFCRESCL,
        JOB_OUTPUT_OPTIONS TYPE  SSFCRESOP.

 

 

1. 스마트폼명 조회

 

(Src)

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME           'ZMM_PO_INT01'
    IMPORTING
      FM_NAME            LV_FM_NAME
    EXCEPTIONS
      NO_FORM            1
      NO_FUNCTION_MODULE 2
      OTHERS             3.

 

 

2. Control Parameter 에 아래와 같이 세팅을 추가로 해준다.

 

 

3. 스마트폼 호출

  - 포인트가 Importing 파라미터에 JOB_OUTPUT_INFO = LT_OTFDATA 부분이다

    (OTF 로 리턴받은 파일을 PDF 로 변환할 것이므로)

 

(Src)

  LOOP AT GT_HEADER INTO DATA(GS_HEADER).

    IF P_IFTYP 'P'.
      CONTROL_PARAMETERS-NO_OPEN  ABAP_TRUE.
      CONTROL_PARAMETERS-NO_CLOSE ABAP_TRUE.

      AT FIRST.
        CONTROL_PARAMETERS-NO_OPEN  ''.
      ENDAT.

      AT LAST.
        CONTROL_PARAMETERS-NO_CLOSE ''.
      ENDAT.

    ELSEIF P_IFTYP 'E'.
      "Control Parameters
      CONTROL_PARAMETERS-GETOTF 'X'.
      CONTROL_PARAMETERS-NO_DIALOG 'X'.
      CONTROL_PARAMETERS-PREVIEW SPACE.
    ENDIF.

* Execute Smartforms
    CALL FUNCTION LV_FM_NAME
      EXPORTING
        CONTROL_PARAMETERS CONTROL_PARAMETERS
        OUTPUT_OPTIONS     OUTPUT_OPTIONS
        IS_HEADER          GS_HEADER
      IMPORTING
        JOB_OUTPUT_INFO    LT_OTFDATA
        JOB_OUTPUT_OPTIONS JOB_OUTPUT_OPTIONS
      TABLES
        IT_ITEM            GT_ITEM
        IT_LINES           GT_LINES
      EXCEPTIONS
        FORMATTING_ERROR   1
        INTERNAL_ERROR     2
        SEND_ERROR         3
        USER_CANCELED      4
        OTHERS             5.

    "전송유형 E 일 때만 Email 전송
    IF P_IFTYP 'E'.
      PERFORM SEND_EMAIL TABLES LT_OTFDATA-OTFDATA
                          USING GS_HEADER.
    ENDIF.
  ENDLOOP.

 


4. OTF 를 PDF 형식으로 Conversion (XSTRING)

 

 

5. Xstring 을 Binary 형식으로 Conversion

 

6. E-Mail 양식 세팅

  6.1. 고정 본문 작성

 

  6.2. Create Object for Document (문서 오브젝트 생성) & 메일 Title 세팅

 

  6.3. 첨부파일 붙이기

 

  6.4. 메일 수신자/참조수신자 세팅

 

  6.5. 기타 세팅 및 전송

 

 

(Src)

FORM SEND_EMAIL  TABLES    PT_OTFDATA STRUCTURE ITCOO
                  USING    PS_HEADER STRUCTURE ZMMS01100.

  DATALT_OTF            TYPE STANDARD TABLE OF ITCOO,
        LT_PDF_TAB        TYPE STANDARD TABLE OF TLINE,
        LT_BINARY_CONTENT TYPE SOLIX_TAB,
        LT_TEXT           TYPE BCSY_TEXT.

  "Variables
  DATALV_BIN_FILESIZE TYPE SO_OBJ_LEN,
        LV_SENT_TO_ALL  TYPE OS_BOOLEAN,
        LV_BIN_XSTR     TYPE XSTRING,
        LV_FNAME        TYPE RS38L_FNAM,
        LV_STRING_TEXT  TYPE STRING.

  "Object References
  DATALO_BCS         TYPE REF TO CL_BCS,
        LO_DOC_BCS     TYPE REF TO CL_DOCUMENT_BCS,
        LO_RECEP       TYPE REF TO IF_RECIPIENT_BCS,
        LO_SAPUSER_BCS TYPE REF TO CL_SAPUSER_BCS,
        LO_CX_BCX      TYPE REF TO CX_BCS.


  LT_OTF[] PT_OTFDATA[].

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                'PDF'
    IMPORTING
      BIN_FILESIZE          LV_BIN_FILESIZE
      BIN_FILE              LV_BIN_XSTR
    TABLES
      OTF                   LT_OTF[]
      LINES                 LT_PDF_TAB[]
    EXCEPTIONS
      ERR_MAX_LINEWIDTH     1
      ERR_FORMAT            2
      ERR_CONV_NOT_POSSIBLE 3
      OTHERS                4.

*******Convert Xstring to binary*****************
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER     LV_BIN_XSTR
    TABLES
      BINARY_TAB LT_BINARY_CONTENT.


* 공급업체 계정그룹 조회
  SELECT SINGLE KTOKK
    FROM LFA1
   WHERE LIFNR @PS_HEADER-LIFNR
    INTO @DATA(LV_KTOKK).

  TRY.
* -------- create persistent send request ------------------------
      LO_BCS CL_BCS=>CREATE_PERSISTENT).

      CASE LV_KTOKK.
        WHEN '2100' OR '2300'.    "내자
          "First line
          CONCATENATE '안녕하세요.' CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LV_STRING_TEXT.
          APPEND LV_STRING_TEXT TO LT_TEXT.
          CLEAR LV_STRING_TEXT.

          "Second line
          CONCATENATE '첨부와 같이 구매 발주서를 전달하오니, 일정에 맞추어 납품 바랍니다.'
          CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LV_STRING_TEXT.
          APPEND LV_STRING_TEXT TO LT_TEXT.
          CLEAR LV_STRING_TEXT.

          "Third line
          APPEND '감사합니다.' TO LT_TEXT.

        WHEN '2200'.    "외자
          "First line
          CONCATENATE 'Hello.' CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LV_STRING_TEXT.
          APPEND LV_STRING_TEXT TO LT_TEXT.
          CLEAR LV_STRING_TEXT.

          "Second line
          CONCATENATE 'Thank you.'
          CL_ABAP_CHAR_UTILITIES=>NEWLINE INTO LV_STRING_TEXT.
          APPEND LV_STRING_TEXT TO LT_TEXT.

      ENDCASE.

*---------------------------------------------------------------------
*-----------------& Create object for Document *------------------------
*---------------------------------------------------------------------
      LO_DOC_BCS CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
                     I_TYPE 'RAW'
                     I_TEXT LT_TEXT[]     "본문
*                     i_length = '12'
                     I_SUBJECT 'XX 구매 발주서 송부합니다' )"Email 제목

*---------------------------------------------------------------------
*-----------------& Add attachment to document *----------------
*---------------------------------------------------------------------
* BCS expects document content here e.g. from document upload
      CALL METHOD LO_DOC_BCS->ADD_ATTACHMENT
        EXPORTING
          I_ATTACHMENT_TYPE    'PDF'
          I_ATTACHMENT_SIZE    LV_BIN_FILESIZE
          I_ATTACHMENT_SUBJECT '구매발주서'
          I_ATT_CONTENT_HEX    LT_BINARY_CONTENT.

* add document to send request
      CALL METHOD LO_BCS->SET_DOCUMENTLO_DOC_BCS ).

*---------------------------------------------------------------------
*------------------------& Set Receiver *-------------------------
*---------------------------------------------------------------------
      "수신처1
      IF PS_HEADER-USR03 IS INITIAL.
        "수신자의 이메일 주소가 공란입니다.
        MESSAGE S000 WITH TEXT-M02 DISPLAY LIKE 'E'.
        EXIT.
      ELSE.
        DATA(LV_RECEIVERPS_HEADER-USR03.
      ENDIF.

*      LO_RECEP = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS('meenii1201@gmail.com' ).
      LO_RECEP CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESSCONV AD_SMTPADRLV_RECEIVER ).

      "Add recipient with its respective attributes to send request
      CALL METHOD LO_BCS->ADD_RECIPIENT
        EXPORTING
          I_RECIPIENT LO_RECEP
          I_EXPRESS   'X'.

      "수신처2
      IF PS_HEADER-USR06 IS NOT INITIAL.
        LV_RECEIVER PS_HEADER-USR06.

        LO_RECEP CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESSCONV AD_SMTPADRLV_RECEIVER ).

        "Add recipient with its respective attributes to send request
        CALL METHOD LO_BCS->ADD_RECIPIENT
          EXPORTING
            I_RECIPIENT LO_RECEP
            I_EXPRESS   'X'.
      ENDIF.

      "참조처
      IF PS_HEADER-USRID_E IS NOT INITIAL.
        DATA(LV_RECEIVER_RFPS_HEADER-USRID_E.

        LO_RECEP CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESSCONV AD_SMTPADRLV_RECEIVER_RF ).

        "Add recipient with its respective attributes to send request
        CALL METHOD LO_BCS->ADD_RECIPIENT
          EXPORTING
            I_RECIPIENT LO_RECEP
            I_COPY      'X'
            I_EXPRESS   ''.
      ENDIF.

      "즉시 전송 Setting
      CALL METHOD LO_BCS->SET_SEND_IMMEDIATELY
        EXPORTING
          I_SEND_IMMEDIATELY 'X'.

*---------------------------------------------------------------------
*-----------------& Send the email *-----------------------------
*---------------------------------------------------------------------
      CALL METHOD LO_BCS->SEND(
        EXPORTING
          I_WITH_ERROR_SCREEN 'X'
        RECEIVING
          RESULT              LV_SENT_TO_ALL ).

      IF LV_SENT_TO_ALL IS NOT INITIAL.
        COMMIT WORK.
      ENDIF.

*---------------------------------------------------------------------
*-----------------& Exception Handling *------------------------
*---------------------------------------------------------------------
    CATCH CX_BCS INTO LO_CX_BCX.
      "Appropriate Exception Handling
      WRITE'Exception:'LO_CX_BCX->ERROR_TYPE.
  ENDTRY.