当前位置: 代码迷 >> 综合 >> BAPI:采购申请修改(撤批--gt;修改-…
  详细解决方案

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

热度:70   发布时间:2024-01-18 14:50:38.0
可以结合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.