修改采购订单,服务型采购订单

  DATA: wa_item     TYPE  zmodifypurorder_tab.
  DATA: wa_services TYPE  zmodifypurorder_tab2.

  DATA:ext_line  TYPE n LENGTH 10.
  DATA:line_no   TYPE n LENGTH 10.
  DATA:pckg_no   TYPE n LENGTH 10.
  DATA:subpckg_no TYPE n LENGTH 10.
  DATA:serial_no TYPE n LENGTH .

  DATA:interval    TYPE STANDARD TABLE OF inriv,
       wa_interval TYPE inriv.

  pckg_no   '0000000000'"软件包号
  line_no   '0000000001'"内部行编号
  ext_line  '0000000000'"行号
  serial_no '00'        "帐户分配的顺序编号


  IF i_header-ebeln IS INITIAL.
    msg_type 'E'.
    message '采购订单号为空'.
    EXIT.
  ENDIF.

  DATA:pocondheader    TYPE STANDARD TABLE OF  bapimepocondheader,
       wa_pocondheader TYPE  bapimepocondheader,
       pocondheaderx    TYPE STANDARD TABLE OF  bapimepocondheaderx,
       wa_pocondheaderx LIKE  bapimepocondheaderx.


  IF i_header-loekz 'X'."整个删除采购订单
    gs_poheader-po_number   = i_header-ebeln."采购凭证号
    gs_poheader-delete_ind  'X'."采购凭证中的删除标识
    gs_poheaderx-po_number  'X'."采购凭证号
    gs_poheaderx-delete_ind 'X'."采购凭证中的删除标识

  ELSE.
    gs_poheader-po_number   = i_header-ebeln."采购凭证号
    gs_poheader-comp_code   = i_header-bukrs"公司代码 bukrs  公司代码
    gs_poheader-purch_org   = i_header-ekorg"采购组织 ekorg  采购组织
    gs_poheader-pur_group   = i_header-ekgrp"采购组 ekgrp  采购组
    gs_poheaderx-po_number  'X'."采购凭证号
    gs_poheaderx-comp_code  'X'."公司代码
    gs_poheaderx-purch_org  'X'."采购组织
    gs_poheaderx-pur_group  'X'."采购组

    LOOP AT it_items INTO wa_item.
      CALL METHOD z_itf_utils=>add_zero
        CHANGING
          c_input = wa_item-ebelp.
      CALL METHOD z_itf_utils=>add_zero
        CHANGING
          c_input = wa_item-matnr.



      IF wa_item-loekz 'X'."行项目有删除标识
        gwa_item-po_item    = wa_item-ebelp."采购凭证的项目编号
        gwa_item-material   = wa_item-matnr."物料号
        gwa_item-delete_ind 'X'."采购凭证中的删除标识
        APPEND gwa_item TO gt_item.

        gwa_itemx-po_item    = wa_item-ebelp."采购凭证的项目编号
        gwa_itemx-po_itemx   'X'."采购凭证的项目编号
        gwa_itemx-material   'X'."物料号
        gwa_itemx-delete_ind 'X'."采购凭证中的删除标识
        APPEND gwa_itemx TO gt_itemx.


      ELSE." 行项目有更新
        IF wa_item-matnr IS INITIAL."服务型订单
          CLEAR:gwa_item,gwa_itemx.
          SELECT SINGLE packno INTO pckg_no FROM ekpo
              WHERE ebeln = i_header-ebeln AND ebelp = wa_item-ebelp.

          ext_line    =  '0000000000' ."行号
          line_no     =  '0000000001' ."内部行编号

          IF pckg_no IS INITIAL.
            CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
              EXPORTING
                object 'SERVICE'.

            CALL FUNCTION 'NUMBER_GET_NEXT' "读取编号范围
              EXPORTING
                nr_range_nr   '01'
                object        'SERVICE'
              IMPORTING
                number        = pckg_no .

            CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'"解锁
              EXPORTING
                object 'SERVICE'.
          ENDIF.

          CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
            EXPORTING
              input  = pckg_no
            IMPORTING
              output = pckg_no.

          gwa_item-po_item        = wa_item-ebelp  ."采购凭证的项目编号 ebelp  采购凭证的项目编号
          gwa_item-plant          = wa_item-mwerks "收货工厂 name1  工厂
          gwa_item-stge_loc       = wa_item-mlgort "收货库存地点   lgobe  库存地点
          gwa_item-tax_code       = wa_item-mwskz  "税码      mwskz  销售/购买税代码
          gwa_item-short_text     = wa_item-ktext1 ."'加入新的冷冻液' 短文本
          gwa_item-net_price      = wa_item-netpr."净价
          gwa_item-po_price       '2'"价格采纳:1 = 总值, 2 = 净值
          gwa_item-price_unit     = wa_item-peinh"价格单位


          gwa_item-acctasscat     = wa_item-knttp  ." 'F'   KNTTP 科目分配类别
          gwa_item-item_cat       = wa_item-epstp  ." 'D'   epstp  采购凭证中的项目类别
          gwa_item-matl_group     = wa_item-matkl  ." 'Z003'   物料组
          gwa_item-pckg_no        = pckg_no.
          gwa_item-delete_ind     ' '."采购凭证中的删除标识
          APPEND gwa_item TO gt_item.


          gwa_itemx-po_item        = wa_item-ebelp  ."采购凭证的项目编号
          gwa_itemx-plant          'X'"收货工厂
          gwa_itemx-stge_loc       'X'"收货库存地点
          gwa_itemx-tax_code       'X'"税码
          gwa_itemx-net_price      'X'.
          gwa_itemx-po_price       'X'.
          gwa_itemx-price_unit     'X'.
          gwa_itemx-short_text     'X'.
          gwa_itemx-pckg_no        'X'.
          gwa_itemx-delete_ind     'X'."采购凭证中的删除标识
          gwa_itemx-acctasscat     'X'.  "
          gwa_itemx-item_cat       'X'.
          gwa_itemx-matl_group     'X'.
          APPEND gwa_itemx TO gt_itemx.


          "服务订单概要行  头包
          gwa_poservices-pckg_no    = pckg_no  .            " 66628
          gwa_poservices-line_no    = line_no  ."内部行编号 1
          gwa_poservices-ext_line   = ext_line .            "行号 00000
          gwa_poservices-outl_level '0'.
          gwa_poservices-outl_no    ' '.
          gwa_poservices-outl_ind   'X'.
          gwa_poservices-edition    '0000'.


          SELECT SINGLE sub_packno INTO subpckg_no FROM esll WHERE packno = pckg_no.
          IF subpckg_no IS INITIAL .
            CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
              EXPORTING
                object 'SERVICE'.

            CALL FUNCTION 'NUMBER_GET_NEXT' "读取编号范围
              EXPORTING
                nr_range_nr   '01'
                object        'SERVICE'
              IMPORTING
                number        = subpckg_no .

            CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'"解锁
              EXPORTING
                object 'SERVICE'.
          ENDIF.
          gwa_poservices-subpckg_no  = subpckg_no  ."66629

          APPEND gwa_poservices TO gt_poservices.


          "服务包数据
          LOOP AT it_services INTO wa_services WHERE ebelp = wa_item-ebelp  ."采购凭证的项目编号                        "开始处理服务明细           

 ext_line  = ext_line +  10  ."行号            
SELECT SINGLE introw INTO line_no FROM esll" 内部行编号               
WHERE packno = subpckg_no AND extrow = ext_line.            
IF sy-subrc <> '0' .             

 line_no   = line_no  +  1   ."内部行编号            
ENDIF.


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'              
EXPORTING                
input  = ext_line              
IMPORTING                
output = ext_line.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'              
EXPORTING                
input  = line_no              
IMPORTING                
output = line_no.

            gwa_poservices-pckg_no       = subpckg_no   ."66629  子包
            gwa_poservices-line_no       = line_no   ."内部行编号  2
            gwa_poservices-ext_line      = ext_line  ."行号        10
            gwa_poservices-subpckg_no    '0000000000' .
            gwa_poservices-outl_level    '0'          .
            gwa_poservices-edition       '0000'       .
            gwa_poservices-ovf_tol       '0'          .
            gwa_poservices-short_text    = wa_services-ktext1."  短文本
            gwa_poservices-quantity      = wa_services-menge ." 数量带标记
            gwa_poservices-base_uom      = wa_services-meins ." 基本计量单位
            gwa_poservices-gr_price      = wa_services-brtwr ." 总价
            gwa_poservices-tax_code      = wa_item-mwskz     ." 销售/购买税代码
*           gwa_poservices-matl_group    = wa_item-matkl     ." 物料组
*           gwa_poservices-DELETE_IND = ."删除标识
            gwa_poservices-price_chg     'X'."允许价格更改
            APPEND gwa_poservices TO gt_poservices.

 

 

            serial_no  =  serial_no +  1  ."账户分配规范序号:服务行            
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'              
    EXPORTING                
      input  = serial_no              
    IMPORTING                
      output = serial_no.

            gwa_povalues-pckg_no        = subpckg_no ."66629            

    gwa_povalues-line_no        = line_no    ."内部行编号  2           

     gwa_povalues-serno_line     = serial_no  ."账户分配规范序号:服务行           

    gwa_povalues-serial_no      = serial_no  ."帐户分配的顺序编号            

    gwa_povalues-quantity       = wa_services-menge.            

    gwa_povalues-net_value      = wa_services-brtwr.            
    APPEND gwa_povalues TO gt_povalues  .

 

*------总账科目
            gwa_poaccount-po_item     = wa_item-ebelp."采购凭证的项目编号 .
            gwa_poaccount-serial_no   = serial_no    "账户分配规范序号:服务行
            gwa_poaccount-gl_account  = wa_item-sakto."总账科目编号
            gwa_poaccount-costcenter  = wa_item-kostl."成本中心
            gwa_poaccount-co_area     'XF00'       .
            CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
              EXPORTING
                input  = wa_item-aufnr
              IMPORTING
                output = wa_item-aufnr.
            gwa_poaccount-orderid      = wa_item-aufnr."内部订单号
            APPEND gwa_poaccount TO gt_poaccount.

            gwa_poaccountx-po_item     = wa_item-ebelp."采购凭证的项目编号
            gwa_poaccountx-serial_no   = serial_no    ."帐户分配的顺序编号
            gwa_poaccountx-gl_account  =  'X'         .
            gwa_poaccountx-costcenter  =  'X'         .
            gwa_poaccountx-co_area     =  'X'         .
            gwa_poaccountx-orderid     =  'X'         .
            APPEND gwa_poaccountx TO gt_poaccountx.

 



 

 "修改服务行的明细数据还要修改条件值:

            gwa_pocond-itm_number = wa_item-ebelp.
            gwa_pocond-cond_type  'P001'.    " Give the pricing condition type that derives netprice
            gwa_pocond-cond_value = wa_services-menge * wa_services-brtwr.
            gwa_pocond-currency   'CNY'.
            gwa_pocond-change_id  'U'.
            APPEND gwa_pocond TO gt_pocond.

            gwa_pocondx-itm_number  = wa_item-ebelp.
            gwa_pocondx-itm_numberx 'X'.
            gwa_pocondx-cond_type   'X'.
            gwa_pocondx-cond_value  'X'.
            gwa_pocondx-currency    'X'.
            gwa_pocondx-change_id   'X'.
            APPEND gwa_pocondx TO  gt_pocondx            .


CLEAR:wa_services,gwa_poservices,gwa_povalues,gwa_poaccount,gwa_poaccountx,gwa_pocond,gwa_pocondx
.          
ENDLOOP."服务行明细处理          
          CLEAR:  pckg_no   ,"软件包号                  

    subpckg_no,                  

    line_no,"内部行编号                  

    ext_line  ,"行号                 

     serial_no ."帐户分配的顺序编号







****************************************************************************************************************        
ELSE."普通的采购订单 
          gwa_item-po_item        = wa_item-ebelp  ."采购凭证的项目编号 ebelp  采购凭证的项目编号
          gwa_item-material       = wa_item-matnr  ."物料号
          gwa_item-plant          = wa_item-mwerks "收货工厂 name1  工厂
          gwa_item-stge_loc       = wa_item-mlgort "收货库存地点   lgobe  库存地点
*         gwa_item-quantity       = wa_item-erfmg  . "采购订单数量       menge  采购订单数量
          gwa_item-tax_code       = wa_item-mwskz  "税码      mwskz  销售/购买税代码
          gwa_item-net_price      = wa_item-netpr."净价
          gwa_item-po_price       '2'"价格采纳:1 = 总值, 2 = 净值
          gwa_item-price_unit     = wa_item-peinh"价格单位
          gwa_item-short_text     = wa_item-ktext1 ."'加入新的冷冻液' 短文本
          gwa_item-matl_group     = wa_item-matkl  ." 'Z003'   物料组
          gwa_item-pckg_no        = pckg_no.
          APPEND gwa_item TO gt_item.



          gwa_itemx -po_item        = wa_item-ebelp  ."采购凭证的项目编号          gwa_itemx
-material       'X'  ."物料号          gwa_itemx
-plant          'X'"收货工厂          gwa_itemx
-stge_loc       'X'"收货库存地点
*         gwa_itemx-quantity       = 'X'. "采购订单数量          gwa_itemx
-tax_code       'X'"税码          gwa_itemx
-net_price      'X'.          gwa_itemx
-po_price       'X'.          gwa_itemx
-price_unit     'X'.          gwa_itemx
-short_text     'X'.          gwa_itemx
-matl_group     'X'.          gwa_itemx
-pckg_no        'X'.          
APPEND gwa_itemx TO gt_itemx.        
ENDIF.

        "交货日期的处理        gwa_poschedule
-po_item        = wa_item-ebelp"采购凭证的项目编号        gwa_poschedule
-del_datcat_ext 'D'."交货日期的类别        
IF wa_item-eeind IS NOT INITIAL.          gwa_poschedule
-delivery_date  = wa_item-eeind."交货日期        
ENDIF.        gwa_poschedule

-quantity       = wa_item-erfmg."采购订单数量        
APPEND gwa_poschedule TO gt_poschedule.        gwa_poschedulex

-po_item        = wa_item-ebelp"采购凭证的项目编号        gwa_poschedulex
-del_datcat_ext 'X'."交货日期的类别        gwa_poschedulex
-delivery_date  'X'."交货日期        gwa_poschedulex
-quantity       'X'."采购订单数量        
APPEND gwa_poschedulex TO gt_poschedulex.      
ENDIF.

      CLEAR: wa_item,gwa_item, gwa_itemx,gwa_povalues,gwa_poservices,      gwa_poschedule
,gwa_poschedulex,      gwa_poaccount
,gwa_poaccountx.    
ENDLOOP.  
ENDIF.


  CLEAR: gt_return, gwa_return.  
CALL FUNCTION 'BAPI_PO_CHANGE'    
EXPORTING      purchaseorder                
= i_header-ebeln      poheader                     
= gs_poheader      poheaderx                    
= gs_poheaderx
*     POADDRVENDOR                 =
*     TESTRUN                      =
*     MEMORY_UNCOMPLETE            =
*     MEMORY_COMPLETE              =
*     POEXPIMPHEADER               =
*     POEXPIMPHEADERX              =
*     VERSIONS                     =
*     NO_MESSAGING                 =
*     NO_MESSAGE_REQ               =
*     NO_AUTHORITY                 =
*     NO_PRICE_FROM_PO             =
*     PARK_UNCOMPLETE              =
*     PARK_COMPLETE                =
*   IMPORTING
*     EXPHEADER                    =
*     EXPPOEXPIMPHEADER            =   
TABLES     
return                       = gt_return     poitem                       
= gt_item     poitemx                      
= gt_itemx
*     POADDRDELIVERY               =     poschedule                   
= gt_poschedule     poschedulex                  
= gt_poschedulex     poaccount                    
= gt_poaccount
*     POACCOUNTPROFITSEGMENT       =     poaccountx                   
= gt_poaccountx
*     pocondheader                 = pocondheader
*     pocondheaderx                = pocondheaderx     pocond                       
= gt_pocond     pocondx                      
= gt_pocondx
*     POLIMITS                     =
*     POCONTRACTLIMITS             =     poservices                   
= gt_poservices     posrvaccessvalues            
= gt_povalues
*     POSERVICESTEXT               =
*     EXTENSIONIN                  =
*     EXTENSIONOUT                 =
*     POEXPIMPITEM                 =
*     POEXPIMPITEMX                =
*     POTEXTHEADER                 =
*     POTEXTITEM                   =
*     ALLVERSIONS                  =
*     POPARTNER                    =
*     POCOMPONENTS                 =
*     POCOMPONENTSX                =
*     POSHIPPING                   =
*     POSHIPPINGX                  =
*     POSHIPPINGEXP                =
*     POHISTORY                    =
*     POHISTORY_TOTALS             =
*     POCONFIRMATION               =
*     SERIALNUMBER                 =
*     SERIALNUMBERX                =
*     INVPLANHEADER                =
*     INVPLANHEADERX               =
*     INVPLANITEM                  =
*     INVPLANITEMX                 =
*     POHISTORY_MA                 = 
.

 


  LOOP AT gt_return INTO gwa_return WHERE type 'E' OR type 'A'.    msg_type 
'E'.    
EXIT.    
CLEAR gwa_return.  
ENDLOOP.  
IF msg_type EQ 'E'.    
message '采购订单修改失败. '.    
CLEAR gwa_return.    
LOOP AT gt_return INTO gwa_return.      
IF gwa_return-type 'E' OR gwa_return-type 'A'.        
CONCATENATE message gwa_return-message INTO message.      
ENDIF.      
CLEAR gwa_return.    
ENDLOOP.    
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.  
ELSE.
*   提交所做得更改    
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'      
EXPORTING        
wait 'X'.    
IF sy-subrc 0.      msg_type 
'S'.      
message '采购订单修改成功. '.      

IF i_header-contractno IS NOT INITIAL.        
UPDATE ekko           
SET contractno = i_header-contractno contractname = i_header-contractname           
WHERE ebeln = i_header-ebeln.      
ENDIF.    

ELSE.      msg_type 
'E'.      
message '采购订单修改失败: 未知异常. '.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.    
ENDIF.  
ENDIF.

posted @ 2019-10-31 10:32  纱缚之印  阅读(273)  评论(0编辑  收藏  举报