ABAP, BSP, WEBUI

[ABAP]스마트폼 E-mail 전송 관련 PDF 변환 등

마징가07 2015. 4. 3. 15:59

출처 :

http://www.erpschool.net/yc4/bbs/board.php?bo_table=BBS_INVENT&wr_id=147

 

예제1)
자꾸 까먹어서 -ㅡㅡ
맨아래쪽에 메인 전송

*&---------------------------------------------------------------------*
*&      Form  EXECUTE_ACROBAT
*&---------------------------------------------------------------------*
*      text PDF로 변환
*----------------------------------------------------------------------*
FORM EXECUTE_ACROBAT .

  CLEAR : OTF_TAB,  OTF_TAB[],    PDF_TABLE,    PDF_TABLE[],
          PDF_FSIZE, PDF_LINE_TAB, PDF_LINE_TAB[],
          PDF_XFILE.

**  CALL FUNCTION 'SSFCOMP_PDF_PREVIEW'
**    EXPORTING
**      I_OTF                    = JOB_OUTPUT_INFO-OTFDATA[]
**    EXCEPTIONS
**      CONVERT_OTF_TO_PDF_ERROR = 1
**      CNTL_ERROR              = 2
**      OTHERS                  = 3.
**
  OTF_TAB[] = JOB_OUTPUT_INFO-OTFDATA[].

  CALL FUNCTION 'CONVERT_OTF'
    EXPORTING
      FORMAT                = 'PDF'
    IMPORTING
      BIN_FILESIZE          = PDF_FSIZE
      BIN_FILE              = PDF_XFILE
    TABLES
      OTF                  = OTF_TAB
      LINES                = PDF_TABLE
    EXCEPTIONS
      ERR_MAX_LINEWIDTH    = 1
      ERR_FORMAT            = 2
      ERR_CONV_NOT_POSSIBLE = 3
      ERR_BAD_OTF          = 4
      OTHERS                = 5.

  IF SY-SUBRC <> 0.
    GV_ERR  =  'E'.
    EXIT.
  ENDIF.

*  PDF_LINE_TAB[] = PDF_TABLE[].


ENDFORM.                    " EXECUTE_ACROBAT


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_SMARTFORM
*&---------------------------------------------------------------------*
*      text 스마트 폼 조회
*----------------------------------------------------------------------*
FORM DISPLAY_SMARTFORM .

  DATA : L_FORM  TYPE  TDSFNAME  ,  " FORM NAME
        L_FNAME  TYPE  RS38L_FNAM .  " FUNCTION NAME
  DATA : L_I01    TYPE  SY-TABIX  ,
        L_S01    TYPE  SY-TABIX  ,
        L_E01    TYPE  SY-TABIX  .

  CLEAR : JOB_OUTPUT_INFO ,  JOB_OUTPUT_OPTIONS.

  PERFORM OUTPUT_SETTTING  USING  OUTPUT_OPTION.
  PERFORM CONTROL_SETTING  USING  CONTROL_PARA.

  CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
    EXPORTING
      FORMNAME          = C_FORM    "스마트폼이름
    IMPORTING
      FM_NAME            = L_FNAME  " 펑션이름
    EXCEPTIONS
      NO_FORM            = 1
      NO_FUNCTION_MODULE = 2
      OTHERS            = 3.
  IF SY-SUBRC <> 0.
    GV_ERR  =  'E'.
    EXIT.
  ENDIF.

*  Smart Forms 호출.
  CALL FUNCTION L_FNAME
    EXPORTING
      CONTROL_PARAMETERS = CONTROL_PARA
      OUTPUT_OPTIONS    = OUTPUT_OPTION
      USER_SETTINGS      = ' '
      I_HEADER          = IT_HEADER_SMART
    IMPORTING
      JOB_OUTPUT_OPTIONS = JOB_OUTPUT_OPTIONS
      JOB_OUTPUT_INFO    = JOB_OUTPUT_INFO
    TABLES
      T_ITEM            = IT_ITEM_SMART
    EXCEPTIONS
      FORMATTING_ERROR  = 1
      INTERNAL_ERROR    = 2
      SEND_ERROR        = 3
      USER_CANCELED      = 4
      OTHERS            = 5.

  IF SY-SUBRC <> 0.
    GV_ERR  =  'E'.
    EXIT.
  ENDIF.

ENDFORM.                    " DISPLAY_SMARTFORM



FUNCTION ZMM_PO_PDF_SEND .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"    REFERENCE(I_EBELN) TYPE  ZUSMM_PONO
*"  EXCEPTIONS
*"      INVALID_PO_NO
*"      SMARTFORM_ERROR
*"      PDF_ERROR
*"      SEND_ERROR
*"      ADDRESS_ERROR
*"----------------------------------------------------------------------
* 발주서를 pdf형식으로 변환하여 이메일에 첨부한다
* 한개 또는 복수개의 발주서를 첨부가능하다.
*-----------------------------------------------------------------------
*
  DATA: LV_EBELN TYPE EBELN.
  DATA: BEGIN OF  LT_ATTACH    OCCURS 0,
          ATTSUBJECT    LIKE  GV_ATTSUBJECT,
          DATA          TYPE  XSTRING,
        END  OF  LT_ATTACH.
  DATA :  LS_DATA      TYPE  TLINE,
          LV_BUFFER    TYPE  STRING,
          LV_LINES      TYPE  I,
          LV_SIZE      TYPE  SOOD-OBJLEN,
          GS_SOLIX            TYPE SOLIX,
          G_XFILE_LENGTH      TYPE I,
          G_I                  TYPE I.

  CHECK I_EBELN[] IS NOT INITIAL.

  SELECT SINGLE CLNT  INTO GV_CLIENT
    FROM ZUSEREXIT01
  WHERE BUKRS  =  'NT10'.

  CLEAR :  GV_ERR, GT_ATTNAME, GT_ATTNAME[].

  LOOP  AT  I_EBELN  INTO  LV_EBELN.
    CLEAR  :  GV_SUBJECT,    GV_ATTSUBJECT.  "attach 파일명
    PERFORM  MAKE_GDATA    USING  LV_EBELN.

    IF GV_ERR  IS  NOT INITIAL.
      RAISE  INVALID_PO_NO.
    ENDIF.

    PERFORM    EDIT_DATA_SMART.

*  스마트폼 실행
    PERFORM    DISPLAY_SMARTFORM.
    IF GV_ERR  IS  NOT INITIAL.
      RAISE  SMARTFORM_ERROR.
    ENDIF.

*  pdf파일로 변환
    PERFORM EXECUTE_ACROBAT.
    IF GV_ERR  IS  NOT INITIAL.
      RAISE  PDF_ERROR.
    ENDIF.

*  attach 파일 준비
    CLEAR :  LT_ATTACH,  GT_ATTNAME.
    LT_ATTACH-ATTSUBJECT  =  GV_ATTSUBJECT.
    LT_ATTACH-DATA        =  PDF_XFILE.
    APPEND    LT_ATTACH.

    GT_ATTNAME-ATTSUBJECT  =  GV_ATTSUBJECT.
    APPEND    GT_ATTNAME.
  ENDLOOP.

  TRY.
      CLEAR SEND_REQUEST.
      SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

*    본문 만들기
      PERFORM  MAKE_MAIL_BODY.

      LOOP AT LT_ATTACH.
        REFRESH CONT_HEX.
        CLEAR : G_XFILE_LENGTH, GS_SOLIX.
        G_XFILE_LENGTH = XSTRLEN( LT_ATTACH-DATA ).
        G_I = 0.
        WHILE G_I          <    G_XFILE_LENGTH.
          GS_SOLIX-LINE    =    LT_ATTACH-DATA+G_I.
          APPEND GS_SOLIX TO    CONT_HEX.
          G_I = G_I + 255.
        ENDWHILE.

        CALL METHOD DOCUMENT2->ADD_ATTACHMENT
          EXPORTING
            I_ATTACHMENT_SIZE    = LV_SIZE
            I_ATTACHMENT_TYPE    = 'PDF'
            I_ATTACHMENT_SUBJECT = LT_ATTACH-ATTSUBJECT
*            I_ATT_CONTENT_TEXT  = CONT_TEXT.
            I_ATT_CONTENT_HEX    = CONT_HEX.
      ENDLOOP.

      CALL METHOD SEND_REQUEST->SET_DOCUMENT( DOCUMENT2 ).

      CLEAR      GV_ERR.
      PERFORM    RECEIVER_MAKE.
      IF GV_ERR  IS  NOT INITIAL.
        RAISE    ADDRESS_ERROR.
      ENDIF.

*    ---------- send document ---------------------------------------
      SEND_REQUEST->SEND_REQUEST->SET_LINK_TO_OUTBOX( 'X' ).
      SEND_REQUEST->SET_SEND_IMMEDIATELY( 'X' ).

      CALL METHOD SEND_REQUEST->SEND(
        EXPORTING
          I_WITH_ERROR_SCREEN = 'X'
        RECEIVING
          RESULT              = SENT_TO_ALL ).
      IF SENT_TO_ALL = 'X'.
      ENDIF.

      COMMIT WORK.
* -----------------------------------------------------------
* *                    exception handling
* -----------------------------------------------------------
    CATCH CX_BCS INTO BCS_EXCEPTION.
      RAISE SEND_ERROR.
  ENDTRY.

ENDFUNCTION.








예제2)

*&---------------------------------------------------------------------*
*&      Form  MAIL_SEND_PER_SADOC
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
FORM MAIL_SEND_PER_SADOC  USING PS_MARK  TYPE  ZUSIMS0020.
*  참조 메일 주소
  DATA: LT_ADDR        LIKE TABLE OF ZUSMMT0011  WITH HEADER LINE.
  DATA: LV_RECEIVE    TYPE ADR6-SMTP_ADDR,
        LV_ONE(300).

*  받는 사람
  LOOP AT IT_CUST_EMAIL WHERE KUNNR  =  PS_MARK-KUNNR
                          AND ZUSE  = 'X'.
    CLEAR GS_RECIPIENTS.  "수신
    GS_RECIPIENTS-C_ADDRESS = IT_CUST_EMAIL-EMAIL.
    GS_RECIPIENTS-I_EXPRESS = 'X'.
    APPEND GS_RECIPIENTS TO G_RECIPIENTS.
  ENDLOOP.

*    --------- add recipient (e-mail address) -----------------------
  SELECT  *  INTO  TABLE  LT_ADDR
    FROM  ZUSMMT0011
  WHERE  ZINACT  = ' '
    AND  ( ZPGM  = ' ' OR ZPGM = 'S' ).

  SORT LT_ADDR  BY ZGUBUN ZSEQ.
  LOOP AT LT_ADDR.        "모두 참조
    CLEAR GS_RECIPIENTS.
    GS_RECIPIENTS-C_ADDRESS = LT_ADDR-ZMAIL.
    GS_RECIPIENTS-I_EXPRESS = 'X'.
    GS_RECIPIENTS-I_COPY    = 'X'.
    APPEND GS_RECIPIENTS TO G_RECIPIENTS.
  ENDLOOP.

* 담당영업사원
  LOOP AT IT_S_MAIL.        "모두 참조
    CLEAR GS_RECIPIENTS.
    GS_RECIPIENTS-C_ADDRESS = IT_S_MAIL-SALESMAN_MAIL.
    GS_RECIPIENTS-I_EXPRESS = 'X'.
    GS_RECIPIENTS-I_COPY    = 'X'.
    APPEND GS_RECIPIENTS TO G_RECIPIENTS.
  ENDLOOP.


  G_SUNAME  =  SY-UNAME.

  CALL FUNCTION 'ZMM_SEND_DOCUMAIL'
    EXPORTING
      REQUESTED_STATUS = 'E'
      DOCUMENTS        = G_DOCUMENTS
      RECIPIENTS      = G_RECIPIENTS
      SUNAME          = G_SUNAME
      SADDRESS        = G_SADDRESS
    IMPORTING
      RETURN          = G_RETURN
    EXCEPTIONS
      NO_SEND_MAIL    = 1
      OTHERS          = 2.

  IF SY-SUBRC = 0.
*  메일성공시 전송기록
    UPDATE ZUSIMT0032  SET ESTATUS =  'X'
                          EDATE  =  SY-DATLO
    WHERE  KUNNR  =  PS_MARK-KUNNR
      AND  SADOC  =  PS_MARK-SADOC.

    LOOP AT IT_LIST  WHERE KUNNR  =  PS_MARK-KUNNR
                      AND SADOC  =  PS_MARK-SADOC.
      IT_LIST-ESTATUS  =  'X'.
      MODIFY  IT_LIST.
    ENDLOOP.

  ELSE.
    GV_ERR = 'E'.
  ENDIF.

ENDFORM.                    " MAIL_SEND_PER_SADOC
*&---------------------------------------------------------------------*
*&      Form  INIT_MAIL_VARIABLE
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
FORM INIT_MAIL_VARIABLE .

  REFRESH : G_DOCUMENTS,  G_RECIPIENTS.
  CLEAR :  G_DOCUMENTS,  G_RECIPIENTS,
            GS_DOCUMENTS, GS_RECIPIENTS,
            G_SUNAME,    G_SADDRESS,
            GS_DOCUMENTS-CONTENT_TEXT[],
            GS_DOCUMENTS-CONTENT_HEX[],
            IT_S_MAIL, IT_S_MAIL[],
            G_RETURN.

  CLEAR :  GV_PKNO,  GV_CBNO.

ENDFORM.                    " INIT_MAIL_VARIABLE





FUNCTION ZMM_SEND_DOCUMAIL.
*"--------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"    REFERENCE(REQUESTED_STATUS) TYPE  BCS_RQST DEFAULT 'E'
*"    REFERENCE(DOCUMENTS) TYPE  ZHREX_DOCUMENTS
*"    REFERENCE(RECIPIENTS) TYPE  ZHREX_RECIPIENTS
*"    REFERENCE(SUNAME) TYPE  UNAME DEFAULT SY-UNAME
*"    REFERENCE(SADDRESS) TYPE  ADR6-SMTP_ADDR OPTIONAL
*"  EXPORTING
*"    REFERENCE(RETURN) TYPE  BAPIRETURN-TYPE
*"  EXCEPTIONS
*"      NO_SEND_MAIL
*"--------------------------------------------------------------------
* 2008.07. 시스템 초기 발주서 이메일 전송처리 기능 (사용안함)
*----------------------------------------------------------------------*
* CLASS-DEFINITIONS                                                    *
*----------------------------------------------------------------------*
* Global data declarations
  DATA: send_request      TYPE REF TO cl_bcs              ,
        document          TYPE REF TO cl_document_bcs    ,
        recipient          TYPE REF TO if_recipient_bcs    ,
        exception_info    TYPE REF TO if_os_exception_info,
        bcs_exception      TYPE REF TO cx_bcs              ,
        sender            TYPE REF TO if_sender_bcs      .

*----------------------------------------------------------------------*
* INTERNAL TABLES                                                      *
*----------------------------------------------------------------------*
  DATA: l_mailtext        TYPE soli_tab                            ,
        l_mailhex          TYPE solix_tab                          ,
        iaddsmtp          TYPE bapiadsmtp OCCURS 0 WITH HEADER LINE,
        ireturn            TYPE bapiret2  OCCURS 0 WITH HEADER LINE.

*----------------------------------------------------------------------*
* VARIABLES                                                            *
*----------------------------------------------------------------------*
  DATA: mail_line          LIKE LINE OF l_mailtext    ,
        mailx_line        LIKE LINE OF l_mailhex    ,
        bapiadsmtp        TYPE bapiadsmtp            ,
        att_line          TYPE so_obj_len            ,
        nexen_domain(14)  TYPE c VALUE '@nexen.co.kr'.

*----------------------------------------------------------------------*
* CONSTANTS                                                            *
*----------------------------------------------------------------------*
  CLASS cl_cam_address_bcs    DEFINITION LOAD.
  CLASS cl_abap_char_utilities DEFINITION LOAD.

  TRY.
* 1. Create persistent send request
      send_request = cl_bcs=>create_persistent( ).

      DATA: first(1) TYPE c.
      CLEAR first.
      DATA: documents_line LIKE LINE OF documents.

      LOOP AT documents INTO documents_line.
        IF first IS INITIAL.
          MOVE 'X' TO first.
* 2. Build the Main Document

          IF documents_line-content_hex[] IS INITIAL.
            document = cl_document_bcs=>create_document(
                                i_type    = documents_line-type
                                i_text    = documents_line-content_text
                                i_subject = documents_line-subject ).
          ELSE.
            document = cl_document_bcs=>create_document(
                                i_type    = documents_line-type
                                i_hex    = documents_line-content_hex
                                i_subject = documents_line-subject ).
          ENDIF.
        ELSE.
          IF documents_line-content_hex[] IS INITIAL.
* 3. Add Attachment
            CALL METHOD document->add_attachment
              EXPORTING
                i_attachment_type    = documents_line-type
                i_attachment_subject = documents_line-subject
                i_att_content_text  = documents_line-content_text.
          ELSE.
            CALL METHOD document->add_attachment
              EXPORTING
                i_attachment_type    = documents_line-type
                i_attachment_subject = documents_line-subject
                i_att_content_hex    = documents_line-content_hex.
          ENDIF.
        ENDIF.
      ENDLOOP.


* 4. Add document to send request
      CALL METHOD send_request->set_document( document ).

* 5. Get sender object
      IF saddress IS INITIAL.
        sender ?= cl_sapuser_bcs=>create( suname ).
      ELSE.  "일반 EMAIL 주소제시할 때

        DATA : i_address TYPE adr6-smtp_addr,
              i_name    TYPE adr6-smtp_addr.

        i_address = saddress.
        i_name    = suname.
        CALL METHOD cl_cam_address_bcs=>create_internet_address
          EXPORTING
            i_address_string = i_address
            i_address_name  = i_name
          RECEIVING
            result          = sender.
      ENDIF.

*    Add sender
      CALL METHOD send_request->set_sender
        EXPORTING
          i_sender = sender.

* 6. Create recipient
      DATA: recipients_line LIKE LINE OF recipients.

      LOOP AT recipients INTO recipients_line.
        IF recipients_line-c_address IS INITIAL.
          CLEAR iaddsmtp.
          REFRESH iaddsmtp.
          CLEAR bapiadsmtp.
          CLEAR recipient.
*    Read the E-Mail address for the user
          CALL FUNCTION 'BAPI_USER_GET_DETAIL'
            EXPORTING
              username = recipients_line-uname
            TABLES
              return  = ireturn
              addsmtp  = iaddsmtp.
          LOOP AT iaddsmtp WHERE std_no = 'X'.
            CLEAR bapiadsmtp.
            MOVE iaddsmtp TO bapiadsmtp.
          ENDLOOP.
*    If no E-mail address was found, create one.
          IF bapiadsmtp-e_mail = ''.
            CONCATENATE recipients_line-uname nexen_domain
                      INTO recipients_line-c_address.
          ELSE.
            MOVE bapiadsmtp-e_mail TO recipients_line-c_address.
          ENDIF.
        ENDIF.

        recipient = cl_cam_address_bcs=>create_internet_address(
                                      recipients_line-c_address ).

* Add recipient with its respective attributes to send request
        CALL METHOD send_request->add_recipient
          EXPORTING
            i_recipient  = recipient
            i_express    = recipients_line-i_express
            i_copy      = recipients_line-i_copy
            i_blind_copy = recipients_line-i_blind_copy
            i_no_forward = recipients_line-i_no_foward.

      ENDLOOP.

* 7. Set that you don't need a Return Status E-mail
      DATA: status_mail TYPE bcs_stml.
      status_mail = requested_status.
      CALL METHOD send_request->set_status_attributes
        EXPORTING
          i_requested_status = requested_status
          i_status_mail      = status_mail.

* 8. set send immediately flag
      send_request->set_send_immediately( 'X' ).

* 9. Send document
      DATA: send_to_all          TYPE os_boolean,
            recipients_with_error TYPE bcsy_re,
            orig_recs_with_error  TYPE bcsy_ercp.

      CALL METHOD send_request->send(
        EXPORTING
          i_with_error_screen = 'X'
        RECEIVING
          result              = send_to_all ).
      IF send_to_all NE 'X'.
        RAISE no_send_mail.
      ELSE.

        COMMIT WORK.
        IF sy-subrc <> 0.
          RAISE no_send_mail.
        ELSE.
          return = 'S'.
        ENDIF.
      ENDIF.

    CATCH cx_bcs INTO bcs_exception.
      RAISE no_send_mail.
  ENDTRY.
ENDFUNCTION.

IMPORT
REQUESTED_STATUS TYPE BCS_RQST 'E' Requested Status
DOCUMENTS TYPE ZHREX_DOCUMENTS                     E-MAIL - DOCUMENTS
RECIPIENTS TYPE ZHREX_RECIPIENTS                     E-MAIL - RECIPIENTS
SUNAME TYPE UNAME SY-UNAME User Name
SADDRESS TYPE ADR6-SMTP_ADDR                     E-Mail Address

EXPORT
RETURN TYPE BAPIRETURN-TYPE

EXCEPTION
NO_SEND_MAIL


  CALL FUNCTION 'ZMM_SEND_DOCUMAIL'
    EXPORTING
      REQUESTED_STATUS = 'E'
      DOCUMENTS        = G_DOCUMENTS
      RECIPIENTS      = G_RECIPIENTS
      SUNAME          = G_SUNAME
      SADDRESS        = G_SADDRESS
    IMPORTING
      RETURN          = G_RETURN
    EXCEPTIONS
      NO_SEND_MAIL    = 1
      OTHERS          = 2.

CC 는 구조체에 마킹으로 전송


이메일 전송 베이스는 SO_NEW_DOCUMENT_SEND_API1 펑션임