본문 바로가기

ABAP

Background Job Function 주기 코딩

반응형

Background Job 주기 설정하다가 시행착오를 너무 많이 겪어서 글을 남기기로 함..

 

일단 내용은 고객들중 계약 효력종료일이 60일 이하로 남은 고객에게 일주일 단위로 경고 메일을 전송하는 비지니스 상황이다.

 

우선 아래와 같이

Background job 생성 > E-mail전송 프로그램 실행 > Background job 종료

순서대로 코딩을 해주었다. (60일 이하 남은 고객 선정은 현재 포스팅에서 제외)

 

소스코드 ▼


  DATALV_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 ON A~ADDRNUMBER B~ADDRNUMBER
                                        AND A~PERSNUMBER B~PERSNUMBER
   WHERE A~BNAME SY-UNAME.

 

 

    DATALV_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사원, 판매오더 생성자로 수신자 설정
    DATALT_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.

    DATALV_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.

TABLESSOMLRECI1.

PARAMETERSP_CTNO TYPE ZSDT9997-ZCONTRACT_NO.

SELECT-OPTIONSS_RECEIV FOR SOMLRECI1-RECEIVER.

CONSTANTS:  CON_CRET TYPE VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF.
DATAW_DOC_DATA     LIKE    SODOCCHGI1,
      T_PACKING_LIST LIKE    SOPCKLSTI1 OCCURS WITH HEADER
                       LINE,
      T_ATTACHMENT   LIKE    SOLISTI1 OCCURS WITH HEADER LINE,

      IT_MESSAGE     LIKE    SOLISTI1 OCCURS WITH HEADER LINE,

      T_RECEIVERS    LIKE    SOMLRECI1 OCCURS WITH HEADER
                       LINE.
DATABEGIN OF ITAB OCCURS 0,    "Excel로 될 Internal Table
        NAME(10TYPE 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 STRLENT_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 SECONDS.
SUBMIT RSCONN01 WITH MODE 'INT'.
*                  WITH OUTPUT = 'X'.


빨간 글씨로 쓴 부분이 이 포스팅의 핵심!!!

처음에는 LASTSTRTDT, LASTSTRTTM 값을 넣고 코딩을해서 Background Job을 만들었을 때도 아래 네모 박스에 값이 계속 안들어와서 도대체 뭐가 문제인지 계속 해맸다. 

 

네모박스에 값이 안들어왔었음!!

결국 'JOB_CLOSE' 펑션을 디버깅 해 본 결과 SDLSTRTDT, SDLSTRTTM 변수에 현재 일자와 현재시각을 코딩하면 해당 값 들이 전부 초기화가 되고 즉시 실행으로 바뀌어버림...

그래서 코딩으로 현재 시간에서 +5초를 더해줘서 시작시간으로 바꾸었다. 그러면 해당 펑션을 타면서 즉시로 바뀌지 않음!

 

아무튼, 진작에 스탠다드 펑션 디버깅을 했으면 오래 안걸렸을텐데, 그게 하기 싫어서 너무 오랜 시간을 허비했다.

다른분들은 이런일 없기를 바라면서 포스팅을 마침


끝.

반응형