Background Job 주기 설정하다가 시행착오를 너무 많이 겪어서 글을 남기기로 함..
일단 내용은 고객들중 계약 효력종료일이 60일 이하로 남은 고객에게 일주일 단위로 경고 메일을 전송하는 비지니스 상황이다.
우선 아래와 같이
Background job 생성 > E-mail전송 프로그램 실행 > Background job 종료
순서대로 코딩을 해주었다. (60일 이하 남은 고객 선정은 현재 포스팅에서 제외)
소스코드 ▼
DATA: LV_BP_ADDR TYPE ADR6-SMTP_ADDR,
LV_OD_ADDR TYPE ADR6-SMTP_ADDR.
" BP 사원코드의 이메일 주소 발췌
READ TABLE XVBPA WITH KEY PARVW = 'VE'.
IF SY-SUBRC = 0.
SELECT SINGLE B~SMTP_ADDR
INTO LV_BP_ADDR
FROM BUT020 AS A INNER JOIN ADR6 AS B
ON A~ADDRNUMBER = B~ADDRNUMBER
WHERE A~PARTNER = XVBPA-KUNNR.
ENDIF.
" 판매오더 생성ID의 이메일 주소 발췌
SELECT SINGLE B~SMTP_ADDR
INTO LV_OD_ADDR
FROM USR21 AS A INNER JOIN ADR6 AS B ON A~ADDRNUMBER = B~ADDRNUMBER
AND A~PERSNUMBER = B~PERSNUMBER
WHERE A~BNAME = SY-UNAME.
DATA: LV_NUMBER TYPE TBTCJOB-JOBCOUNT,
LV_NAME TYPE TBTCJOB-JOBNAME.
" 백그라운드 잡 이름
CONCATENATE 'ZSDCONT_EMAIL_' SY-DATLO '_' SY-TIMLO
INTO LV_NAME.
CALL FUNCTION 'JOB_OPEN'
EXPORTING
JOBNAME = LV_NAME
IMPORTING
JOBCOUNT = LV_NUMBER
EXCEPTIONS
CANT_CREATE_JOB = 1
INVALID_JOB_DATA = 2
JOBNAME_MISSING = 3
OTHERS = 4.
CHECK SY-SUBRC = 0.
" BP사원, 판매오더 생성자로 수신자 설정
DATA: LT_PARA TYPE TABLE OF RSPARAMS.
LT_PARA = VALUE #(
( SELNAME = 'S_RECEIV'
KIND = 'S'
SIGN = 'I'
OPTION = 'EQ'
LOW = LV_BP_ADDR )
( SELNAME = 'S_RECEIV'
KIND = 'S'
SIGN = 'I'
OPTION = 'EQ'
LOW = LV_OD_ADDR )
).
" E-mail 전송 프로그램
" Parameter로 PO번호를 던져주고 Select-Options로 수신자를 던져주었다.
SUBMIT ZSDR9000 WITH P_CTNO = LS_ZSDT9997-ZCONTRACT_NO
WITH SELECTION-TABLE LT_PARA
USER SY-UNAME
VIA JOB LV_NAME NUMBER LV_NUMBER
AND RETURN.
DATA: LV_STRTDATE TYPE BTCSDATE,
LV_STRTTIME TYPE BTCLSTIME,
LV_LASTDATE TYPE BTCLSDATE,
LV_LASTTIME TYPE BTCLSTIME.
" 시작일과 시작시간을 현재로 하면 펑션 내부에서 즉시로 바뀌고 LASTDATE 적용 안 됨 > +5초 적용
" 마지막 통지일은 해당 고객의 효력종료일
LV_STRTDATE = SY-DATLO.
LV_STRTTIME = SY-TIMLO + 5.
LV_LASTDATE = LS_ZSDT9997-DATBI.
LV_LASTTIME = '010000'.
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
JOBCOUNT = LV_NUMBER
JOBNAME = LV_NAME
* STRTIMMED = 'X'
PRDWEEKS = '01' "일주일 단위 Background Job
* PRDDAYS = '1'
* PRDMINS = '1'
SDLSTRTDT = LV_STRTDATE
SDLSTRTTM = LV_STRTTIME
LASTSTRTDT = LV_LASTDATE
LASTSTRTTM = LV_LASTTIME
EXCEPTIONS
CANT_START_IMMEDIATE = 1
INVALID_STARTDATE = 2
JOBNAME_MISSING = 3
JOB_CLOSE_FAILED = 4
JOB_NOSTEPS = 5
JOB_NOTEX = 6
LOCK_FAILED = 7
OTHERS = 8.
** E-mail 전송 프로그램
REPORT ZSDR9000.
TABLES: SOMLRECI1.
PARAMETERS: P_CTNO TYPE ZSDT9997-ZCONTRACT_NO.
SELECT-OPTIONS: S_RECEIV FOR SOMLRECI1-RECEIVER.
CONSTANTS: CON_CRET TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF.
DATA: W_DOC_DATA LIKE SODOCCHGI1,
T_PACKING_LIST LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER
LINE,
T_ATTACHMENT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
IT_MESSAGE LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
T_RECEIVERS LIKE SOMLRECI1 OCCURS 0 WITH HEADER
LINE.
DATA: BEGIN OF ITAB OCCURS 0, "Excel로 될 Internal Table
NAME(10) TYPE C,
SEX(4) TYPE C,
END OF ITAB.
*ITAB-NAME = 'Yuanhailin'.ITAB-SEX = 'Boy'.APPEND ITAB.
*ITAB-NAME = 'Wondergirl'.ITAB-SEX = 'Girl'.APPEND ITAB.
*CONCATENATE 'MANE' 'SEX ' INTO T_ATTACHMENT SEPARATED BY ','.
*APPEND T_ATTACHMENT.
LOOP AT ITAB.
CONCATENATE ITAB-NAME ITAB-SEX INTO T_ATTACHMENT SEPARATED BY ','.
CONCATENATE CON_CRET T_ATTACHMENT INTO T_ATTACHMENT.
APPEND T_ATTACHMENT.
ENDLOOP.
" 메일 내용 첫번째 줄
IT_MESSAGE = '안녕하세요.'.
APPEND IT_MESSAGE.
" 메일 내용 두번째 줄
CONCATENATE P_CTNO '의 만기일이 도래하였습니다. 확인바랍니다.' INTO IT_MESSAGE.
APPEND IT_MESSAGE.
W_DOC_DATA-DOC_SIZE = STRLEN( T_ATTACHMENT ).
W_DOC_DATA-OBJ_LANGU = SY-LANGU.
W_DOC_DATA-OBJ_NAME = 'SAPRPT'.
W_DOC_DATA-OBJ_DESCR = '계약기간 만기일 도래 안내 메일입니다. '. " 메일 제목
W_DOC_DATA-SENSITIVTY = 'F'.
T_PACKING_LIST-TRANSF_BIN = SPACE.
T_PACKING_LIST-HEAD_START = 1.
T_PACKING_LIST-HEAD_NUM = 0.
T_PACKING_LIST-BODY_START = 1.
DESCRIBE TABLE IT_MESSAGE LINES T_PACKING_LIST-BODY_NUM.
T_PACKING_LIST-DOC_TYPE = 'RAW'.
APPEND T_PACKING_LIST.
*T_PACKING_LIST-TRANSF_BIN = 'X'.
*T_PACKING_LIST-HEAD_START = 1.
*T_PACKING_LIST-HEAD_NUM = 1.
*T_PACKING_LIST-BODY_START = 1.
*DESCRIBE TABLE T_ATTACHMENT LINES T_PACKING_LIST-BODY_NUM.
*T_PACKING_LIST-DOC_TYPE = 'CSV'.
*T_PACKING_LIST-OBJ_DESCR = '첨부파일 이름 입니다'.
*T_PACKING_LIST-DOC_SIZE = T_PACKING_LIST-BODY_NUM * 255.
*APPEND T_PACKING_LIST.
"수신자 2인 이상 설정
LOOP AT S_RECEIV .
T_RECEIVERS-RECEIVER = S_RECEIV-LOW.
T_RECEIVERS-REC_TYPE = 'U'.
T_RECEIVERS-COM_TYPE = 'INT'.
T_RECEIVERS-NOTIF_DEL = 'X'.
T_RECEIVERS-NOTIF_NDEL = 'X'.
APPEND T_RECEIVERS.
ENDLOOP.
DATA : SENDER_TYPE TYPE SOEXTRECI1-ADR_TYP.
SENDER_TYPE = 'INT'.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
DOCUMENT_DATA = W_DOC_DATA "메일 속성에관한 Structure
PUT_IN_OUTBOX = 'X' "발신함 저장여부
COMMIT_WORK = 'X' "Process 진행여부
SENDER_ADDRESS = 'MESSAGE@~~~~.COM' " 여러분들 시스템에 맞게 송신자 주소 입력
SENDER_ADDRESS_TYPE = SENDER_TYPE
TABLES
PACKING_LIST = T_PACKING_LIST "파일 속성에관한 Internal Table
* CONTENTS_BIN = T_ATTACHMENT "첨부파일 내용으로 되는
CONTENTS_TXT = IT_MESSAGE "메일 본문 내용
RECEIVERS = T_RECEIVERS. "수신자 속성에관한 Internal
WAIT UP TO 2 SECONDS.
SUBMIT RSCONN01 WITH MODE = 'INT'.
* WITH OUTPUT = 'X'.
빨간 글씨로 쓴 부분이 이 포스팅의 핵심!!!
처음에는 LASTSTRTDT, LASTSTRTTM 값을 넣고 코딩을해서 Background Job을 만들었을 때도 아래 네모 박스에 값이 계속 안들어와서 도대체 뭐가 문제인지 계속 해맸다.▼

결국 'JOB_CLOSE' 펑션을 디버깅 해 본 결과 SDLSTRTDT, SDLSTRTTM 변수에 현재 일자와 현재시각을 코딩하면 해당 값 들이 전부 초기화가 되고 즉시 실행으로 바뀌어버림...
그래서 코딩으로 현재 시간에서 +5초를 더해줘서 시작시간으로 바꾸었다. 그러면 해당 펑션을 타면서 즉시로 바뀌지 않음!
아무튼, 진작에 스탠다드 펑션 디버깅을 했으면 오래 안걸렸을텐데, 그게 하기 싫어서 너무 오랜 시간을 허비했다.
다른분들은 이런일 없기를 바라면서 포스팅을 마침
끝.
'ABAP' 카테고리의 다른 글
| ALV Grid에서 Screen 스크롤이 무한정 내려갈 때 해결 (0) | 2023.07.06 |
|---|---|
| 1000번 화면 F4 Search help (0) | 2023.07.06 |
| Internal Table 속성에 맞게 Field Catalog 설정하기 (0) | 2023.07.06 |
| User-exit 수정하다가 SQL error 발생(Fixed point arithmetic) (0) | 2023.06.21 |
| ALV Grid에서 선택한 데이터 가져오기 (0) | 2021.12.03 |