工单往前倒推一日的入库数据,包含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.