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