当前位置: 代码迷 >> 综合 >> BAPI:采购申请修改(撤批--修改--重新审批)_SAP刘梦_新浪博客
  详细解决方案

BAPI:采购申请修改(撤批--修改--重新审批)_SAP刘梦_新浪博客

热度:12   发布时间:2024-01-18 15:26:58.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.

欢迎关注订阅号:SAP学习记录 (SAPlearning )

PO <wbr><wbr><wbr>text <wbr><wbr><wbr>copy <wbr><wbr><wbr>rules <wbr><wbr><wbr>:copy <wbr><wbr><wbr>PR <wbr><wbr><wbr>item <wbr><wbr><wbr>text <wbr><wbr><wbr>to <wbr><wbr><wbr>PO