SAP采购订单下传SRM

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.

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值