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.

