SAP RFC接口(外围系统发数据给SAP)

本文详细阐述了在SAP系统中,如何通过Web服务接口接收外部数据,进行采购订单的收货、创建交货单、更新库位以及执行交货过账的过程。涉及数据校验、库存可用量检查、BAPI调用等多个关键步骤,并对可能出现的问题进行了处理和记录。
摘要由CSDN通过智能技术生成

文章目录

1 Instruction

Cwms send data to sap and posting(The movemoment type is 643). And interface is
webservice.

2 code

FUNCTION ZCWMS_SRV_0009_IN.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(ITB_CWMS_IN) TYPE  ZTA_CWMS009 OPTIONAL
*"  EXPORTING
*"     VALUE(MBLNR) TYPE  MBLNR
*"     VALUE(ZEBELN) TYPE  ZEBELN
*"     VALUE(REID) TYPE  CHAR1
*"     VALUE(REMSG) TYPE  CHAR200
*"     VALUE(VBELN) TYPE  VBELN
*"----------------------------------------------------------------------


  DEFINE add_pre_zero.
    call function 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        input  = &1
      IMPORTING
        output = &1.
  END-OF-DEFINITION.
  DEFINE delete_pre_zero.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &1.
  END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_KYL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_WERKS    text
*      -->P_LGORT    text
*      -->P_MATNR    text
*      -->P_MENGE    text
*----------------------------------------------------------------------*
  " FRM_GET_KYL




  " 采购订单创建交货单BAPI使用的参数定义
  DATA:
    L_DELIVERY           TYPE VBELN_VL,
    L_NUM_DELIVERIES     TYPE VBNUM,
    LT_STOCK_TRANS_ITEMS TYPE STANDARD TABLE OF BAPIDLVREFTOSTO,
    LT_DELIVERIES        TYPE STANDARD TABLE OF BAPISHPDELIVNUMB,
    LT_CREATED_ITEMS     TYPE STANDARD TABLE OF BAPIDLVITEMCREATED,
    LT_RETURN            TYPE STANDARD TABLE OF BAPIRET2,
    WA_RETURN            LIKE BAPIRET2,

    LT_PROT              TYPE STANDARD TABLE OF PROTT,
    LT_BAPIOBDLVITEMCHG   LIKE STANDARD TABLE OF BAPIOBDLVITEMCHG WITH HEADER LINE,
    LT_BAPIOBDLVITEMCHG_C LIKE STANDARD TABLE OF  BAPIOBDLVITEMCTRLCHG WITH HEADER LINE,
    LT_ITEM_DATA_SPL      TYPE STANDARD TABLE OF /SPE/BAPIOBDLVITEMCHG.
  DATA:
    WA_HEADER_DATA       TYPE BAPIOBDLVHDRCHG,
    WA_HEADER_CONTROL    TYPE BAPIOBDLVHDRCTRLCHG,
    WA_ITEM_DATA_SPL     TYPE /SPE/BAPIOBDLVITEMCHG,
    WA_STOCK_TRANS_ITEMS TYPE BAPIDLVREFTOSTO,
    WA_CREATED_ITEMS     TYPE BAPIDLVITEMCREATED,
    WA_DELIVERIES        TYPE BAPISHPDELIVNUMB,
    WA_VBKOK             TYPE VBKOK,
    L_EF_ERROR_ANY_0     TYPE XFELD.
  "MIGO收货BAPI参数定义
  DATA: GT_GOODSMVT_HEADER  LIKE BAPI2017_GM_HEAD_01,
        GT_GOODSMVT_ITEM    LIKE BAPI2017_GM_ITEM_CREATE OCCURS 0 WITH HEADER LINE,
        GT_RETURN           LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
  DATA: GT_GOODSMVT_HEADRET LIKE BAPI2017_GM_HEAD_RET,
        GOODSMVT_CODE_TMP   TYPE BAPI2017_GM_CODE.
  DATA: L_RETURN            LIKE BAPIRET2.

  DATA:lv_meins like mara-meins,"基本计量单位
       lv_usnam LIKE MKPF-USNAM,
       lv_MBLNR LIKE MKPF-MBLNR,"物料凭证
       lv_MJAHR like MKPF-MJAHR, "会计年度
       lv_VBELN like LIPS-VBELN,
       lv_POSNR like LIPS-POSNR,
       lv_kyl like ZTCWMS016-MENGE, "可用量
       lv_MENGE like ZTCWMS016-MENGE,"总数量
       lv_LFIMG like lips-LFIMG,"交货单总数
       lv_dn    like lips-VBELN,"交货号
       p_guid LIKE ZTCWMS016-guid,

       GT_ZTCWMS016 LIKE TABLE OF ZTCWMS016 ,  " 日志内表
       GW_ZTCWMS016 LIKE LINE OF  GT_ZTCWMS016,
       GT_ZTCWMS018 LIKE TABLE OF ZTCWMS016 WITH HEADER LINE  ,  " 日志内表
       GW_ZTCWMS018 LIKE LINE OF  GT_ZTCWMS018.

  DATA:    GT_ZTCWMS017 LIKE TABLE OF ZTCWMS017 WITH HEADER LINE,  " 原始数据表
           GW_ZTCWMS017 LIKE LINE OF  GT_ZTCWMS017.


  DATA: BEGIN OF gw_ekpo,             "采购凭证项目内表
       EBELN LIKE ekpo-EBELN,
       EBELP LIKE ekpo-EBELP,
       MATNR LIKE ekpo-MATNR,
       MENGE like ekpo-MENGE,   "订单数量
       MENGE1 like ekpo-MENGE,   "交货单数量
       MENGE2 like ekpo-MENGE,   "还未交货数量
       END OF gw_ekpo.
  DATA: gt_ekpo LIKE STANDARD TABLE OF gw_ekpo with HEADER LINE.
  DATA: wa_cwms_in LIKE   ZST_CWMS009 .
  DATA: gv_uname      LIKE sy-uname.

  DATA: lv_sum   type ekpo-menge,
        lv_str   type string,
        lv_str1  type string.
  DATA: BEGIN OF gw_ekpo1,               " 准备收货采购订单行项目表

        EBELN LIKE ekpo-EBELN,
        EBELP LIKE ekpo-EBELP,
        MENGE like ekpo-MENGE,
        matnr like ekpo-matnr,
        owerks    like zst_cwms009-owerks,
        iwerks    like zst_cwms009-iwerks,
        olgort    like zst_cwms009-olgort,
        ilgort  like zst_cwms009-ilgort,
        END OF gw_ekpo1.
  DATA: gt_ekpo1 LIKE STANDARD TABLE OF gw_ekpo1  WITH HEADER LINE ,
        gt_ekpo2 LIKE STANDARD TABLE OF gw_ekpo1 WITH HEADER LINE .



  DATA: BEGIN OF gw_sum,             "
       iwerks like ZTCWMS017-iwerks,   "工厂
       matnr like ZTCWMS017-matnr,   "物料
       MENGE like ZTCWMS017-MENGE,   "数量
       zebeln like ztcwms017-zebeln, " cwms交货号
       owerks like ztcwms017-owerks, "输入工厂
       olgort like ztcwms017-olgort, " 输入仓库
       END OF gw_sum.
  DATA: gt_sum LIKE STANDARD TABLE OF gw_sum .

  DATA: GT_CWMS009 LIKE TABLE OF ZST_CWMS009 WITH HEADER LINE." 输入参数内表


  IF itb_cwms_in[] IS INITIAL.
    reid = 'E'.
    remsg = '您未发送数据'.
    EXIT.
  ENDIF.

  "校验重复
  SELECT * INTO TABLE GT_ZTCWMS016
    FROM ZTCWMS016
    FOR ALL ENTRIES IN itb_cwms_in

    WHERE zebeln = itb_cwms_in-zebeln.


  LOOP AT GT_ZTCWMS016[] INTO GW_ZTCWMS016.
    IF GW_ZTCWMS016 IS NOT INITIAL  AND GW_ZTCWMS016-REID5 = 'S'.
      reid = 'E'.
      remsg = '数据已重复发送'.
      EXIT.
    ENDIF.
  ENDLOOP.
  CLEAR: GT_ZTCWMS016, GW_ZTCWMS016.



****************  数据校验 ************************************
  clear: wa_cwms_in.

  LOOP AT itb_cwms_in INTO wa_cwms_in.
    add_pre_zero:wa_cwms_in-MATNR.
    IF wa_cwms_in-zebeln IS INITIAL.
      reid = 'E'.
      remsg = 'ZEBELN 不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-DOCLINENO IS INITIAL.
      reid = 'E'.
      remsg = 'SO单据不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-iwerks IS INITIAL.
      reid = 'E'.
      remsg = '收货工厂不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-ilgort IS INITIAL.
      reid = 'E'.
      remsg = '收货库存地不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-matnr IS INITIAL.
      reid = 'E'.
      remsg = 'matnr 不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-menge IS INITIAL.
      reid = 'E'.
      remsg = 'menge 不能为空'.
      EXIT.
    ENDIF.

    IF wa_cwms_in-owerks IS INITIAL.
      reid = 'E'.
      remsg = '发货工厂不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-olgort IS INITIAL.
      reid = 'E'.
      remsg = '发货库存地不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-cwmsname IS INITIAL.
      reid = 'E'.
      remsg = 'wmsname 不能为空'.
      EXIT.
    ENDIF.
    IF wa_cwms_in-budat IS INITIAL.
      reid = 'E'.
      remsg = '不能为空'.
      EXIT.
    ENDIF.
    " 更新上传原始日志到日志表
    MODIFY itb_cwms_in FROM  wa_cwms_in.

    clear: p_guid.
    call function 'GUID_CREATE'
      IMPORTING      "EV_GUID_16 = P_GUID.
        ev_guid_32 = p_guid."
    GW_ZTCWMS017-guid    =  p_guid.
    GW_ZTCWMS017-zebeln =  wa_cwms_in-zebeln.
    GW_ZTCWMS017-DOCLINENO =  wa_cwms_in-DOCLINENO.
    GW_ZTCWMS017-iwerks =  wa_cwms_in-iwerks.
    GW_ZTCWMS017-ilgort =  wa_cwms_in-ilgort.
    GW_ZTCWMS017-matnr =  wa_cwms_in-matnr.
    GW_ZTCWMS017-menge =  wa_cwms_in-menge.
    GW_ZTCWMS017-owerks =  wa_cwms_in-owerks.
    GW_ZTCWMS017-olgort =  wa_cwms_in-olgort.
    GW_ZTCWMS017-cwmsname =  wa_cwms_in-cwmsname.
    GW_ZTCWMS017-budat =  wa_cwms_in-budat.
    GW_ZTCWMS017-ZCDTE   = sy-datum.
    GW_ZTCWMS017-ZCIME   = sy-uzeit.
    append GW_ZTCWMS017 TO GT_ZTCWMS017[].
    gw_sum-matnr =  wa_cwms_in-matnr.
    gw_sum-zebeln =  wa_cwms_in-zebeln.
    gw_sum-owerks = wa_cwms_in-owerks.
    gw_sum-olgort = wa_cwms_in-olgort.
    gw_sum-menge =  wa_cwms_in-menge.
    gw_sum-iwerks =  wa_cwms_in-iwerks.
    COLLECT gw_sum  into gt_sum.
    CLEAR:wa_cwms_in, gw_ztcwms017 , gw_sum.
  ENDLOOP.
  MODIFY ZTCWMS017 FROM TABLE GT_ZTCWMS017[].
  COMMIT WORK.
  IF reid = 'E'.
    EXIT.
  ENDIF.

  clear: gw_sum.
  loop at gt_sum into gw_sum.
    add_pre_zero:gw_sum-MATNR.
    SELECT COUNT(*) FROM marc
     WHERE MATNR = gw_sum-MATNR
       and WERKS  = gw_sum-IWERKS.
    IF sy-subrc <> 0.
      REID  = 'E'.
      REMSG = '失败:物料在工厂下不存在'.
    ELSE.
      SELECT a~EBELN a~EBELP a~MATNR a~MENGE  " 找出这个供应商这种的采购订单
        FROM ekpo as a
        INNER JOIN ekko as b on a~EBELN = b~EBELN
        INTO CORRESPONDING FIELDS OF TABLE gt_EKPO
        WHERE a~MATNR = gw_sum-MATNR
          and a~WERKS = gw_sum-IWERKS
          and a~LOEKZ = space  "删除标识 L
          and a~ELIKZ <> 'X'   "交货完成
          and b~FRGKE = 'Y'    "审批标识
          and b~BSART = 'ZSTO'
          and b~LIFNR = '0008800106'.                       "0008800101
      delete_pre_zero:gw_sum-MATNR.
      SORT gt_EKPO by EBELN EBELP .
      clear:gw_EKPO.
      loop at gt_EKPO INTO gw_EKPO.               " 找出采购未交货单数
        SELECT sum( menge ) INTO gw_EKPO-menge1
          FROM EKBE
          WHERE EBELN = gw_EKPO-EBELN
           and EBELP = gw_EKPO-EBELP
           and VGABE = 8 ."交货单
        gw_EKPO-menge2 = gw_EKPO-menge - gw_EKPO-menge1.
        MODIFY gt_EKPO FROM gw_EKPO.
        CLEAR:gw_EKPO.
      ENDLOOP.

      "采购订单的交货单总数 >= 订单数量。
      "只要有交货单了,就不计算可交货数量了。
      DELETE gt_EKPO  WHERE menge2 <= 0.      " 删除货交完了的采购单

      "计算可交货的PO总数
      "   IMP_DATA-menge
      CLEAR:lv_sum.
      loop at gt_EKPO INTO gw_EKPO.     " 计算可交货的总数
        lv_sum = gw_EKPO-menge2 + lv_sum.
      ENDLOOP.
      if gw_sum-menge > lv_sum. "采购凭证数量不足
        REID  = 'E'.
        lv_str =  lv_sum.
        lv_str1 =  gw_sum-menge.
        CONCATENATE  '失败:SAP采购订单数量不足:' lv_str '小于' lv_str1
           INTO REMSG.
        ZEBELN =  gw_sum-ZEBELN.
      ELSE.
        REID  = 'S'.
        REMSG = '成功:采购订单读取成功'.
        ZEBELN =  gw_sum-ZEBELN.
      ENDIF.




      CLEAR:lv_sum.
      lv_sum = gw_sum-menge.  "


      SORT gt_EKPO by EBELN EBELP .
      CLEAR: gw_EKPO , wa_cwms_in .
      loop at gt_EKPO INTO gw_EKPO.   "这里就每一行与传输数量相比.

        READ TABLE itb_cwms_in INTO wa_cwms_in WITH  KEY matnr = gw_ekpo-matnr .

        IF lv_sum >=  gw_EKPO-menge2.

          gw_ekpo1-EBELN = gw_EKPO-EBELN.
          gw_ekpo1-EBELP = gw_EKPO-EBELP.
          gw_ekpo1-MENGE = gw_EKPO-menge2.
          gw_ekpo1-matnr = gw_ekpo-matnr.
          gw_ekpo1-owerks = wa_cwms_in-OWERKS.
          gw_ekpo1-iwerks = wa_cwms_in-iWERKS.
          gw_ekpo1-ilgort = wa_cwms_in-ilgort.
          gw_ekpo1-olgort = wa_cwms_in-olgort.
          APPEND  gw_ekpo1 to gt_ekpo1 .
        ELSE.

          gw_ekpo1-EBELN = gw_EKPO-EBELN.
          gw_ekpo1-EBELP = gw_EKPO-EBELP.
          gw_ekpo1-MENGE = lv_sum."最后点余量
          gw_ekpo1-matnr = gw_EKPO-matnr.
          gw_ekpo1-owerks = wa_cwms_in-OWERKS.
          gw_ekpo1-iwerks = wa_cwms_in-iWERKS.
          gw_ekpo1-ilgort = wa_cwms_in-ilgort.
          gw_ekpo1-olgort = wa_cwms_in-olgort.
          APPEND  gw_ekpo1 to gt_ekpo1 .
        ENDIF.
        lv_sum =  lv_sum - gw_EKPO-menge2.
        if lv_sum <= 0.
          exit.
        ENDIF.
        CLEAR: gw_EKPO , wa_cwms_in .

      ENDLOOP.
    ENDIF.

    "写日志到 ztcwms016



    if REID = 'S'.
      clear:p_guid.
      call function 'GUID_CREATE'
        IMPORTING      "EV_GUID_16 = P_GUID.
          ev_guid_32 = p_guid."
      LOOP at gt_ekpo1 into gw_ekpo1.

        READ TABLE itb_cwms_in INTO wa_cwms_in WITH  KEY matnr = gw_ekpo1-matnr .
        CLEAR: gv_uname.
        gv_uname = zcl_aip=>get_uname( ).
        gw_ztcwms016-zebeln  = wa_cwms_in-zebeln.
        GW_ZTCWMS016-guid    =  p_guid.
        GW_ZTCWMS016-ebeln   = gw_ekpo1-ebeln.
        GW_ZTCWMS016-ebelp   = gw_ekpo1-ebelp.
        GW_ZTCWMS016-MATNR   = gw_ekpo1-MATNR.
        GW_ZTCWMS016-CWMSNAME = wa_cwms_in-CWMSNAME.
        GW_ZTCWMS016-OWERKS  = gw_ekpo1-OWERKS.
        GW_ZTCWMS016-IWERKS  = gw_ekpo1-IWERKS.
        GW_ZTCWMS016-ilgort  = gw_ekpo1-ilgort.
        GW_ZTCWMS016-olgort  = gw_ekpo1-olgort.
        GW_ZTCWMS016-MENGE   = gw_ekpo1-MENGE.
        GW_ZTCWMS016-BZ1     = wa_cwms_in-BZ.
        GW_ZTCWMS016-ZCDTE   = sy-datum.
        GW_ZTCWMS016-ZCIME   = sy-uzeit.
        GW_ZTCWMS016-ernam   = gv_uname.
        GW_ZTCWMS016-ernam   = gv_uname.
        lv_MENGE = lv_MENGE + gw_ekpo1-MENGE. "总数
        APPEND gw_ZTCWMS016 to gt_ZTCWMS016.
      endloop.
      MODIFY ZTCWMS016 FROM TABLE  gt_ZTCWMS016[].
      COMMIT WORK.
      else.
      clear:p_guid.
      call function 'GUID_CREATE'
        IMPORTING      "EV_GUID_16 = P_GUID.
          ev_guid_32 = p_guid."
      LOOP at gt_ekpo1 into gw_ekpo1.
        READ TABLE itb_cwms_in INTO wa_cwms_in WITH  KEY matnr = gw_ekpo1-matnr .
        CLEAR: gv_uname.
        gv_uname = zcl_aip=>get_uname( ).
        gw_ztcwms016-zebeln  = wa_cwms_in-zebeln.
        GW_ZTCWMS016-guid    =  p_guid.
        GW_ZTCWMS016-ebeln   = gw_ekpo1-ebeln.
        GW_ZTCWMS016-ebelp   = gw_ekpo1-ebelp.
        GW_ZTCWMS016-MATNR   = gw_ekpo1-MATNR.
        GW_ZTCWMS016-CWMSNAME = wa_cwms_in-CWMSNAME.
        GW_ZTCWMS016-OWERKS  = gw_ekpo1-OWERKS.
        GW_ZTCWMS016-IWERKS  = gw_ekpo1-IWERKS.
        GW_ZTCWMS016-ilgort  = gw_ekpo1-ilgort.
        GW_ZTCWMS016-olgort  = gw_ekpo1-olgort.
        GW_ZTCWMS016-MENGE   = gw_ekpo1-MENGE.
        GW_ZTCWMS016-BZ1     = remsg.
        GW_ZTCWMS016-ZCDTE   = sy-datum.
        GW_ZTCWMS016-ZCIME   = sy-uzeit.
        GW_ZTCWMS016-ernam   = gv_uname.
        GW_ZTCWMS016-ernam   = gv_uname.
        APPEND gw_ZTCWMS016 to gt_ZTCWMS016.
      endloop.
      MODIFY ZTCWMS016 FROM TABLE  gt_ZTCWMS016[].
      COMMIT WORK.

      RETURN.

    endif.

  endloop.




  "库存 可用量检查
  LOOP at gt_ZTCWMS016 into gw_ZTCWMS016. "按物料汇总数量
    gw_ZTCWMS018-EBELN = ''.
    gw_ZTCWMS018-EBELP = ''.
    gw_ZTCWMS018-matnr = gw_ZTCWMS016-matnr.
    gw_ztcwms018-owerks = gw_ztcwms016-owerks.
    gw_ztcwms018-olgort = gw_ztcwms016-olgort.
    gw_ztcwms018-menge = gw_ztcwms016-menge.
    COLLECT gw_ztcwms018 into gt_ztcwms018 .
  ENDLOOP.

  CLEAR:LV_KYL,gw_ztcwms018.
  LOOP at gt_sum into gw_sum .
    "可用量检查
    READ TABLE gt_ztcwms018 INTO gw_ztcwms018 WITH  KEY matnr = gw_sum-matnr .

    PERFORM FRM_GET_KYL USING gw_ztcwms018-OWERKS gw_ztcwms018-OLGORT
                              gw_ztcwms018-MATNR  LV_kyl.
    IF gw_ztcwms018-MENGE >  LV_KYL.
      REID  = 'E'.
      CONCATENATE '物料'gt_ztcwms018-MATNR '库存不足,交货失败' into REMSG.

      " 更新日志
      CLEAR:gw_ztcwms016.
      LOOP at gt_ztcwms016 INTO gw_ztcwms016.
        gw_ztcwms016-REID1  = 'E'.
        CONCATENATE '物料'gw_ztcwms016-MATNR '库存不足,交货失败' into gw_ztcwms016-REMSG1.
        MODIFY gt_ztcwms016 FROM gw_ztcwms016.
        CLEAR:gw_ztcwms016.
      ENDLOOP.
      MODIFY ZTCWMS016 FROM TABLE gt_ztcwms016.
      COMMIT WORK.

      "程序结束,不再循环。
      RETURN.
    ENDIF.
    CLEAR:LV_KYL.
  ENDLOOP .

  "第一步:根据采购订单创建交货单
  SORT gt_ekpo1 by EBELN EBELP.
  LOOP at gt_ekpo1.
    SELECT SINGLE meins INTO lv_meins
      FROM mara
      WHERE matnr = gt_ekpo1-MATNR.
    WA_STOCK_TRANS_ITEMS-DLV_QTY    = gt_ekpo1-MENGE.    "采购订单数量
    WA_STOCK_TRANS_ITEMS-REF_DOC    = gt_ekpo1-EBELN.    "采购凭证号
    WA_STOCK_TRANS_ITEMS-REF_ITEM   = gt_ekpo1-EBELP.    "采购凭证的项目编号
    WA_STOCK_TRANS_ITEMS-SALES_UNIT = lv_meins.          "销售单位
    APPEND WA_STOCK_TRANS_ITEMS TO LT_STOCK_TRANS_ITEMS.
    CLEAR:WA_STOCK_TRANS_ITEMS,lv_meins.
  ENDLOOP.
  "根据采购订单创建交货单
  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
*     EXPORTING
*       SHIP_POINT              =
*       DUE_DATE                =
*       DEBUG_FLG               =
    IMPORTING
      DELIVERY                = L_DELIVERY
      NUM_DELIVERIES          = L_NUM_DELIVERIES
    TABLES
      STOCK_TRANS_ITEMS       = LT_STOCK_TRANS_ITEMS
*    SERIAL_NUMBERS          =
*    EXTENSION_IN            =
      DELIVERIES              = LT_DELIVERIES
      CREATED_ITEMS           = LT_CREATED_ITEMS
*    EXTENSION_OUT           =
      RETURN                  = LT_RETURN.
  "执行结果判断
  CLEAR WA_RETURN.
  LOOP AT LT_RETURN INTO WA_RETURN WHERE TYPE = 'E' OR ( TYPE = 'W' AND NUMBER = '030').
    EXIT.
  ENDLOOP.
  IF SY-SUBRC <> 0 AND LINES( LT_STOCK_TRANS_ITEMS ) = LINES( LT_CREATED_ITEMS ) .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.

    VBELN = L_DELIVERY."交货单号
    CONCATENATE REMSG '交货单DN创建成功->' INTO REMSG.
    "更新日志
    CLEAR:GW_ZTCWMS016.
    LOOP at GT_ZTCWMS016 into gw_ZTCWMS016 .

      Gw_ZTCWMS016-VBELN = L_DELIVERY."交货单号
      Gw_ZTCWMS016-REID2  = 'S'.
      Gw_ZTCWMS016-REMSG2  = '交货单DN创建成功'.
      MODIFY GT_ZTCWMS016 from gw_ztcwms016 .
      CLEAR:Gw_ZTCWMS016.
    ENDLOOP.
    MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
    COMMIT WORK.

    "第二步:更新交货单库位
    WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
    WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
    CLEAR:GW_EKPO1.
    READ TABLE gt_ekpo1 INTO GW_EKPO1 INDEX 1.
    LOOP AT LT_CREATED_ITEMS INTO WA_CREATED_ITEMS.
      LT_BAPIOBDLVITEMCHG-DELIV_NUMB      = L_DELIVERY.
      LT_BAPIOBDLVITEMCHG-DELIV_ITEM      = WA_CREATED_ITEMS-DELIV_ITEM. "交货单行项目.
      LT_BAPIOBDLVITEMCHG-FACT_UNIT_NOM   = 1.
      LT_BAPIOBDLVITEMCHG-FACT_UNIT_DENOM = 1.
      LT_BAPIOBDLVITEMCHG-MATERIAL        = WA_CREATED_ITEMS-MATERIAL.
      APPEND LT_BAPIOBDLVITEMCHG.
      CLEAR LT_BAPIOBDLVITEMCHG.

      LT_BAPIOBDLVITEMCHG_C-DELIV_NUMB  = L_DELIVERY.
      LT_BAPIOBDLVITEMCHG_C-DELIV_ITEM  = WA_CREATED_ITEMS-DELIV_ITEM.  "交货项目
      APPEND LT_BAPIOBDLVITEMCHG_C.
      CLEAR LT_BAPIOBDLVITEMCHG_C.

      WA_ITEM_DATA_SPL-DELIV_NUMB  = L_DELIVERY.   "交货
      WA_ITEM_DATA_SPL-DELIV_ITEM  = WA_CREATED_ITEMS-DELIV_ITEM.  "交货项目
      WA_ITEM_DATA_SPL-PICK_DENIAL = 'X'.          "拣配拒绝标记

      WA_ITEM_DATA_SPL-STGE_LOC    = GW_EKPO1-OLGORT."库存地点 都相同
      APPEND WA_ITEM_DATA_SPL TO LT_ITEM_DATA_SPL.
    ENDLOOP.
    "交货单库位更新
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        HEADER_DATA    = WA_HEADER_DATA
        HEADER_CONTROL = WA_HEADER_CONTROL
        DELIVERY       = L_DELIVERY
      TABLES
        ITEM_DATA      = LT_BAPIOBDLVITEMCHG[]
        ITEM_CONTROL   = LT_BAPIOBDLVITEMCHG_C[]
        RETURN         = LT_RETURN
        ITEM_DATA_SPL  = LT_ITEM_DATA_SPL.

    READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
    IF SY-SUBRC <> 0.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      CONCATENATE REMSG 'DN库位更新成功->' INTO REMSG.
      "更新日志
      CLEAR:GW_ZTCWMS016.
      LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
        GW_ZTCWMS016-REID3  = 'S'.
        GW_ZTCWMS016-REMSG3 = 'DN库位更新成功' .
        MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016 .
        CLEAR:GW_ZTCWMS016.
      ENDLOOP.
      MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
      COMMIT WORK.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CONCATENATE REMSG 'DN库位更新失败!' INTO REMSG.
      "更新日志
      CLEAR:GW_ZTCWMS016.
      LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
        GW_ZTCWMS016-REID3  = 'E'.
        CONCATENATE 'DN库位更新失败:' WA_RETURN-MESSAGE INTO GW_ZTCWMS016-REMSG3.
        MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
        CLEAR:GW_ZTCWMS016.
      ENDLOOP.
      MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
      COMMIT WORK.


      "删除交货单
      CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
          LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
      WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
      WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA    = WA_HEADER_DATA
          HEADER_CONTROL = WA_HEADER_CONTROL
          DELIVERY       = L_DELIVERY
        TABLES
          ITEM_DATA      = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL   = LT_BAPIOBDLVITEMCHG_C[]
          RETURN         = LT_RETURN
          ITEM_DATA_SPL  = LT_ITEM_DATA_SPL.
      READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
      IF SY-SUBRC <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      ENDIF.
    ENDIF.
  ELSE.
    "创建交货单出错
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    CONCATENATE REMSG '交货单DN创建失败:' WA_RETURN-MESSAGE INTO REMSG.
    "更新日志
    CLEAR: GW_ZTCWMS016.
    LOOP at GT_ZTCWMS016[] INTO GW_ZTCWMS016.
      GW_ZTCWMS016-REID3 = 'E'.
      CONCATENATE '交货单DN创建失败:' WA_RETURN-MESSAGE INTO GW_ZTCWMS016-REMSG3.
      MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
      CLEAR:GW_ZTCWMS016.
    ENDLOOP.

    MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016 .
    COMMIT WORK.
    EXIT.
  ENDIF.

  CLEAR:GW_ZTCWMS016.
  READ TABLE GT_ZTCWMS016 INTO  GW_ZTCWMS016 INDEX 1.

  "检查交货单数量
  lv_dn = L_DELIVERY.
  add_pre_zero:lv_dn.
  IF GW_ZTCWMS016-REID2 = 'S' and GW_ZTCWMS016-REID3 = 'S' .
    SELECT sum( LFIMG ) into lv_LFIMG
      from LIPS
      where VBELN = lv_dn.
    if lv_menge <> lv_LFIMG.

      "删除交货单
      CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
          LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
      WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
      WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
      WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          HEADER_DATA    = WA_HEADER_DATA
          HEADER_CONTROL = WA_HEADER_CONTROL
          DELIVERY       = L_DELIVERY
        TABLES
          ITEM_DATA      = LT_BAPIOBDLVITEMCHG[]
          ITEM_CONTROL   = LT_BAPIOBDLVITEMCHG_C[]
          RETURN         = LT_RETURN
          ITEM_DATA_SPL  = LT_ITEM_DATA_SPL.
      READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
      IF SY-SUBRC <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      ENDIF.
      "更新日志
      CLEAR:GW_ZTCWMS016.
      LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
        GW_ZTCWMS016-REID4 = 'E'.
        CONCATENATE  REMSG 'SAP创建的交货单数量不正确'  INTO GW_ZTCWMS016-REMSG4.
        MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
        CLEAR:GW_ZTCWMS016.
      ENDLOOP.
      MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
      COMMIT WORK.
      REID = 'E'.
      REMSG = 'SAP创建的交货单数量不正确,需重传'.
    endif.
  endif.

  CLEAR:GW_ZTCWMS016.
  READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
  IF GW_ZTCWMS016-REID1 = 'E' or GW_ZTCWMS018-REID2 = 'E'.
    EXIT.
  ENDIF.


  "第三步:交货单交货过账产生物料凭证
  WA_VBKOK-WADAT_IST = SY-DATUM."过账日期
  WA_VBKOK-VBELN_VL = L_DELIVERY.  "交货单
  WA_VBKOK-WABUC = 'X'.                          "自动过帐货物移动
  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      VBKOK_WA                 = WA_VBKOK
      DELIVERY                 = L_DELIVERY
      UPDATE_PICKING           = 'X'
      IF_DATABASE_UPDATE       = '1'             "COMMIT = 'X' 异步更新
      IF_ERROR_MESSAGES_SEND_0 = 'X'
    IMPORTING
      EF_ERROR_ANY_0           = L_EF_ERROR_ANY_0
    TABLES
      PROT                     = LT_PROT
    EXCEPTIONS
      ERROR_MESSAGE            = 1
      OTHERS                   = 2.

  "结果判断
  IF SY-SUBRC = 0 AND LT_PROT[] IS INITIAL.
    COMMIT WORK AND WAIT.
    SELECT SINGLE MAX( VBELN )
               INTO  GW_ZTCWMS016-VBELN1  "过账凭证
              FROM VBFA
              WHERE VBELV = WA_VBKOK-VBELN_VL "交货单
              AND VBTYP_N = 'R'
              AND PLMIN = '+'.

    MBLNR =  GW_ZTCWMS016-VBELN1.
    CONCATENATE REMSG 'DN发货成功。' INTO REMSG.
    "更新日志
    CLEAR: GW_ZTCWMS016.
    LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
      GW_ZTCWMS016-REID5 = 'S'.
      GW_ZTCWMS016-REMSG5 = 'DN发货成功' .
      GW_ZTCWMS016-MBLNR = MBLNR.
      MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
      CLEAR:GW_ZTCWMS016.
    ENDLOOP.
    MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
    COMMIT WORK.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    CONCATENATE REMSG 'DN发货失败!' INTO REMSG.
    "更新日志
    CLEAR: GW_ZTCWMS016.
    LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
      GW_ZTCWMS016-REID5 = 'E'.
      GW_ZTCWMS016-REMSG5 = 'DN发货失败' .
      MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
      CLEAR:GW_ZTCWMS016.
    ENDLOOP.
    MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016.
    COMMIT WORK.
    "删除交货单
    CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
        LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
    WA_HEADER_DATA-DELIV_NUMB    = L_DELIVERY.
    WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
    WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
    CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
      EXPORTING
        HEADER_DATA    = WA_HEADER_DATA
        HEADER_CONTROL = WA_HEADER_CONTROL
        DELIVERY       = L_DELIVERY
      TABLES
        ITEM_DATA      = LT_BAPIOBDLVITEMCHG[]
        ITEM_CONTROL   = LT_BAPIOBDLVITEMCHG_C[]
        RETURN         = LT_RETURN
        ITEM_DATA_SPL  = LT_ITEM_DATA_SPL.
    READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE  = 'E'.
    IF SY-SUBRC <> 0.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
    ENDIF.
    EXIT.
  ENDIF.

  CLEAR:GW_ZTCWMS016.
  READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
  IF GW_ZTCWMS016-REID3 = 'E'.
    EXIT.
  ENDIF.
  "

  "返回消息:产生交货号,更新库位,交货过账三个步骤都成功才返回成功。
  CLEAR:GW_ZTCWMS016.
  READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
  if GW_ZTCWMS016-REID2 = 'S' and GW_ZTCWMS016-REID3 = 'S'
     and GW_ZTCWMS016-REID5 = 'S'.

    REID = 'S'.
  ENDIF.



ENDFUNCTION.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值