SAP 發送外部郵件(增加到郵件隊列)

***********************************************************************
* System name     : MM                                                *
* Subsystem name  : REPORT                                            *
* Program name    : PO 未發送供應商郵件提醒                            *
* Creation user   : WILLIE                                            *
* Creation date   : 2020.04.27                                        *
* Screen  /STATUS : STATUS1                                           *
***********************************************************************
* REVISION LOG                                                        *
* LOG#    DATE        AUTHOR       DESCRIPTION                        *
* ----   -------      ------     --------------                       *
* 01     20200427     WILLIE       CREATE                             *
***********************************************************************


REPORT  ZMM_PO_REMIND.

TYPE-POOLS:SLIS.

TABLES: EKKO,ZMM27_MAILSEND,VTBBEWE,ZMM27_MAILDATE.


DATA : GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA : GS_LAYOUT   TYPE SLIS_LAYOUT_ALV,
       G_REPID     LIKE SY-REPID .

DATA: BEGIN OF GT_DATA OCCURS 0,
      EBELN    LIKE CDPOS-OBJECTID,
      CHANGENR LIKE CDPOS-CHANGENR,
      AEDAT    LIKE EKKO-AEDAT,
      UDATE    LIKE CDHDR-UDATE,
      FRGKE    LIKE EKKO-FRGKE,
      ERNAM    LIKE EKKO-ERNAM,
      ZFLAG1   LIKE ZMM27_MAILSEND-ZFLAG1,
      ZDATE    TYPE INT4,         "當前日期與批准日期差
      END OF GT_DATA.

DATA: GT_SEND LIKE TABLE OF GT_DATA WITH HEADER LINE.
DATA: GT_ERNAM LIKE TABLE OF GT_DATA WITH HEADER LINE.
DATA: WA_MAILDATE TYPE ZMM27_MAILDATE.                                "added by willie 2020.05.12

DATA: BEGIN OF GT_CDPOS OCCURS 0,
      OBJECTID    LIKE CDPOS-OBJECTID,
      CHANGENR    LIKE CDPOS-CHANGENR,
      END OF GT_CDPOS.

DATA: BEGIN OF GT_CDHDR OCCURS 0,
      OBJECTID    LIKE CDHDR-OBJECTID,
      CHANGENR    LIKE CDHDR-CHANGENR,
      UDATE       LIKE CDHDR-UDATE,
      END OF GT_CDHDR.

DEFINE HEAD.
  FIELDCAT-FIELDNAME     = &1.
  FIELDCAT-REPTEXT_DDIC  = &2.
  FIELDCAT-COL_POS       = &3.
  FIELDCAT-REF_FIELDNAME = &4.
  FIELDCAT-REF_TABNAME   = &5.
  FIELDCAT-HOTSPOT       = &6.
  FIELDCAT-ICON          = &7.

  APPEND FIELDCAT TO P_FIELDCAT.
  CLEAR: FIELDCAT.
END-OF-DEFINITION.

*--------------------------------------------------------------------*
*      SELECTION-SCREEN
*--------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT-T01.
SELECT-OPTIONS: S_EBELN    FOR EKKO-EBELN.
SELECT-OPTIONS: S_AEDAT    FOR EKKO-AEDAT.
SELECT-OPTIONS: S_ERNAM    FOR EKKO-ERNAM NO INTERVALS.
PARAMETERS:     P_SEND     LIKE ZMM27_MAILSEND-ZFLAG1.
SELECT-OPTIONS: S_ZDATE    FOR VTBBEWE-ATAGE.
SELECTION-SCREEN END OF BLOCK BLOCK1.

SELECTION-SCREEN BEGIN OF BLOCK BLOCK2 WITH FRAME TITLE TEXT-T02.
PARAMETERS: P_MODEL TYPE C AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK BLOCK2.


*&---------------------------------------------------------------------*
*       INITIALIZATION.
*----------------------------------------------------------------------*
INITIALIZATION.
  P_SEND = 'N'.
  S_ZDATE-SIGN = 'I'.
  S_ZDATE-OPTION = 'BT'.
  S_ZDATE-LOW = '6'.
  S_ZDATE-HIGH = '9999'.
  APPEND S_ZDATE.


*-----------------------------------------------------------------------
*      START-OF-SELECTION
*-----------------------------------------------------------------------
START-OF-SELECTION.

  PERFORM GET_DATA.
  IF P_MODEL EQ 'X'.
    PERFORM EMAI_PO.
  ENDIF.
  PERFORM PRT_DATA.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .

  DATA: GT_LINES TYPE INT4.
  DATA: PO_MIN LIKE EKKO-EBELN.

  "郵件地址基準日期                                     "added by willie 2020.05.12
  SELECT SINGLE *
         INTO WA_MAILDATE
         FROM ZMM27_MAILDATE
    .

  SELECT A~EBELN
         A~AEDAT
         A~FRGKE
         A~ERNAM
         B~ZFLAG1
    INTO CORRESPONDING FIELDS OF TABLE GT_DATA
    FROM EKKO AS A LEFT JOIN ZMM27_MAILSEND AS B
                        ON A~EBELN EQ B~EBELN
   WHERE A~EBELN IN S_EBELN
     AND A~AEDAT IN S_AEDAT
     AND A~ERNAM IN S_ERNAM
     AND A~LOEKZ NE 'L'
     AND A~FRGKE EQ '1'
     AND A~LIFNR NOT LIKE '00008%'          "Added by Willie 2020.05.11
     .

  DESCRIBE TABLE GT_DATA LINES GT_LINES.

  IF GT_LINES EQ 0.
    MESSAGE '無滿足查詢條件的數據' TYPE 'E'.
  ENDIF.

  "PO審批記錄
  SELECT A~OBJECTID
         A~CHANGENR
         FROM CDPOS AS A INTO CORRESPONDING FIELDS OF TABLE GT_CDPOS
    FOR ALL ENTRIES IN GT_DATA
    WHERE A~OBJECTID EQ GT_DATA-EBELN
      AND A~OBJECTCLAS EQ 'EINKBELEG'
      AND A~TABNAME    EQ 'EKKO'
      AND A~FNAME      EQ 'FRGKE'
      AND A~VALUE_NEW  EQ '1'
      .

  SORT GT_CDPOS BY OBJECTID CHANGENR DESCENDING.  "降序,將CHANGENR最新的排前

"獲取審批記錄中最新一條文檔編號
  FIELD-SYMBOLS: <FS_DATA> LIKE LINE OF GT_DATA.
  LOOP AT GT_DATA ASSIGNING <FS_DATA> .
    READ TABLE GT_CDPOS WITH KEY OBJECTID = <FS_DATA>-EBELN BINARY SEARCH.
    IF SY-SUBRC = 0.
      <FS_DATA>-CHANGENR = GT_CDPOS-CHANGENR.
    ENDIF.
  ENDLOOP.

  "PO審批日期
  SELECT A~OBJECTID
         A~CHANGENR
         A~UDATE
         FROM CDHDR AS A
    INTO CORRESPONDING FIELDS OF TABLE GT_CDHDR
    FOR ALL ENTRIES IN GT_DATA
    WHERE A~OBJECTID EQ GT_DATA-EBELN
      AND A~CHANGENR EQ GT_DATA-CHANGENR
      AND A~OBJECTCLAS EQ 'EINKBELEG'
      .

  SORT GT_CDHDR BY OBJECTID CHANGENR DESCENDING.

  FIELD-SYMBOLS: <FS_TAB> LIKE LINE OF GT_DATA.
  LOOP AT GT_DATA ASSIGNING <FS_TAB> .
    READ TABLE GT_CDHDR WITH KEY OBJECTID = <FS_TAB>-EBELN
                                 CHANGENR = <FS_TAB>-CHANGENR
                                 BINARY SEARCH.
    IF SY-SUBRC = 0.
      <FS_TAB>-UDATE    = GT_CDHDR-UDATE.
      CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
      EXPORTING
        I_DATE_FROM = <FS_TAB>-UDATE
        I_DATE_TO   = SY-DATUM
      IMPORTING
        E_DAYS      = <FS_TAB>-ZDATE.
    ELSE.
      CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
      EXPORTING
        I_DATE_FROM = <FS_TAB>-AEDAT
        I_DATE_TO   = SY-DATUM
      IMPORTING
        E_DAYS      = <FS_TAB>-ZDATE.
    ENDIF.
  ENDLOOP.

  IF P_SEND EQ 'Y'.
    DELETE GT_DATA WHERE ( ZFLAG1 NE 'Y' AND UDATE GT WA_MAILDATE-ZBSDT ).
  ELSEIF P_SEND EQ 'N'.
    DELETE GT_DATA WHERE ZFLAG1 EQ 'Y'
                      OR UDATE LE WA_MAILDATE-ZBSDT.
  ENDIF.



  IF S_ZDATE IS NOT INITIAL.
     DELETE GT_DATA WHERE ZDATE NOT BETWEEN S_ZDATE-LOW AND S_ZDATE-HIGH.
  ENDIF.


  GT_ERNAM[] = GT_DATA[].
  SORT GT_ERNAM BY ERNAM.
  DELETE ADJACENT DUPLICATES FROM GT_ERNAM COMPARING ERNAM.

  SORT GT_DATA BY ZDATE.

ENDFORM.                    " GET_DATA

*&---------------------------------------------------------------------*
*&      Form  USER_COMMAND
*&---------------------------------------------------------------------*
*       Status bar Buttons
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
                  RS_SELFIELD TYPE SLIS_SELFIELD.
  CASE R_UCOMM.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0 .
    WHEN 'EMAIL'.
      PERFORM EMAI_PO.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  FRM_STATUS_SET
*&---------------------------------------------------------------------*
*       Status Bar Write
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.           "#EC *
  SET PF-STATUS 'STATUS1'.
ENDFORM.                 "f01_alv_event_pf_status_set


*&---------------------------------------------------------------------*
*&      Form  PRT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRT_DATA .
*定義輸出報表表頭
  PERFORM FIELDCAT_INIT_DETAILS USING GT_FIELDCAT[].
  PERFORM LAYOUT_BUILD CHANGING G_REPID
                                GS_LAYOUT.

*ALV輸出
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_BYPASSING_BUFFER       = 'X'
      I_BUFFER_ACTIVE          = 'X'
      I_CALLBACK_PROGRAM       = G_REPID
      I_CALLBACK_PF_STATUS_SET = 'STATUS_SET'
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      IS_LAYOUT                = GS_LAYOUT
      IT_FIELDCAT              = GT_FIELDCAT[]
    TABLES
      T_OUTTAB                 = GT_DATA[].

ENDFORM.                    " PRT_DATA

*&---------------------------------------------------------------------*
*&      Form  FIELDCAT_INIT_DETAILS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GT_FIELDCAT[]  text
*----------------------------------------------------------------------*
FORM FIELDCAT_INIT_DETAILS  USING P_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
  DATA: FIELDCAT TYPE SLIS_FIELDCAT_ALV.
  HEAD 'EBELN' '採購憑證號' '11' 'EBELN' 'EKKO' '' ''.
  HEAD 'CHANGENR' '更改編號' '10' 'CHANGENR' 'CDPOS' '' ''.
  HEAD 'UDATE' '最後審覈日期' '8' 'UDATE' 'CDHDR' '' ''.
  HEAD 'FRGKE' '審覈狀態' '1' 'FRGKE' 'EKKO' '' ''.
  HEAD 'AEDAT' '創建日期' '8' 'AEDAT' 'EKKO' '' ''.
  HEAD 'ERNAM' '申請人' '17' 'ERNAM' 'EKKO' '' ''.
  HEAD 'ZFLAG1' '發送標識' '1' 'ZFLAG1' 'ZMM27_MAILSEND' '' ''.
  HEAD 'ZDATE' '間隔日期' '5' '' '' '' ''.
ENDFORM.                    " FIELDCAT_INIT_DETAILS
*&---------------------------------------------------------------------*
*&      Form  LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_G_REPID  text
*      <--P_GS_LAYOUT  text
*----------------------------------------------------------------------*
FORM LAYOUT_BUILD CHANGING T_REPID LIKE SY-REPID
                           TS_LAYOUT TYPE SLIS_LAYOUT_ALV.
  T_REPID                 = SY-REPID.           "程序爲當前程序
  TS_LAYOUT-ZEBRA         = 'X'.
  TS_LAYOUT-DETAIL_POPUP  = 'X'.                "是否彈出詳細信息窗口
  TS_LAYOUT-COLWIDTH_OPTIMIZE     = 'X'.        "優化列寬選項是否設置
  TS_LAYOUT-DETAIL_INITIAL_LINES  = 'X'.
ENDFORM.                    "LAYOUT_BUILD
*&---------------------------------------------------------------------*
*&      Form  EMAI_PO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EMAI_PO .
* Internal Table declarations
  DATA: I_RECEIVERS TYPE TABLE OF SOMLRECI1 WITH HEADER LINE,
* Objects to send mail.
        I_OBJPACK   LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
        I_OBJTXT    LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
        I_OBJBIN    LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
        I_RECLIST   LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
* Work Area declarations
        WA_OBJHEAD  TYPE SOLI_TAB,
        WA_DOC_CHNG TYPE SODOCCHGI1.

  DATA:LT_OBJECT_ID LIKE SOFOLENTI1-OBJECT_ID.

  DATA: L_MSG  TYPE STRING.

  DATA: V_LINES_TXT TYPE I.

  DATA: L_SENDER TYPE SO_REC_EXT.
  DATA: ST_CONTENTS  TYPE SOLISTI1 OCCURS 0 WITH HEADER LINE.
  DATA: L_WARN TYPE SOLISTI1.

  DATA: I_SENDER  TYPE  AD_SMTPADR,
        I_CCNAM   TYPE  AD_SMTPADR,
        I_TONAM   TYPE  AD_SMTPADR.


  LOOP AT GT_ERNAM.
    REFRESH: I_RECLIST,I_OBJTXT,
         I_OBJBIN,I_OBJPACK.

    REFRESH: GT_SEND,ST_CONTENTS.
    CLEAR:L_WARN.

    GT_SEND[] = GT_DATA[].
    DELETE GT_SEND WHERE ERNAM NE GT_ERNAM-ERNAM.

    IF GT_SEND[] IS INITIAL.
      CONTINUE.
    ENDIF.

    "CC
    SELECT SINGLE EMAIL INTO I_CCNAM
      FROM ZMM27_MAILADR
      WHERE MTYPE EQ 'MH'.

    "SENDER
    SELECT SINGLE EMAIL INTO I_SENDER
             FROM ZMM27_MAILADR
            WHERE VERKF EQ GT_ERNAM-ERNAM
              AND MTYPE EQ 'ME'.
    IF SY-SUBRC NE 0.
      MOVE I_CCNAM TO I_SENDER.

      CONCATENATE '<font color="red">Warning: The email address of &nbsp'
                  GT_ERNAM-ERNAM
                  '&nbsp is not maintained!'
          INTO L_WARN.
    ENDIF.
    I_TONAM = I_SENDER.

    CONCATENATE I_SENDER '@unisoc.com'
          INTO L_SENDER.


    LOOP AT GT_SEND.
      CONCATENATE
        `<tr> <td width=150>` GT_SEND-EBELN
        `</td><td width=150>` GT_SEND-AEDAT+0(4) '-' GT_SEND-AEDAT+4(2) '-' GT_SEND-AEDAT+6(2)
        `</td><td width=150>` GT_SEND-ERNAM
        `</td></tr>`
        INTO ST_CONTENTS .
      APPEND ST_CONTENTS.
    ENDLOOP.

    APPEND `<HTML> <font face="verdana" color="Black"> <BODY> Dear,` TO I_OBJTXT.
    APPEND `<blockquote><font face="verdana">The following PO you created has not been emailed to the supplier,` TO I_OBJTXT.
    APPEND `<meta http-equiv=Content-Type content` TO I_OBJTXT.
    APPEND `="text/html; charset=utf-8">` TO I_OBJTXT.

    APPEND `<p><TABLE border=1 width= 450 ` TO I_OBJTXT.
    APPEND `style='border-collapse:collapse;font-size:11pt;color:#000000'>` TO I_OBJTXT.
    APPEND `<TR style= 'background:#920784'> ` TO I_OBJTXT.
    APPEND `<Th>採購訂單</Th>` TO I_OBJTXT.
    APPEND `<Th>創建日期</Th>`  TO I_OBJTXT.
    APPEND `<Th>創建人</Th>`  TO I_OBJTXT.
    APPEND `</TR><center>` TO I_OBJTXT.

    APPEND LINES OF ST_CONTENTS TO I_OBJTXT.

    APPEND '</center></TABLE></p>' TO I_OBJTXT.
    IF L_WARN IS NOT INITIAL.
      APPEND L_WARN TO I_OBJTXT.
    ENDIF.

    APPEND '<p><font face="verdana" color="Black">Pls kindly check.' TO I_OBJTXT.
    APPEND '<br />Thank you!</p></blockquote>' TO I_OBJTXT.
    APPEND INITIAL LINE TO I_OBJTXT.
    APPEND '</BODY> </HTML>' TO I_OBJTXT.


    DESCRIBE TABLE I_OBJTXT LINES V_LINES_TXT.
    READ TABLE I_OBJTXT INDEX V_LINES_TXT.
    WA_DOC_CHNG-OBJ_NAME = 'SEND Email'.
    WA_DOC_CHNG-EXPIRY_DAT = SY-DATUM + 2.
    WA_DOC_CHNG-OBJ_DESCR = 'PO未發郵件提醒'.

    WA_DOC_CHNG-SENSITIVTY = 'F'.
    WA_DOC_CHNG-DOC_SIZE = V_LINES_TXT * 255.


    I_OBJPACK-TRANSF_BIN = SPACE.
    I_OBJPACK-HEAD_START = 1.
    I_OBJPACK-HEAD_NUM = 0.
    I_OBJPACK-BODY_START = 1.
    DESCRIBE TABLE I_OBJTXT LINES I_OBJPACK-BODY_NUM.
    I_OBJPACK-DOC_TYPE = 'HTML'.
    APPEND I_OBJPACK.

    "TO
    CLEAR I_RECLIST.
    CONCATENATE I_TONAM '@unisoc.com'
          INTO I_RECLIST-RECEIVER.
    I_RECLIST-REC_TYPE = 'U'.
    APPEND I_RECLIST.CLEAR I_RECLIST.

    "CC
    CLEAR I_RECLIST.
    CONCATENATE I_CCNAM '@unisoc.com'
          INTO I_RECLIST-RECEIVER.
    I_RECLIST-COPY     = 'X'.
    I_RECLIST-REC_TYPE = 'U'.
    APPEND I_RECLIST.CLEAR I_RECLIST.

    CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
      EXPORTING
        DOCUMENT_DATA              = WA_DOC_CHNG
        PUT_IN_OUTBOX              = 'X'
        SENDER_ADDRESS             = L_SENDER
        SENDER_ADDRESS_TYPE        = 'SMTP'
        COMMIT_WORK                = 'X'
      IMPORTING
        NEW_OBJECT_ID              = LT_OBJECT_ID
      TABLES
        PACKING_LIST               = I_OBJPACK
        OBJECT_HEADER              = WA_OBJHEAD
        CONTENTS_BIN               = I_OBJBIN
        CONTENTS_TXT               = I_OBJTXT
        RECEIVERS                  = I_RECLIST
      EXCEPTIONS
        TOO_MANY_RECEIVERS         = 1
        DOCUMENT_NOT_SENT          = 2
        DOCUMENT_TYPE_NOT_EXIST    = 3
        OPERATION_NO_AUTHORIZATION = 4
        PARAMETER_ERROR            = 5
        X_ERROR                    = 6
        ENQUEUE_ERROR              = 7
        OTHERS                     = 8.

    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ELSE.
      MOVE '郵件已送至發送隊列!' TO L_MSG.
    ENDIF.
  ENDLOOP.

  IF L_MSG IS NOT INITIAL.
    MESSAGE L_MSG TYPE  'S'.
  ENDIF.

ENDFORM.                    " EMAI_PO

 

 

注意:通過以上代碼即可將使用HTML設計好的郵件送到SAP郵件發送隊列。後續只需要basis配置好STMP郵件發送功能即可定時推送出郵件隊列中的待發郵件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章