http://www.cnblogs.com/rainysblog/p/6640515.html
ZPOSRM 采购订单下传SRM
*&---------------------------------------------------------------------* *& Report ZPOSRM *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ZPOSRM. TABLES:EKKO. *SRM系统发送采购订单的数据定义 DATA: PROXY_SRM TYPE REF TO ZCO_MI_ERP_PURCHASE_ORDER_OBD, OUTPUT TYPE ZMT_ERP_PURCHASE_ORDER_OBD, TAB_PODATA TYPE ZDT_SRM_PURCHASE_TAB, WA_PODATA TYPE ZDT_SRM_PURCHASE_ORDER_PO_DATA, TAB_POITEM TYPE ZDT_SRM_PO_ITEM_TAB, WA_POITEM TYPE ZDT_SRM_PO_ITEM, POHEADER TYPE ZDT_SRM_PO_HDR. " 采购订单抬头信息 DATA:DT(30) TYPE C, TM(30) TYPE C. DATA : BEGIN OF ST_EKKO, EBELN LIKE EKKO-EBELN, END OF ST_EKKO. DATA IT_EKKO LIKE TABLE OF ST_EKKO. *定义MESSAGE GUID DATA:E_GUID_16 TYPE GUID_16, E_GUID_22 TYPE GUID_22, E_GUID_32 TYPE GUID_32. DATA: BUKRS TYPE BUKRS. DATA: WA_EBELN TYPE EKKO-EBELN. DATA:POKEY TYPE EBELN, PODATE TYPE ERDAT, VENDER TYPE LIFNR, POTYPE TYPE ESART, POSTATUS TYPE CHAR1, OUTPLANT TYPE RESWK, OSUSR1 TYPE ZSUSR1, OSUSR2 TYPE ZSUSR2, OSUSR3 TYPE ZSUSR3, OSUSR4 TYPE ZSUSR4, OSUSR5 TYPE ZSUSR5. DATA: PO_HEADER TYPE ZPO_HEADER. DATA: IT_PO TYPE ZPURCHASING OCCURS 0 WITH HEADER LINE. DATA: PO_ITEMS TYPE ZPO_ITEMS OCCURS 0 WITH HEADER LINE. DATA: STAT TYPE STAT. DATA: ZMSG TYPE ZMSG. DATA: POLIST TYPE ZPONO OCCURS 0 WITH HEADER LINE. ***************** Selection-screen *************************** SELECTION-SCREEN: BEGIN OF BLOCK BLK WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: ZEBELN FOR EKKO-EBELN. SELECTION-SCREEN: END OF BLOCK BLK. START-OF-SELECTION. *************************************************************** IF ZEBELN[] IS INITIAL. MESSAGE S015(ZL) WITH '采购订单号不能为空'. STOP. ENDIF. ***********调用函数发送采购订单信息 SELECT EBELN INTO TABLE POLIST FROM EKKO WHERE EBELN IN ZEBELN. IF POLIST[] IS INITIAL. MESSAGE S015(ZL) WITH '采购订单号不存在'. STOP. ENDIF. CALL FUNCTION 'ZPO_SEND' EXPORTING DTYPE = 8 IMPORTING ZFLAG = STAT ZMSG = ZMSG TABLES POLIST = POLIST. IF STAT EQ 'E'. ******如果传输出错,则结束程序 MESSAGE S015(ZL) WITH ZMSG. STOP. ENDIF. *************************************************************** MESSAGE I066(Z1) WITH '数据已传输完毕!'.
FUNCTION ZPO_SEND.
FUNCTION ZPO_SEND. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" VALUE(DTYPE) TYPE I OPTIONAL *" EXPORTING *" VALUE(ZFLAG) TYPE STAT *" VALUE(ZMSG) TYPE ZMSG *" TABLES *" POLIST STRUCTURE ZPONO OPTIONAL *"---------------------------------------------------------------------- TABLES:EKKO. *SRM系统发送采购订单的数据定义 DATA: PROXY_SRM TYPE REF TO ZCO_MI_ERP_PURCHASE_ORDER_OBD, OUTPUT TYPE ZMT_ERP_PURCHASE_ORDER_OBD, TAB_PODATA TYPE ZDT_SRM_PURCHASE_TAB, WA_PODATA TYPE ZDT_SRM_PURCHASE_ORDER_PO_DATA, TAB_POITEM TYPE ZDT_SRM_PO_ITEM_TAB, WA_POITEM TYPE ZDT_SRM_PO_ITEM, POHEADER TYPE ZDT_SRM_PO_HDR. " 采购订单抬头信息 DATA:DT(30) TYPE C, TM(30) TYPE C. DATA : BEGIN OF ST_EKKO, EBELN LIKE EKKO-EBELN, END OF ST_EKKO. *定义MESSAGE GUID DATA:E_GUID_16 TYPE GUID_16, E_GUID_22 TYPE GUID_22, E_GUID_32 TYPE GUID_32. DATA:POKEY TYPE EBELN, PODATE TYPE ERDAT, VENDER TYPE LIFNR, POTYPE TYPE ESART, POSTATUS TYPE CHAR1, OUTPLANT TYPE RESWK, OSUSR1 TYPE ZSUSR1, OSUSR2 TYPE ZSUSR2, OSUSR3 TYPE ZSUSR3, OSUSR4 TYPE ZSUSR4, OSUSR5 TYPE ZSUSR5. DATA: PO_HEADER TYPE ZPO_HEADER. DATA: EBELN TYPE EBELN. DATA: BUDAT TYPE BUDAT. DATA: IT_PO TYPE ZPURCHASING OCCURS 0 WITH HEADER LINE. DATA: PO_ITEMS TYPE ZPO_ITEMS OCCURS 0 WITH HEADER LINE. DATA: FLAGN TYPE I. DATA:WA_MSEG TYPE MSEG. DATA: BUDAT101 TYPE BUDAT. DATA: BUDAT103 TYPE BUDAT. DATA: BUDAT105 TYPE BUDAT. DATA:TMP_ITMSUSR1 LIKE EKBES-WAMNG. DATA:TMP_ITMSUSR101 LIKE EKBES-WAMNG. DATA:TMP_ITMSUSR103 LIKE EKBES-WAMNG. DATA:TMP_ITMSUSR105 LIKE EKBES-WAMNG. DATA: BUKRS TYPE BUKRS. "公司代码 DATA: WERKS TYPE WERKS. DATA: LGORT TYPE LGORT_D. DATA: Z_ZSRMLOG LIKE ZSRMLOG OCCURS 0 WITH HEADER LINE. ********************************************************************** * START OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP项目一期> DATA: ZML_POHEADER TYPE ZSMLPO_HDR OCCURS 0 WITH HEADER LINE. DATA: ZML_POITEMS TYPE ZSMLPO_ITEM OCCURS 0 WITH HEADER LINE. DATA: ZML_RET_MSGS TYPE ZSMLPO_MSG1 OCCURS 0 WITH HEADER LINE. * END OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP项目一期> *************************************************************** IF POLIST[] IS INITIAL. ZFLAG = 'E'. ZMSG = '采购订单号不能为空'. FLAGN = '0'. ELSE. FLAGN = 1. ENDIF. IF FLAGN = 1. *根据采购订单号查找采购订单的详细信息 CLEAR TAB_PODATA[]. LOOP AT POLIST INTO EBELN. CALL FUNCTION 'ZGET_PO_INFO' EXPORTING OBJECT_KEY = EBELN IMPORTING POKEY = POKEY PODATE = PODATE VENDER = VENDER POTYPE = POTYPE POSTATUS = POSTATUS OUTPLANT = OUTPLANT HEADER = PO_HEADER OSUSR1 = OSUSR1 OSUSR2 = OSUSR2 OSUSR3 = OSUSR3 "公司代码 OSUSR4 = OSUSR4 OSUSR5 = OSUSR5 TABLES PURCHASING = IT_PO ITEMS = PO_ITEMS. FLAGN = 1. BUKRS = OSUSR3. "公司代码 IF OSUSR5 = 'X'. ZFLAG = 'E'. CONCATENATE '采购订单号' EBELN '不存在' INTO ZMSG. FLAGN = 0. ENDIF. IF FLAGN = 1. * START OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下载> IF PO_HEADER-EKORG+0(1) EQ 'I'. clear zml_poheader. move-corresponding po_header to zml_poheader. append zml_poheader. clear zml_poitems. loop at po_items. clear zml_poitems. move-corresponding po_items to zml_poitems. append zml_poitems. clear po_items. endloop. ELSE. * END OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下载> MOVE-CORRESPONDING PO_HEADER TO POHEADER. CLEAR TAB_POITEM[]. LOOP AT PO_ITEMS. MOVE-CORRESPONDING PO_ITEMS TO WA_POITEM. APPEND WA_POITEM TO TAB_POITEM. IF WERKS IS INITIAL. WERKS = WA_POITEM-WERKS. ENDIF. IF LGORT IS INITIAL. LGORT = WA_POITEM-LGORT. ENDIF. CLEAR WA_POITEM. ENDLOOP. WA_PODATA-PO_HDR = POHEADER. WA_PODATA-PO_ITEM = TAB_POITEM[]. APPEND WA_PODATA TO TAB_PODATA. IF DTYPE EQ 8. CALL FUNCTION 'GUID_CREATE' IMPORTING EV_GUID_16 = E_GUID_16 EV_GUID_22 = E_GUID_22 EV_GUID_32 = E_GUID_32. Z_ZSRMLOG-BUKRS = BUKRS. Z_ZSRMLOG-WERKS = WERKS. Z_ZSRMLOG-LGORT = LGORT. Z_ZSRMLOG-EBELN = EBELN. Z_ZSRMLOG-MSGID = E_GUID_32. Z_ZSRMLOG-BTYPE = 'ZSRMPO'. Z_ZSRMLOG-ZFLAG = 'H'. Z_ZSRMLOG-ZYEAR = SY-DATUM+0(4). "记录年份 Z_ZSRMLOG-ORDERNO = EBELN. Z_ZSRMLOG-ZPDATE = SY-DATUM. Z_ZSRMLOG-ZPTIME = SY-UZEIT. Z_ZSRMLOG-RECEIVER = 'SRM'. Z_ZSRMLOG-SENDER = 'ERP'. APPEND Z_ZSRMLOG. INSERT ZSRMLOG FROM TABLE Z_ZSRMLOG ACCEPTING DUPLICATE KEYS. ENDIF. ENDIF."ADD OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下载> ENDIF. ENDLOOP. ************************************************************** CONCATENATE SY-DATUM+0(4) '-' SY-DATUM+4(2) '-' SY-DATUM+6(2) INTO DT. CONCATENATE SY-UZEIT+0(2) ':' SY-UZEIT+2(2) ':' SY-UZEIT+4(2) INTO TM. CONCATENATE DT TM INTO OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-MSGDT SEPARATED BY SPACE. CALL FUNCTION 'GUID_CREATE' IMPORTING EV_GUID_16 = E_GUID_16 EV_GUID_22 = E_GUID_22 EV_GUID_32 = E_GUID_32. **抬头赋值 OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-GUID = E_GUID_32. OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-SENDER = 'ERP' . "发送方 OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-SOURCE = 'ERP' . "消息来源 OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-BTYPE = 'SRM_IF_PURCHASEORDER'. CONCATENATE SY-DATUM+0(4) '-' SY-DATUM+4(2) '-' SY-DATUM+6(2) INTO DT. CONCATENATE SY-UZEIT+0(2) ':' SY-UZEIT+2(2) ':' SY-UZEIT+4(2) INTO TM. CONCATENATE DT TM INTO OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-MSGDT SEPARATED BY SPACE. OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_HDR-BDOCNUM = PO_HEADER-EBELN. "采购订单号 * * START OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下传> IF NOT TAB_PODATA[] IS INITIAL. * END OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下传> **行项赋值 OUTPUT-MT_ERP_PURCHASE_ORDER_OBD-MSG_BODY-PO_DATA = TAB_PODATA[]. *****发送数据 TRY. CREATE OBJECT PROXY_SRM. CALL METHOD PROXY_SRM->EXECUTE_ASYNCHRONOUS EXPORTING OUTPUT = OUTPUT. COMMIT WORK. ****记录日志 CATCH CX_AI_SYSTEM_FAULT. SYST-MSGID = 'ZL'. SYST-MSGNO = '015'. SYST-MSGTY = 'E'. SYST-MSGV1 = '向SRM发送数据出错'. ENDTRY. IF DTYPE EQ 1. Z_ZSRMLOG-BUKRS = BUKRS. Z_ZSRMLOG-WERKS = WERKS. Z_ZSRMLOG-LGORT = LGORT. Z_ZSRMLOG-EBELN = EBELN. Z_ZSRMLOG-MSGID = E_GUID_32. Z_ZSRMLOG-BTYPE = 'POAUT'. Z_ZSRMLOG-ZYEAR = DT. "记录年份 Z_ZSRMLOG-ORDERNO = EBELN. Z_ZSRMLOG-ZPDATE = SY-DATUM. Z_ZSRMLOG-ZPTIME = SY-UZEIT. Z_ZSRMLOG-RECEIVER = 'SRM'. Z_ZSRMLOG-SENDER = 'ERP'. APPEND Z_ZSRMLOG. INSERT ZSRMLOG FROM TABLE Z_ZSRMLOG ACCEPTING DUPLICATE KEYS. ENDIF. * START OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下传> if zml_poheader[] is not initial and zml_poitems[] is not initial. * send po info to srm via cis (soa) call function 'ZMLSCP1_FR0013' tables pohdear = zml_poheader poitems = zml_poitems ret_msgs = zml_ret_msgs. endif. ELSE." if zml_poheader[] is initial or zml_poitems[] is initial. zflag = 'E'. zmsg = '采购订单未发送(抬头或行项为空)'. else. * send po info to srm via cis (soa) call function 'ZMLSCP1_FR0013' tables pohdear = zml_poheader poitems = zml_poitems ret_msgs = zml_ret_msgs. endif. ENDIF. * END OF CORRECTION <2016/12/23> BY <邬清波> <美菱SCP一期PO下传> ENDIF. ZFLAG = 'S'. ZMSG = '采购订单发送成功'. ENDFUNCTION.