修改交货单(修改时增加批次、批次拆分、序列号)并实现拣配,不进行过账操作(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 .

         CLEAR vbpok_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 .

         CLEAR vbpok_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 .

       CLEAR vbpok_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、付费专栏及课程。

余额充值