可以结合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 )