自动发送EMAIL

*&---------------------------------------------------------------------*
*& Report  ZPP_SEND_EMAIL
*&变更配方自动发送EMAIL
*&---------------------------------------------------------------------*
*&2013.6.28
*&
*&---------------------------------------------------------------------*

REPORT  ZPP_SEND_EMAIL.

data: begin of tab_g_mail occurs 0.
  include structure cdpos.

data: matnr like mara-matnr.
data: IDNRK like stpo-IDNRK.
DATA: WERKS LIKE MAST-WERKS.
DATA: STLAL LIKE MAST-STLAL.
data: DDTEXT like dd04t-DDTEXT.
*DATA:
data:end of tab_g_mail.
DATA: LT_CDHDR LIKE TABLE OF CDHDR WITH HEADER LINE.
DATA: LT_CDHDR_TEMP LIKE TABLE OF CDHDR WITH HEADER LINE.
DATA: LT_CDPOS LIKE TABLE OF TAB_G_MAIL WITH HEADER LINE.
DATA: BEGIN OF tab_werks OCCURS 0.
DATA: TABNAME LIKE CDPOS-TABNAME.
DATA: TABKEY LIKE CDPOS-TABKEY.
DATA: WERKS LIKE MAST-WERKS.
DATA: STLBE LIKE STZU-STLBE.
data: IDNRK like stpo-IDNRK.
data: END OF tab_werks.
data: lt_werks like TABLE OF tab_werks WITH HEADER LINE.
data: ld_start like CDHDR-UDATE,ld_end like CDHDR-UDATE.
DATA: li_count type i.
data: ldt_now type cdhdr-UDATE,ldt_time type cdhdr-UTIME,ldt_starttime type cdhdr-UTIME.
DATA: LS_TIME(14TYPE C.

ldt_now SY-DATUM.
ldt_time SY-UZEIT.
*LDT_NOW = '20130628'.
*ldt_time = '160000'.
*LS_TIME = LDT_NOW + LDT_TIME.
IF ldt_time < '040000'. "四小时
  ld_start ldt_now 1.
else.
  ld_start ldt_now.
endif.
  ldt_starttime ldt_time 14400. "四小时

PERFORM get_data.

perform send_mail tables tab_g_mail.

*&---------------------------------------------------------------------*
*&      Form  SEND_MAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
form send_mail tables tab_l_mail like tab_g_mail[].
  DATA: i_objpack LIKE sopcklsti1 OCCURS WITH HEADER LINE,
      i_objtxt  LIKE solisti1 OCCURS WITH HEADER LINE,
      i_objbin  LIKE solisti1 OCCURS WITH HEADER LINE,
      i_reclist LIKE somlreci1 OCCURS WITH HEADER LINE,
      i_record  LIKE solisti1 OCCURS WITH HEADER LINE,
      rec_l_contents  type solisti1,
      v_objhead TYPE soli_tab ,
      v_lines_txt TYPE i,
      v_lines_bin TYPE i,
      v_docchgi TYPE sodocchgi1,
      v_lines_bin_all TYPE i ,
      filelen TYPE i.
  data: begin of tab_l_mailadd occurs 0,
          pmail(30type c,
        end of tab_l_mailadd.

   data: begin of tab_mail occurs 0,
          pmail(30type c,
        end of tab_mail.

   DATA: BEGIN OF itab_text OCCURS 0 , "内表作为邮件附件
        MATNR LIKE MAST-MATNR,
        STLAL LIKE MAST-STLAL,
        tabname like cdpos-tabname,
        tabkey like cdpos-tabkey,
        FNAME like cdpos-FNAME,
        DDTEXT like dd04t-DDTEXT,
        IDNRK LIKE stpo-IDNRK,
        CHNGIND like cdpos-FNAME,
        VALUE_OLD like cdpos-VALUE_OLD,
        VALUE_NEW LIKE CDPOS-VALUE_OLD,
      END OF itab_text.
   DATA:ls_name(100type c.
   DATA: DDTEXT LIKE DD03T-DDTEXT,EDDTEXT LIKE DD04T-DDTEXT,DDDTEXT LIKE DD01T-DDTEXT.
LOOP AT TAB_WERKS.
***附近内容
  itab_text-matnr '物料代码'.
  itab_text-stlal '可选BOM'.
  itab_text-tabname '表名'.
  itab_text-tabkey '表关键字'.
  itab_text-FNAME '字段名'.
  itab_text-DDTEXT '字段描述'.
  itab_text-idnrk '组件'.
  itab_text-CHNGIND '操作'.
  ITAB_TEXT-VALUE_OLD '旧值'.
  ITAB_TEXT-VALUE_NEW '新值'.
  APPEND itab_text.

  v_docchgi-obj_name 'SAPSEND'.
  v_docchgi-expiry_dat sy-datum + 2 . "过期日期
  v_docchgi-sensitivty 'F'. "Functional object
  v_docchgi-doc_size v_lines_txt * 255.
  v_docchgi-obj_descr =  '研究院配方变更'.

*邮件内容
  concatenate '以下是变更信息:' rec_l_contents into rec_l_contents separated by space.
  append rec_l_contents to i_objtxt.

  loop at tab_g_mail where tabname tab_werks-tabname and TABKEY tab_werks-TABKEY.
*** 取字段名称
     SELECT SINGLE dd04t~DDTEXT dd03t~ddtext dd01t~ddtext
     into (ddtext,eddtext,dddtext)
     FROM DD03L LEFT JOIN DD03T
         ON DD03L~TABNAME DD03T~TABNAME
            AND DD03L~FIELDNAME DD03T~FIELDNAME
            AND DD03T~DDLANGUAGE SY-LANGU
         LEFT JOIN DD04T
           ON DD03L~ROLLNAME DD04T~ROLLNAME
            AND DD04T~DDLANGUAGE SY-LANGU
         LEFT JOIN DD01T
           ON DD03L~DOMNAME DD01T~DOMNAME
           AND DD01T~DDLANGUAGE SY-LANGU
     WHERE DD03L~TABNAME tab_werks-tabname and
           DD03L~FIELDNAME tab_g_mail-FNAME.
     IF DDTEXT SPACE.
        IF EDDTEXT SPACE.
           tab_g_mail-ddtext DDDTEXT.
        ELSE.
           tab_g_mail-ddtext EDDTEXT.
        ENDIF.
     else.
       tab_g_mail-ddtext ddtext.
      ENDIF.
    clear rec_l_contents.
    concatenate '物料代码' tab_g_mail-matnr
    '可选BOM' tab_g_mail-stlal "'编号:' tab_werks-TABKEY
    '组件:' tab_werks-IDNRK
    "'表名:' tab_g_mail-tabname
    "'字段:' tab_g_mail-FNAME
    '字段名称' tab_g_mail-ddtext
    '操作:' itab_text-CHNGIND
    '旧值:' tab_g_mail-VALUE_OLD '新值:' tab_g_mail-VALUE_NEW
    into rec_l_contents separated by space.
    append rec_l_contents to i_objtxt.

*** 附件内容
    CLEAR:itab_text.
    itab_text-matnr tab_g_mail-matnr.
    itab_text-stlal tab_g_mail-stlal.
    itab_text-tabname tab_werks-tabname.
    itab_text-tabkey tab_werks-TABKEY.
    itab_text-FNAME tab_g_mail-FNAME.
    itab_text-ddtext tab_g_mail-ddtext.
    itab_text-idnrk tab_werks-IDNRK.
    itab_text-CHNGIND tab_g_mail-CHNGIND.
    itab_text-VALUE_OLD tab_g_mail-VALUE_OLD.
    itab_text-VALUE_NEW tab_g_mail-VALUE_NEW.
    APPEND itab_text.
  endloop.

  clear rec_l_contents.
  concatenate rec_l_contents '详细信息请查阅附件,谢谢!' into rec_l_contents separated by space.
  append rec_l_contents to i_objtxt.
  DESCRIBE TABLE i_objtxt LINES v_lines_txt.

  i_objpack-transf_bin ''.
  i_objpack-head_start 1.
  i_objpack-head_num 0.
  i_objpack-body_start 1.
  i_objpack-body_num v_lines_txt.
  i_objpack-doc_type 'RAW'.
  APPEND i_objpack.

**内表作为邮件附件
  DATA: tmpstr TYPE string .
  CLEAR: tmpstr,i_record,i_record[].
  PERFORM itabtostr TABLES itab_text USING tmpstr.
  PERFORM strtorecord TABLES i_record USING tmpstr filelen.
  APPEND LINES OF i_record TO i_objbin.
  DESCRIBE TABLE i_record LINES v_lines_bin.
  DESCRIBE TABLE i_objbin LINES v_lines_bin_all.

  i_objpack-transf_bin 'X'.
  i_objpack-body_start v_lines_bin_all v_lines_bin + 1 .
  i_objpack-body_num v_lines_bin.
  i_objpack-doc_type 'XLS'.
  i_objpack-obj_name 'text'.
  i_objpack-doc_size v_lines_bin * 255.

  CONCATENATE tab_werks-TABKEY '.xls' '' INTO i_objpack-obj_descr."附件名
  APPEND i_objpack.

**接收人
*  CLEAR i_reclist.
*  i_reclist-receiver = ''.
*  i_reclist-express = 'X'.
*  i_reclist-rec_type = 'U'.
*  APPEND i_reclist.
****收件人
  SELECT EMAIL as pmail
  INTO CORRESPONDING FIELDS OF TABLE tab_mail
  FROM ZPP_0810
  WHERE WERKS TAB_WERKS-WERKS AND
        STLBE TAB_WERKS-STLBE OR STLBE '*').

  LOOP AT TAB_MAIL.
     CLEAR i_reclist.
    i_reclist-receiver tab_mail-pmail.
    i_reclist-express 'X'.
    i_reclist-rec_type 'U'.
    APPEND i_reclist.
  ENDLOOP.
  REFRESH tab_mail.
  CLEAR:tab_mail.

  SELECT EMAIL as pmail
  INTO CORRESPONDING FIELDS OF TABLE tab_mail
  FROM ZPP_0810
  WHERE WERKS TAB_WERKS-WERKS OR WERKS '*' AND
        STLBE TAB_WERKS-STLBE ).

  LOOP AT TAB_MAIL.
    CLEAR i_reclist.
    i_reclist-receiver tab_mail-pmail.
    i_reclist-express 'X'.
    i_reclist-rec_type 'U'.
    APPEND i_reclist.
  ENDLOOP.
   REFRESH tab_mail.
  CLEAR:tab_mail.

   SELECT EMAIL as pmail
  INTO CORRESPONDING FIELDS OF TABLE tab_mail
  FROM ZPP_0810
  WHERE WERKS '*' AND
        STLBE '*').

  LOOP AT TAB_MAIL.
    CLEAR i_reclist.
    i_reclist-receiver tab_mail-pmail.
    i_reclist-express 'X'.
    i_reclist-rec_type 'U'.
    APPEND i_reclist.
  ENDLOOP.
   REFRESH tab_mail.
  CLEAR:tab_mail.

***删除重复
   sort i_reclist.
   DELETE ADJACENT DUPLICATES FROM i_reclist COMPARING ALL FIELDS.

  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      document_data              v_docchgi
      put_in_outbox              'X'
      commit_work                'X'
    TABLES
      packing_list               i_objpack
      object_header              v_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.

  REFRESH: i_objpack,v_objhead,i_objbin,i_objtxt,i_reclist,itab_text.
  CLEAR:i_objpack,v_objhead,i_objbin,i_objtxt,i_reclist,v_docchgi,itab_text.

ENDLOOP.

  wait up to seconds.
  submit rsconn01 with mode 'INT'
                with output 'X' and RETURN.
endform.                    "SEND_MAIL
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .
  IF ld_start ldt_now. "同一天
  select from CDHDR
*  join CDHDR ON
*    CDHDR~MANDANT = CDPOS~MANDANT AND
*     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
*    CDHDR~OBJECTID = CDPOS~OBJECTID AND
*    CDHDR~CHANGENR = CDPOS~CHANGENR
  into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
  WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
    CDHDR~UDATE LD_START AND
    CDHDR~UTIME >= ldt_starttime AND
    CDHDR~UTIME < ldt_time.

    APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.
  else."跨日
    select from CDHDR
*  join CDHDR ON
*    CDHDR~MANDANT = CDPOS~MANDANT AND
*     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
*    CDHDR~OBJECTID = CDPOS~OBJECTID AND
*    CDHDR~CHANGENR = CDPOS~CHANGENR
  into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
  WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
    CDHDR~UDATE LD_START AND
    CDHDR~UTIME >= ldt_starttime AND
    CDHDR~UTIME <= '235959'.

      APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.

      select from CDHDR
*  join CDHDR ON
*    CDHDR~MANDANT = CDPOS~MANDANT AND
*     CDHDR~OBJECTCLAS = CDPOS~OBJECTCLAS AND
*    CDHDR~OBJECTID = CDPOS~OBJECTID AND
*    CDHDR~CHANGENR = CDPOS~CHANGENR
  into CORRESPONDING FIELDS OF TABLE LT_CDHDR_TEMP
  WHERE CDHDR~TCODE IN ('CS02','CV02N'AND
    CDHDR~UDATE LDT_NOW AND
    CDHDR~UTIME < LDT_TIME.

     APPEND LINES OF LT_CDHDR_TEMP TO LT_CDHDR.
  endif.

  LOOP AT LT_CDHDR.
    SELECT FROM CDPOS
    INTO CORRESPONDING FIELDS OF TABLE LT_CDPOS
    WHERE CDPOS~MANDANT LT_CDHDR-MANDANT AND
      CDPOS~OBJECTCLAS LT_CDHDR-OBJECTCLAS AND
      CDPOS~OBJECTID  LT_CDHDR-OBJECTID AND
      CDPOS~CHANGENR LT_CDHDR-CHANGENR.
*      AND
*      CDPOS~TABKEY IN ('300M000002190000001800000037','300M000002190000000500000010').
*      AND
*      CDPOS~OBJECTID = '300M00000219' AND
*      CDPOS~TABNAME = 'STPO'.

    LOOP AT LT_CDPOS.
      SELECT count(*into li_count
      FROM ZMM_SEND_MAIL
      WHERE ZMM_SEND_MAIL~TABNAME LT_CDPOS-TABNAME AND
         ZMM_SEND_MAIL~FNAME LT_CDPOS-FNAME AND
         ZMM_SEND_MAIL~CHNGIND LT_CDPOS-CHNGIND.

      IF sy-subrc 0.
        APPEND LT_CDPOS TO TAB_G_MAIL.
        CLEAR:LT_CDPOS.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  DATA: S_STLTY LIKE STPO-STLTY.
  DATA: M_STLNR LIKE MAST-STLNR.
  DATA: M_STLAL LIKE MAST-STLAL.
  DATA: S_STLNR LIKE STPO-STLNR.
  DATA: S_STLKN LIKE STPO-STLKN.
  DATA: S_STPOZ LIKE STPO-STPOZ.
  DATA: S_IDNRK LIKE STPO-IDNRK.
  data: C_TABNAME LIKE CDPOS-TABNAME.
  LOOP AT TAB_G_MAIL.
****取工厂
    C_TABNAME TAB_G_MAIL-TABNAME.
    IF C_TABNAME 'STPO' OR C_TABNAME 'STPU'.
      S_STLTY TAB_G_MAIL-TABKEY+3(1).
      S_STLNR TAB_G_MAIL-TABKEY+4(8).
      S_STLKN TAB_G_MAIL-TABKEY+12(8).
      S_STPOZ TAB_G_MAIL-TABKEY+20(8).


      SELECT SINGLE STLAL INTO M_STLAL
      FROM STKO
      WHERE STLTY S_STLTY AND
            STLNR S_STLNR.

      SELECT SINGLE STLAL INTO M_STLAL
      FROM STAS
      WHERE STLTY S_STLTY AND
        STLNR S_STLNR AND
        STLKN S_STLKN .

***取主键信息
      SELECT SINGLE IDNRK INTO S_IDNRK
      FROM STPO
      WHERE STLTY S_STLTY AND
            STLNR S_STLNR AND
            STLKN S_STLKN AND
            STPOZ S_STPOZ.
    ENDIF.
    IF C_TABNAME 'STAS'.
      S_STLTY TAB_G_MAIL-TABKEY+3(1).
      S_STLNR TAB_G_MAIL-TABKEY+4(8).
      M_STLAL TAB_G_MAIL-TABKEY+12(2).
      S_STLKN TAB_G_MAIL-TABKEY+14(8).
      S_STPOZ TAB_G_MAIL-TABKEY+22(8).
***取主键信息
      SELECT SINGLE IDNRK INTO S_IDNRK
      FROM STPO
      WHERE STLTY S_STLTY AND
            STLNR S_STLNR AND
            STLKN S_STLKN AND
            STPOZ S_STPOZ.
    ENDIF.
    IF C_TABNAME 'STKO'.
      S_STLTY TAB_G_MAIL-TABKEY+3(1).
      S_STLNR TAB_G_MAIL-TABKEY+4(8).
      M_STLAL TAB_G_MAIL-TABKEY+12(2).
      S_STLKN TAB_G_MAIL-TABKEY+14(8).
    ENDIF.
*        AND
*            STKOZ = S_STKOZ.
      SELECT MAST~WERKS
      INTO CORRESPONDING FIELDS OF TABLE lt_werks
      FROM MAST
      WHERE STLNR S_STLNR AND
            STLAL M_STLAL.


      LOOP AT lt_werks.
        TAB_WERKS-TABNAME TAB_G_MAIL-TABNAME.
        TAB_WERKS-TABKEY TAB_G_MAIL-TABKEY.
        TAB_WERKS-WERKS LT_WERKS-WERKS.
        TAB_WERKS-IDNRK S_IDNRK.
        SELECT SINGLE STLBE INTO TAB_WERKS-STLBE
        FROM STZU
        WHERE STLTY S_STLTY AND
          STLNR S_STLNR.

        APPEND TAB_WERKS.
        CLEAR:LT_WERKS.
      ENDLOOP.

      SELECT SINGLE MAST~MATNR MAST~WERKS
      INTO (TAB_G_MAIL-MATNR,TAB_G_MAIL-WERKS)
        FROM MAST
        WHERE STLNR S_STLNR AND
            STLAL M_STLAL.

      TAB_G_MAIL-STLAL M_STLAL.

*    S_STLTY = TAB_G_MAIL-TABKEY+3(1).
*    M_STLNR = TAB_G_MAIL-TABKEY+4(8).
*    M_STLAL = TAB_G_MAIL-TABKEY+12(2).
*    SELECT MAST~WERKS
*    INTO CORRESPONDING FIELDS OF TABLE lt_werks
*    FROM MAST
*    WHERE STLNR = M_STLNR AND
*          STLAL = M_STLAL.
*    LOOP AT lt_werks.
*      TAB_WERKS-TABKEY = TAB_G_MAIL-TABKEY.
*      TAB_WERKS-WERKS = LT_WERKS-WERKS.
*      APPEND TAB_WERKS.
*      CLEAR:LT_WERKS.
*    ENDLOOP.
    MODIFY TAB_G_MAIL.
  ENDLOOP.

  sort TAB_WERKS by TABNAME TABKEY WERKS IDNRK.
  DELETE ADJACENT DUPLICATES FROM TAB_WERKS COMPARING ALL FIELDS.
ENDFORM.                    " GET_DATA


*&---------------------------------------------------------------------*
*&      Form  itabtostr
*&---------------------------------------------------------------------*
FORM itabtostr TABLES intab
                USING outstr TYPE string.
  DATA: tab TYPE VALUE cl_abap_char_utilities=>horizontal_tab,
        enter(2TYPE VALUE cl_abap_char_utilities=>cr_lf,
        n TYPE i.
  DATA: BEGIN OF headtab OCCURS 0 ,
          length    TYPE i ,
          decimals  TYPE i,
          type_kind TYPE c,
          name(30)  TYPE c,
        END OF headtab.
  DATA descr_ref TYPE REF TO cl_abap_structdescr.
  FIELD-SYMBOLS: <comp_wa> TYPE abap_compdescr ,
                 <f_field> ,
                 <f_intab> TYPE ANY .
  DATA:str TYPE string,
       str2 TYPE string ,
       text1 TYPE c.
  descr_ref ?= cl_abap_typedescr=>describe_by_dataintab ).
  LOOP AT descr_ref->components ASSIGNING <comp_wa>.
    MOVE-CORRESPONDING <comp_wa> TO headtab.
    APPEND headtab.
  ENDLOOP.
  DESCRIBE TABLE headtab LINES n.
  LOOP AT intab ASSIGNING <f_intab>.
    DO TIMES.
      ASSIGN COMPONENT sy-index OF STRUCTURE <f_intab> TO <f_field>.
      str <f_field>.
      READ TABLE headtab INDEX sy-index.
      IF headtab-type_kind 'I' OR headtab-type_kind 'P'
                                 OR headtab-type_kind 'F'.
        SEARCH str FOR '-'.
        IF sy-subrc AND sy-fdpos <> 0.
          SPLIT str AT '-' INTO str text1.
          CONDENSE str.
          CONCATENATE '-' str INTO str.
        ELSE.
          CONDENSE str.
        ENDIF.
      ELSE.
*        SHIFT str LEFT DELETING LEADING '0' .
      ENDIF.
      CONCATENATE str2 tab str INTO str2.
    ENDDO.
    SHIFT str2.
    CONCATENATE outstr str2 enter INTO outstr.
    CLEAR str2.
  ENDLOOP.
ENDFORM.                    "itabtostr

*&---------------------------------------------------------------------*
*&      Form  strtorecord
*&---------------------------------------------------------------------*
FORM strtorecord TABLES record USING str len.
  DATA:tmpbuffer TYPE xstring.
  CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
    EXPORTING
      text     str
      mimetype '"text/html; charset=gb2312"'
*      encoding = '8400'
    IMPORTING
      buffer   tmpbuffer
    EXCEPTIONS
      failed   1
      OTHERS   2.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer          tmpbuffer
      append_to_table ''
    IMPORTING
      output_length   len
    TABLES
      binary_tab      record.
ENDFORM.                    "strtorecord

 

FORM GET_DATA .

通过后台作业配置4小时定期取配方变更信息

通过ZMM_SEND_EMAIL自建表控制哪些表修改才发送邮件

perform send_mail tables tab_g_mail.

对符合的数据进行定向发送EMAIL,通过自建表zpp_0810配置工厂对应的收件地址,取得接受人地址;

内容分两种方式发送:1、邮件内容i_objtxt;2、附近已EXCEL发送 itab_text

 

 

posted @ 2013-07-03 15:03  石头-Rocky  阅读(398)  评论(0编辑  收藏  举报