修改交货单(修改时增加批次、批次拆分、序列号)并实现拣配,不进行过账操作(SD_DELIVERY_UPDATE_PICKING、BAPI_OUTB_DELIVERY_CHANGE)

FUNCTION zif_sd_002.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     VALUE(CODE) TYPE  CHAR1
*"     VALUE(MESSAGE) TYPE  CHAR200
*"  TABLES
*"      PICK STRUCTURE  ZSD_DN_PICK OPTIONAL
*"      PSN STRUCTURE  ZSD_P_SN OPTIONAL
*"      TRETURN STRUCTURE  ZSD_RET OPTIONAL
*"  EXCEPTIONS
*"      SYSTEM_FAILURE
*"      COMMUNICATION_FAILURE
*"----------------------------------------------------------------------


  DATA:header_data LIKE bapiobdlvhdrchg"Delivery header
  DATA:header_control LIKE bapiobdlvhdrctrlchg"delivery header control
  DATA:i_delivery_no LIKE bapiobdlvhdrchg-deliv_numb"deliver number
  DATA:techn_control LIKE bapidlvcontrol"TECHN_CONTROL
  DATA:item_data LIKE bapiobdlvitemchg OCCURS WITH HEADER LINE"ITEM_DATA delivery item
  DATA:item_control LIKE bapiobdlvitemctrlchg OCCURS WITH HEADER LINE"ITEM_CONTROL
  DATA:item_serial_no LIKE bapidlvitmserno OCCURS WITH HEADER LINE.
  DATA:return LIKE bapiret2 OCCURS WITH HEADER LINE"Return
  DATA:wa_pick TYPE zsd_dn_pick.
  DATA:deliv_item LIKE bapiobdlvitemchg-deliv_item.
  DATA:lt_psn TYPE TABLE OF zsd_p_sn WITH HEADER LINE.
  DATA:l_count TYPE i.
  DATA:l_charg LIKE mseg-charg.

  DATA i_vbkok   LIKE vbkok"Delivery header
         i_vbpok   LIKE vbpok OCCURS WITH HEADER LINE"Delivery Picking
         vbkok_wa  TYPE vbkok,
         vbpok_tab TYPE vbpok OCCURS WITH HEADER LINE,
         lt_prott  TYPE TABLE OF prott,
         lt_prott1 TYPE TABLE OF prott,
         ls_prott  TYPE prott.

  DATA:l_flag(1).


  DATA:ls_delivery_return TYPE bapiret2 .
  DATA:str TYPE string.
  DATA:i_message TYPE string.

  SORT pick BY vbeln posnr.

  lt_psn[] psn[].

*Set Delivery Header data
  LOOP AT pick.
    MOVE-CORRESPONDING pick TO wa_pick.
    AT NEW vbeln.
      CLEAR i_delivery_no.
      CLEAR header_data.
      CLEAR techn_control.
      CLEAR header_control.

      REFRESH item_data.
      CLEAR item_data.

      REFRESH item_control.
      CLEAR item_control.

      REFRESH item_serial_no.
      CLEAR item_serial_no.

      REFRESH i_vbpok.
      CLEAR i_vbpok.

      REFRESH vbpok_tab.
      CLEAR vbpok_tab.

      CLEAR deliv_item.

      CLEAR l_flag.

      deliv_item '900000'.

      i_delivery_no             wa_pick-vbeln."'0080249529'.
      header_data-deliv_numb    i_delivery_no.
      techn_control-upd_ind     'U'.
      header_control-deliv_numb i_delivery_no.


      CLEAR i_vbkok.
      i_vbkok-vbeln_vl i_delivery_no.
      i_vbkok-wabuc 'X'"Post Good Issue Automatic
      i_vbkok-wadat_ist sy-datum.

      CLEAR vbkok_wa.
      vbkok_wa-vbeln_vl i_delivery_no.

      CLEAR l_charg.
      CLEAR l_count.
      LOOP AT lt_psn WHERE vbeln wa_pick-vbeln AND posnr wa_pick-posnr.
        l_count l_count + 1.
        l_charg lt_psn-charg.
      ENDLOOP.

      IF l_count > AND l_charg <> ''.
        l_flag '1'.
      ELSEIF  l_count <= AND l_charg <> ''.
        l_flag '2'.
      ELSEIF  l_count >= AND l_charg ''.
        l_flag '3'.
      ENDIF.
    ENDAT.

    "处理需要批次拆分的行项目
    IF l_flag '1'.
      LOOP AT lt_psn WHERE vbeln wa_pick-vbeln AND posnr wa_pick-posnr.
        deliv_item deliv_item + 1.
        item_data-deliv_numb i_delivery_no.
        item_data-deliv_item deliv_item.                  "'900001'.
        item_data-hieraritem wa_pick-posnr."'40'.            "The batch split record below delivery item hierary
        item_data-usehieritm '1'.
        item_data-material   wa_pick-matnr."'W065B0X030601002'.
        item_data-batch      lt_psn-charg."'BCFA2907'.
        item_data-dlv_qty    lt_psn-lfimg.
        item_data-fact_unit_nom   1.
        item_data-fact_unit_denom 1.
        APPEND item_data.
        CLEAR item_data.

        CLEAR item_control.
        READ TABLE item_control WITH KEY deliv_numb i_delivery_no deliv_item wa_pick-posnr.
        IF sy-subrc <> 0.
          item_control-deliv_numb i_delivery_no.
          item_control-deliv_item wa_pick-posnr."'40'.
          item_control-chg_delqty 'X'.
          APPEND item_control.
          CLEAR item_control.
        ENDIF.

        item_control-deliv_numb i_delivery_no.
        item_control-deliv_item deliv_item.               "'900001'.
        item_control-chg_delqty 'X'.
        APPEND item_control.
        CLEAR item_control.


        CLEAR i_vbpok.
        i_vbpok-vbeln_vl i_delivery_no"Delivery NO
        i_vbpok-posnr_vl deliv_item"Delivery Item
        i_vbpok-vbeln    i_delivery_no"Delivery NO
        i_vbpok-posnn    deliv_item"Delivery Item
        i_vbpok-matnr    wa_pick-matnr.
        i_vbpok-charg    lt_psn-charg.
        i_vbpok-lfimg    lt_psn-lfimg"Actual quantity delivered (in sales units)
        APPEND i_vbpok.

        CLEARvbpok_tab.
        vbpok_tab-vbeln_vl i_delivery_no.
        vbpok_tab-posnr_vl deliv_item.
        vbpok_tab-vbeln    i_delivery_no.
        vbpok_tab-posnn    deliv_item.
        vbpok_tab-charg    lt_psn-charg."批次
        vbpok_tab-matnr    wa_pick-matnr."物料
        vbpok_tab-pikmg    lt_psn-lfimg."实际已交货量(按销售单位)
        vbpok_tab-meins    wa_pick-vrkme."基本计量单位

        APPEND vbpok_tab.
      ENDLOOP.
    ELSEIF l_flag '2'.

      LOOP AT lt_psn WHERE vbeln wa_pick-vbeln AND posnr wa_pick-posnr.
        item_data-deliv_numb i_delivery_no.
        item_data-deliv_item wa_pick-posnr.               "'900001'.
        item_data-material   wa_pick-matnr."'W065B0X030601002'.
        item_data-batch      lt_psn-charg."'BCFA2907'.
        item_data-dlv_qty    lt_psn-lfimg.
        item_data-fact_unit_nom   1.
        item_data-fact_unit_denom 1.
        APPEND item_data.
        CLEAR item_data.

        item_control-deliv_numb i_delivery_no.
        item_control-deliv_item wa_pick-posnr."'40'.
        item_control-chg_delqty 'X'.
        APPEND item_control.
        CLEAR item_control.

        CLEAR i_vbpok.
        i_vbpok-vbeln_vl i_delivery_no"Delivery NO
        i_vbpok-posnr_vl wa_pick-posnr"Delivery Item
        i_vbpok-vbeln    i_delivery_no"Delivery NO
        i_vbpok-posnn    wa_pick-posnr"Delivery Item
        i_vbpok-matnr    wa_pick-matnr.
        i_vbpok-charg    lt_psn-charg.
        i_vbpok-lfimg    lt_psn-lfimg"Actual quantity delivered (in sales units)
        APPEND i_vbpok.

        CLEARvbpok_tab.
        vbpok_tab-vbeln_vl i_delivery_no.
        vbpok_tab-posnr_vl wa_pick-posnr.
        vbpok_tab-vbeln    i_delivery_no.
        vbpok_tab-posnn    wa_pick-posnr.
        vbpok_tab-charg    lt_psn-charg."批次
        vbpok_tab-matnr    wa_pick-matnr."物料
        vbpok_tab-pikmg    lt_psn-lfimg."实际已交货量(按销售单位)
        vbpok_tab-meins    wa_pick-vrkme."基本计量单位

        APPEND vbpok_tab.

      ENDLOOP.
    ELSEIF l_flag '3'.

      item_data-deliv_numb i_delivery_no.
      item_data-deliv_item =  wa_pick-posnr.                "'900001'.
      item_data-material   wa_pick-matnr."'W065B0X030601002'.
      item_data-dlv_qty    wa_pick-lfimg.
      item_data-fact_unit_nom   1.
      item_data-fact_unit_denom 1.
      APPEND item_data.
      CLEAR item_data.

      item_control-deliv_numb i_delivery_no.
      item_control-deliv_item wa_pick-posnr."'40'.
      item_control-chg_delqty 'X'.
      APPEND item_control.
      CLEAR item_control.

      LOOP AT psn WHERE vbeln wa_pick-vbeln AND posnr wa_pick-posnr.
        item_serial_no-deliv_numb i_delivery_no.
        item_serial_no-itm_number wa_pick-posnr.
        item_serial_no-serialno   psn-sernr.
        APPEND item_serial_no.
        CLEAR item_serial_no.
      ENDLOOP.

      CLEAR i_vbpok.
      i_vbpok-vbeln_vl i_delivery_no"Delivery NO
      i_vbpok-posnr_vl wa_pick-posnr"Delivery Item
      i_vbpok-vbeln    i_delivery_no"Delivery NO
      i_vbpok-posnn    wa_pick-posnr"Delivery Item
      i_vbpok-matnr    wa_pick-matnr.
      i_vbpok-charg    ''.
      i_vbpok-lfimg    wa_pick-lfimg"Actual quantity delivered (in sales units)
      APPEND i_vbpok.

      CLEARvbpok_tab.
      vbpok_tab-vbeln_vl i_delivery_no.
      vbpok_tab-posnr_vl wa_pick-posnr.
      vbpok_tab-vbeln    i_delivery_no.
      vbpok_tab-posnn    wa_pick-posnr.
      vbpok_tab-charg    ''."批次
      vbpok_tab-matnr    wa_pick-matnr."物料
      vbpok_tab-pikmg    wa_pick-lfimg."实际已交货量(按销售单位)
      vbpok_tab-meins    wa_pick-vrkme."基本计量单位

      APPEND vbpok_tab.

    ENDIF.

    AT END OF vbeln.
      CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
        EXPORTING
          header_data    header_data
          header_control header_control
          delivery       i_delivery_no
          techn_control  techn_control
        TABLES
          item_data      item_data
          item_control   item_control
          item_serial_no item_serial_no
          return         return.
      CLEAR return.
      READ TABLE return WITH KEY type 'E'.
      IF sy-subrc NE 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait 'X'.

        "修改拣配数量
        CALL FUNCTION 'SD_DELIVERY_UPDATE_PICKING'
          EXPORTING
            vbkok_wa  vbkok_wa
            synchron  'X'
          TABLES
            vbpok_tab vbpok_tab
            prot      lt_prott1.

        READ TABLE lt_prott1 INTO ls_prott WITH KEY msgty 'E'.
        IF sy-subrc EQ 0.
          LOOP AT lt_prott1  INTO ls_prott  WHERE msgty CA  'AE' .
            CALL FUNCTION 'MESSAGE_TEXT_BUILD'
              EXPORTING
                msgid               ls_prott-msgid
                msgnr               ls_prott-msgno
                msgv1               ls_prott-msgv1
                msgv2               ls_prott-msgv2
                msgv3               ls_prott-msgv3
                msgv4               ls_prott-msgv4
              IMPORTING
                message_text_output str.

            IF i_message IS INITIAL .
              MOVE str TO i_message .
            ELSE .
              CONCATENATE i_message '/' str INTO i_message .
            ENDIF .
          ENDLOOP .

          treturn-vbeln i_delivery_no.
          treturn-zflag 'E'.
          treturn-zmessage '交货单修改批次成功,拣配失败!'.
        ELSE.
          treturn-vbeln i_delivery_no.
          treturn-zflag 'S'.
          treturn-zmessage '交货单拣配成功!'.
        ENDIF.
      ELSE.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        LOOP AT return  INTO ls_delivery_return  WHERE type CA  'AE' .

          CALL FUNCTION 'MESSAGE_TEXT_BUILD'
            EXPORTING
              msgid               ls_delivery_return-id
              msgnr               ls_delivery_return-number
              msgv1               ls_delivery_return-message_v1
              msgv2               ls_delivery_return-message_v2
              msgv3               ls_delivery_return-message_v3
              msgv4               ls_delivery_return-message_v4
            IMPORTING
              message_text_output str.

          IF i_message IS INITIAL .
            MOVE str TO i_message .
          ELSE .
            CONCATENATE i_message '/' str INTO i_message .
          ENDIF .
        ENDLOOP .
        treturn-vbeln i_delivery_no.
        treturn-zflag 'E'.
        treturn-zmessage i_message.
      ENDIF.
      APPEND treturn.
      CLEAR treturn.
    ENDAT.
  ENDLOOP.

ENDFUNCTION.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值