너무 예전에 해봤고,
그만큼 자주 안하고,
그래서 할때마다 기억이 안나고,
눈금자와 노가다가 필수인
스마트하지 않은 스마트폼..
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.
DATA: LT_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
DATA: LV_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
DATA: LO_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_DOCUMENT( LO_DOC_BCS ).
*---------------------------------------------------------------------
*------------------------& Set Receiver *-------------------------
*---------------------------------------------------------------------
"수신처1
IF PS_HEADER-USR03 IS INITIAL.
"수신자의 이메일 주소가 공란입니다.
MESSAGE S000 WITH TEXT-M02 DISPLAY LIKE 'E'.
EXIT.
ELSE.
DATA(LV_RECEIVER) = PS_HEADER-USR03.
ENDIF.
* LO_RECEP = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS('meenii1201@gmail.com' ).
LO_RECEP = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( CONV AD_SMTPADR( LV_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_ADDRESS( CONV AD_SMTPADR( LV_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_RF) = PS_HEADER-USRID_E.
LO_RECEP = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( CONV AD_SMTPADR( LV_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.
'SAP > ABAP' 카테고리의 다른 글
Working Day 여부 체크 (계산)하는 함수 → DATE_CONVERT_TO_FACTORYDATE (0) | 2024.11.08 |
---|---|
Popup with One(Several) Input Field(s) & Confirmation Button (0) | 2024.07.11 |
SUBMIT (program) 시 ABAP Memory 사용하지 않고, 결과만 가져오기 (0) | 2024.04.11 |
SAP Customer Exit CLFM0002 (0) | 2023.08.01 |
Program 중복 실행 금지를 위한 Lock Object 처리 (0) | 2023.07.17 |