BAPI:采购申请修改(撤批-->修改-…

可以结合BAPI和ME54N查看效果

其实修改采购申请,可以直接调用BAPI修改,没必要撤批审批
而且调用审批的时候,经常发生一种现象:直接执行审批出错,debug进去发现没问题,都能成功,
具体原因不是很清楚,猜测是系统太快,一级审批没走完就进行二级审批,然后就报错了,
解决方案之一是每级审批后,等一秒……




"1、撤批
    SELECT SINGLE frggr                                                 "审批组
                 frgst                                                  "批准策略
                 frgzu                                                  "审批状态
           INTO (l_frggr, l_frgst ,l_frgzu)
           FROM eban
          WHERE banfn = l_wa-banfn                                  "采购申请号
            AND bnfpo = l_wa_-bnfpo.                                 "行项目号

    "各级审批
    SELECT SINGLE
      frgc1
      frgc2
      frgc3
      frgc4
      frgc5
      FROM t16fs
      INTO (l_frgc1,l_frgc2,l_frgc3,l_frgc4,l_frgc5)
     WHERE frggr = l_frggr
       AND frgsx = l_frgst.

    l_rel_code = l_frgc1.
  
    "如果想指定到某一级的撤批,选择t16fs-frgc1  t16fs-frgc2  t16fs-frgc3  分别三级撤批
    l_rel_code = l_frgc1."这里是扯批到创建者,
    
    CALL FUNCTION 'BAPI_REQUISITION_RESET_RELEASE'
      EXPORTING
        number                   = l_wa_preq_data-banfn                       "采购申请号
        item                     = l_wa_preq_data-bnfpo                       "行项目号
        rel_code                 = l_rel_code
      EXCEPTIONS
        authority_check_fail     = 1
        requisition_not_found    = 2
        enqueue_fail             = 3
        prerequisite_fail        = 4
        release_already_posted   = 5
        responsibility_fail      = 6
        no_release_already       = 7
        no_new_release_indicator = 8
        OTHERS                   = 9.
    IF sy-subrc NE 0.
      异常处理
    ENDIF.

    "2、修改数量和交货日期
  DATA: lt_items_old    LIKE TABLE OF bapiebanv   WITH HEADER LINE.
  DATA: lt_items_new    LIKE TABLE OF bapiebanv   WITH HEADER LINE.
  DATA: lt_items        LIKE TABLE OF bapieban    WITH HEADER LINE.
  DATA: lt_account      LIKE TABLE OF bapiebkn    WITH HEADER LINE.
  DATA: lt_bapireturn   LIKE TABLE OF bapireturn  WITH HEADER LINE.
  DATA: number          TYPE bapieban-preq_no.

    number = l_wa-banfn.

    CALL FUNCTION 'BAPI_REQUISITION_GETDETAIL'
      EXPORTING
        number             = number
        account_assignment = 'X'
      TABLES
        requisition_items  = lt_items.


    READ TABLE lt_items WITH KEY preq_item = l_wa-bnfpo.
    IF sy-subrc = 0.
      MOVE-CORRESPONDING lt_items TO lt_items_old.
      APPEND lt_items_old.
      CLEAR lt_items_old.
      MOVE-CORRESPONDING lt_items TO lt_items_new.

      lt_items_new-quantity     = l_wa-menge_m.
      lt_items_new-deliv_date   = l_wa-lfdat_m.

      APPEND lt_items_new.
      CLEAR lt_items_new.
    ENDIF.

    CALL FUNCTION 'BAPI_REQUISITION_CHANGE'
      EXPORTING
        number                = l_wa-banfn
      TABLES
        requisition_items_old = lt_items_old
        requisition_items_new = lt_items_new
        return                = lt_return.

 *异常处理 lt_return……

    "3、审批
     "如果想指定到某一级的撤批, rel_code选择t16fs-frgc1  t16fs-frgc2  t16fs-frgc3  
     "分别三级审批,必须一级级审批,不能跨级
     "审批 必须分级审批
   
    "获取审批级别
    l_shenpi = strlen( l_frgzu ).

    DO l_shenpi TIMES.               "一级级审批

      CLEAR l_rel_code.
      CASE sy-index.
        WHEN 1.
          l_rel_code = l_frgc1.
        WHEN 2.
          l_rel_code = l_frgc2.
        WHEN 3.
          l_rel_code = l_frgc3.
        WHEN 4.
          l_rel_code = l_frgc4.
        WHEN 5.
          l_rel_code = l_frgc5.
      ENDCASE.

      CALL FUNCTION 'BAPI_REQUISITION_RELEASE'
        EXPORTING
          number                 = l_wa_057-banfn         "采购申请号
          item                   = l_wa_057-bnfpo         "行项目号
          rel_code               = l_rel_code
        TABLES
          return                 = lt_return
        EXCEPTIONS
          authority_check_fail   = 1
          requisition_not_found  = 2
          enqueue_fail           = 3
          prerequisite_fail      = 4
          release_already_posted = 5
          responsibility_fail    = 6
          OTHERS                 = 7.
      IF sy-subrc NE 0.
*        MESSAGE  
      ENDIF.

    ENDDO.

    CLEAR l_wa_preq_data.




"最开始使用的修改bapi是BAPI_PR_CHANGE,
发现执行后,没有报错,但是采购申请并没有修改
一直查原因,网上说跟服务采购申请有关,具体没深入研究
    lt_pritem-preq_item  =  l_wa_preq_data-bnfpo.                             "行项目号
    lt_pritem-quantity   =  l_wa_preq_data-menge_m.                           "数量
    lt_pritem-deliv_date =  l_wa_preq_data-lfdat_m.                           "交货日期
    APPEND lt_pritem.
    "影子字段,交货日期和数量打修改标示
    lt_pritemx-deliv_date = 'X'.                               
    lt_pritemx-quantity = 'X'.
    APPEND lt_pritemx.

    "修改采购申请BAPI
    CALL FUNCTION 'BAPI_PR_CHANGE'
      EXPORTING
        number  = l_wa_preq_data-banfn                                        "采购申请号
      TABLES
        return  = lt_return
        pritem  = lt_pritem
        pritemx = lt_pritemx.


最后,提供一个比较完整的采购申请修改的例子:
data: lt_items_old    like table of bapiebanv   with header line.
data: lt_items_new    like table of bapiebanv   with header line.
data: lt_account_old  like table of bapiebknv   with header line.
data: lt_account_new  like table of bapiebknv   with header line.
data: lt_items        like table of bapieban    with header line.
data: lt_account      like table of bapiebkn    with header line.
data: lt_bapireturn   like table of bapireturn  with header line.

call function 'BAPI_REQUISITION_GETDETAIL'
  exporting
    number                         = i_banfn
    account_assignment             = 'X'
  tables
    requisition_items              = lt_items
    requisition_account_assignment = lt_account.

loop at lt_items.
  move-corresponding lt_items to lt_items_old.
  append lt_items_old.
  clear lt_items_old.
  move-corresponding lt_items to lt_items_new.
  loop at t_eban where bnfpo = lt_items-preq_item.
    lt_items_new-short_text   = t_eban-txz01.
    lt_items_new-store_loc    = t_eban-lgort. "库存地点
    lt_items_new-quantity     = t_eban-menge.
    lt_items_new-unit         = t_eban-meins.
    lt_items_new-deliv_date   = t_eban-lfdat.
    lt_items_new-mat_grp      = t_eban-matkl.
    lt_items_new-store_loc    = t_eban-lgort.
    lt_items_new-pur_group    = t_eban-ekgrp.
    lt_items_new-c_amt_bapi   = t_eban-preis.
    lt_items_new-trackingno   = t_eban-bednr.
    lt_items_new-currency     = t_eban-waers.
    lt_items_new-price_unit   = t_eban-peinh.
  endloop.
  append lt_items_new.
  clear lt_items_new.
endloop.

loop at lt_account.
  move-corresponding lt_account to lt_account_old.
  append lt_account_old.
  clear lt_account_old.
  move-corresponding lt_account to lt_account_new.
  loop at t_ebkn where bnfpo  = lt_account-preq_item.
    lt_account_new-wbs_elem_e = t_ebkn-ps_psp_pnr.
    lt_account_new-g_l_acct   = t_ebkn-sakto.
    lt_account_new-cost_ctr   = t_ebkn-kostl.
    lt_account_new-asset_no   = t_ebkn-anln1.
    lt_account_new-order_no   = t_ebkn-aufnr.
    lt_account_new-co_area    = t_ebkn-kokrs.
  endloop.
  append lt_account_new.
  clear lt_account_new.
endloop.

loop at t_eban.
  read table lt_items with key preq_item = t_eban-bnfpo.
  if sy-subrc <> 0.
    lt_items_new-preq_item  = t_eban-bnfpo. "采购申请的项目编号
    lt_items_new-short_text = t_eban-txz01.
    lt_items_new-store_loc  = t_eban-lgort. "库存地点
    lt_items_new-quantity   = t_eban-menge.
    lt_items_new-unit       = t_eban-meins.
    lt_items_new-deliv_date = t_eban-lfdat.
    lt_items_new-mat_grp    = t_eban-matkl.
    lt_items_new-store_loc  = t_eban-lgort.
    lt_items_new-pur_group  = t_eban-ekgrp.
    lt_items_new-c_amt_bapi = t_eban-preis.
    lt_items_new-trackingno = t_eban-bednr.
    lt_items_new-currency   = t_eban-waers.
    lt_items_new-price_unit = t_eban-peinh.
    lt_items_new-des_vendor = t_eban-lifnr. "期望的供应商
    lt_items_new-fixed_vend = t_eban-flief. "固定的供应商
    lt_items_new-info_rec   = t_eban-infnr. "采购信息记录的编号
    lt_items_new-purch_org  = t_eban-ekorg. "采购组织
    append lt_items_new.
    clear lt_items_new.
  endif.

endloop.

loop at t_ebkn.
  read table lt_account with key preq_item = t_ebkn-bnfpo.
  if sy-subrc <> 0.
    lt_account_new-preq_item  = t_ebkn-bnfpo.
    lt_account_new-wbs_elem_e = t_ebkn-ps_psp_pnr.
    lt_account_new-g_l_acct   = t_ebkn-sakto.
    lt_account_new-cost_ctr   = t_ebkn-kostl.
    lt_account_new-asset_no   = t_ebkn-anln1.
    lt_account_new-order_no   = t_ebkn-aufnr.
    lt_account_new-co_area    = t_ebkn-kokrs.

    append lt_account_new.
    clear lt_account_new.
  endif.
endloop.

call function 'BAPI_REQUISITION_CHANGE'
  exporting
    number                  = i_banfn
  tables
    requisition_items_old   = lt_items_old
    requisition_items_new   = lt_items_new
    requisition_account_old = lt_account_old
    requisition_account_new = lt_account_new
    return                  = lt_bapireturn.
http://blog.sina.com.cn/sapliumeng
原文地址:https://www.cnblogs.com/senlinmu110/p/3802182.html