SAP PP工单入库报表(邮件发送)

 工单往前倒推一日的入库数据,包含101/102,执行后并已邮件的方式发送

*&---------------------------------------------------------------------*
*&      ZPP_003
*&---------------------------------------------------------------------*
*      工单每日入库报表,邮件自动发送
*      ZMM_MAIL 邮件地址表
*----------------------------------------------------------------------*

REPORT ZPP_003.

TABLES :AFPO,AFKO,AUFK,AUFM,ZMM_MAIL.

***********************************************************************
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.

SELECT-OPTIONS :  P_WERKS FOR  AUFM-WERKS.
SELECT-OPTIONS :  S_AUFNR FOR AFKO-AUFNR .
PARAMETERS :  C_LTRMI LIKE  AFPO-LTRMI OBLIGATORY DEFAULT SY-DATUM .        "实际交货日期
SELECTION-SCREEN END OF BLOCK B1.
***********************************************************************

DATA: G_MAIL_ADDRESS TYPE AD_SMTPADR,
      GV_MAT         TYPE STRING.


DATA: BEGIN OF T_AUFNR OCCURS 0,
        BWART     LIKE AUFM-BWART,
        SHKZG     LIKE EKBE-SHKZG,
        MENGE     TYPE P DECIMALS 3,
        DMBTR     LIKE AUFM-DMBTR,
        BUDAT     LIKE AUFM-BUDAT,
        AUFNR     LIKE AUFM-AUFNR,
        PSMNG     LIKE  AFPO-PSMNG,
        PONUM     LIKE  ZEDIT03-PONUM,
        PLNBEZ    LIKE  AUFM-MATNR,
        ERDAT     LIKE AUFK-ERDAT,     "工单创建日期
        STAT(100),                                                     "工单状态
        LTRMI     LIKE AFPO-LTRMI,    "完成日期
        MAKTX     LIKE MAKT-MAKTX,
        MBLNR     LIKE AUFM-MBLNR,
        WERKS     LIKE AUFM-WERKS,
        LGORT     LIKE AUFM-LGORT,
        MEINS     LIKE AUFM-MEINS,
      END OF T_AUFNR.

DATA: P_NUM TYPE I.
DATA: P_DATUM LIKE SY-DATUM.

DATA: GT_FIELDCAT_ALV TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,    "定义存放字段信息的内表
      GS_LAYOUT       TYPE SLIS_LAYOUT_ALV,            "定义存放画面布局控制数据的工作区
      GS_SORT         TYPE SLIS_SORTINFO_ALV OCCURS 0.
DATA: PV_NAME(10)  TYPE C,
      PV_TEXTL(10) TYPE C,
      GV_POS       TYPE I.

DATA: SEND_REQUEST  TYPE REF TO CL_BCS, "请求
      DOCUMENT      TYPE REF TO CL_DOCUMENT_BCS, "文档
      RECIPIENT     TYPE REF TO IF_RECIPIENT_BCS, "接收者
      BCS_EXCEPTION TYPE REF TO CX_BCS. "异常

DATA: MAIN_TEXT       TYPE BCSY_TEXT, "主要内容
      BINARY_CONTENT  TYPE SOLIX_TAB, "二进制内容
      SIZE            TYPE SO_OBJ_LEN, "文件內容大小
      BINARY_CONTENT2 TYPE SOLIX_TAB, "二进制内容
      SIZE2           TYPE SO_OBJ_LEN, "文件內容大小
      SENT_TO_ALL     TYPE OS_BOOLEAN.
DATA  ZEMAIL_ADDR   TYPE TABLE OF AD_SMTPADR .

***********************************************************************
AT SELECTION-SCREEN.

START-OF-SELECTION.
  PERFORM SELECT_DATA.
  PERFORM PRINT_DATA.
*&---------------------------------------------------------------------*
*&      Form  SELECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SELECT_DATA .

  CALL FUNCTION 'FIMA_DATE_CREATE'
    EXPORTING
      I_DATE             = SY-DATUM "输入日期
      I_FLG_END_OF_MONTH = ' '
      I_DAYS             = -1 "可为负数
    IMPORTING
      E_DATE             = P_DATUM. "返回的日期

***取工单收货数量
  SELECT A~BWART A~SHKZG A~MENGE A~DMBTR A~BUDAT A~AUFNR A~MATNR P~PSMNG A~MBLNR A~WERKS A~LGORT A~MEINS
    INTO (T_AUFNR-BWART,T_AUFNR-SHKZG,T_AUFNR-MENGE,T_AUFNR-DMBTR,T_AUFNR-BUDAT,T_AUFNR-AUFNR,T_AUFNR-PLNBEZ,
              T_AUFNR-PSMNG,T_AUFNR-MBLNR,T_AUFNR-WERKS,T_AUFNR-LGORT,T_AUFNR-MEINS )
    FROM AUFM AS A JOIN AFPO AS P ON A~AUFNR = P~AUFNR
    WHERE A~AUFNR IN S_AUFNR
    WERKS IN P_WERKS
    AND A~BUDAT = P_DATUM
    AND A~BWART IN ('101','102').
    CASE T_AUFNR-BWART.
      WHEN '101' OR '102'.
        IF T_AUFNR-SHKZG = 'H'.
          T_AUFNR-MENGE = T_AUFNR-MENGE * -1.
          T_AUFNR-DMBTR = T_AUFNR-DMBTR * -1.
        ENDIF.

    ENDCASE.
    APPEND T_AUFNR.
  ENDSELECT.

  LOOP AT T_AUFNR.
    SELECT SINGLE MAKT~MAKTX INTO T_AUFNR-MAKTX  FROM MAKT WHERE MAKT~MATNR = T_AUFNR-PLNBEZ.
    MODIFY T_AUFNR.
  ENDLOOP.
  SORT   T_AUFNR BY AUFNR.

  IF T_AUFNR[] IS NOT INITIAL.

    SELECT COUNT(*) INTO P_NUM  FROM ZMM_MAIL.
    IF P_NUM >= 1.
      SELECT  EMAIL_ADDR FROM ZMM_MAIL INTO  TABLE  ZEMAIL_ADDR.  "获取邮件地址
      PERFORM SEND_MAIL.   "邮件发送
    ELSE.
      MESSAGE '无邮件地址!'  TYPE  'E'.
    ENDIF.
  ELSE.
    MESSAGE '昨日无工单入库数据!'  TYPE  'E'.
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SEND_MAIL .

  "MAILTO   = 'yunfang.kang@tecochina.cc'.
  "整理附件数据
  PERFORM PROCESS_MAIL_DATA.
* --------------------------------------------------------------
* convert the text string into UTF-16LE binary data including
* byte-order-mark. Mircosoft Excel prefers these settings
* all this is done by new class cl_bcs_convert (see note 1151257)

* 物料
  TRY.
      CL_BCS_CONVERT=>STRING_TO_SOLIX(
        EXPORTING
          IV_STRING   = GV_MAT
          IV_CODEPAGE = '0000'  "suitable for MS Excel, leave empty
          IV_ADD_BOM  = 'X'     "for other doc types
        IMPORTING
          ET_SOLIX  = BINARY_CONTENT
          EV_SIZE   = SIZE ).
    CATCH CX_BCS.
      MESSAGE E445(SO).
  ENDTRY.

  TRY.
*     -------- create persistent send request ------------------------
      SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).

*     -------- create and set document with attachment ---------------
*     create document object from internal table with text
*     append 'Hello world!' to main_text.                  "#EC NOTEXT
*     邮件内容
      APPEND 'Dear Mr and Miss:' TO MAIN_TEXT.
      APPEND '' TO MAIN_TEXT.
      APPEND '此为SAP系统自动发信功能,请勿直接回复!' TO MAIN_TEXT.
      APPEND '' TO MAIN_TEXT.
      APPEND 'Thanks.' TO MAIN_TEXT.

      DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
        I_TYPE    = 'RAW'
        I_TEXT    = MAIN_TEXT
        I_SUBJECT = '工单每日入库报表' ).

*     add the spread sheet as attachment to document object

*     物料
      DOCUMENT->ADD_ATTACHMENT(
        I_ATTACHMENT_TYPE    = 'xls'                        "#EC NOTEXT
        I_ATTACHMENT_SUBJECT = '工单每日入库报表数据'
        I_ATTACHMENT_SIZE    = SIZE
        I_ATT_CONTENT_HEX    = BINARY_CONTENT ).

*     add document object to send request
      SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).

*     --------- add recipient (e-mail address) -----------------------
      LOOP AT ZEMAIL_ADDR INTO DATA(SEND_ZEMAIL_ADDR).
*     create recipient object
        RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( SEND_ZEMAIL_ADDR ).
        "RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( MAILTO ).
*     add recipient object to send request
        SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
      ENDLOOP.

*     ---------- send document ---------------------------------------
      SENT_TO_ALL = SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).

      IF SENT_TO_ALL IS INITIAL.
        MESSAGE I500(SBCOMS).
      ELSE.
        COMMIT WORK.
        MESSAGE S022(SO).
      ENDIF.

*   ------------ exception handling ----------------------------------
*   replace this rudimentary exception handling with your own one !!!
    CATCH CX_BCS INTO BCS_EXCEPTION.
      MESSAGE I865(SO) WITH BCS_EXCEPTION->ERROR_TYPE.
  ENDTRY.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form PROCESS_MAIL_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM PROCESS_MAIL_DATA .
  DATA: LS_MAIL LIKE T_AUFNR.
  DATA: MENGE1 TYPE STRING,
        PSMNG1 TYPE STRING,
        DMBTR1 TYPE STRING.
  " AUFNR1(15) TYPE C.
  CONSTANTS: GC_TAB  TYPE C VALUE CL_BCS_CONVERT=>GC_TAB,
             GC_CRLF TYPE C VALUE CL_BCS_CONVERT=>GC_CRLF.
  DATA: LV_LINE      TYPE STRING.
  "标题
  CONCATENATE  '异动类型'
                              '工厂'
                              '存储位置'
                              '物料'
                              '物料说明'
                              '过账日期'
                              '订单'
                              '单位'
                              '物料文件'
                              '订单数量'
                              '数量'
                              '金额'
                            INTO LV_LINE SEPARATED BY GC_TAB.
  "换行
  CONCATENATE GV_MAT LV_LINE GC_CRLF INTO GV_MAT.

  LOOP AT T_AUFNR INTO LS_MAIL.
    " AUFNR1 =  LS_MAIL-AUFNR .
    MENGE1 = LS_MAIL-MENGE.
    PSMNG1 = LS_MAIL-PSMNG.
    DMBTR1 = LS_MAIL-DMBTR.
    CONCATENATE  LS_MAIL-BWART
                               LS_MAIL-WERKS
                               LS_MAIL-LGORT
                               LS_MAIL-PLNBEZ
                               LS_MAIL-MAKTX
                               LS_MAIL-BUDAT
                                LS_MAIL-AUFNR
                                LS_MAIL-MEINS
                                LS_MAIL-MBLNR
                                 PSMNG1
                                 MENGE1
                                 DMBTR1
                               INTO LV_LINE SEPARATED BY GC_TAB.
    "换行
    CONCATENATE GV_MAT LV_LINE GC_CRLF INTO GV_MAT.
  ENDLOOP.
  CLEAR LV_LINE.

ENDFORM.

*&      Form  PRINT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRINT_DATA .
  PERFORM FRM_ALV_LAYOUT_BUILD.
  PERFORM FRM_ALV_SET_COLUMNS .
  PERFORM FRM_ALV_DISPLAY_DATA .
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ALV_LAYOUT_BUILD .
  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA                                = 'X'.  "带条纹模式,隔行换色
  GS_LAYOUT-DETAIL_POPUP                = 'X'.       "采用默认的POPUP模式
  GS_LAYOUT-COLWIDTH_OPTIMIZE   = 'X'.           "优化列宽,自动适应内容长度
*  GS_LAYOUT-BOX_FIELDNAME           = 'SEL'.     "存放选择信息,在数据内表中已定义该字段名称
  GS_LAYOUT-DETAIL_INITIAL_LINES = 'X'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_SET_COLUMNS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ALV_SET_COLUMNS .
  REFRESH GT_FIELDCAT_ALV.
  PERFORM FRM_SET_L_FIELDCAT USING:
 'BWART'               '异动类型',
 'WERKS'               '工厂',
 'LGORT'               '储存位置',
 'PLNBEZ'              '物料',
 'MAKTX'               '物料说明',
 'BUDAT'               '过账日期',
 'AUFNR'               '订单',
'MEINS'               '单位',
 'MBLNR'               '物料文件',
 'PSMNG'              '订单数量',
 'MENGE'              '数量',
 'DMBTR'               '金额'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_SET_L_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_SET_L_FIELDCAT  USING    PV_NAME  PV_TEXTL.
  DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
  GV_POS              = GV_POS + 1.
  LS_FIELDCAT-COL_POS      = GV_POS.
  LS_FIELDCAT-FIELDNAME = PV_NAME.
  LS_FIELDCAT-SELTEXT_L   = PV_TEXTL.
  APPEND LS_FIELDCAT TO GT_FIELDCAT_ALV.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_ALV_DISPLAY_DATA .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IS_LAYOUT          = GS_LAYOUT         "传入ALV显示格式控制数据
      IT_FIELDCAT        = GT_FIELDCAT_ALV[] "传入显示字段的内表
    TABLES
      T_OUTTAB           = T_AUFNR.      "要显示的内表
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值