前面介绍使用Function Module:KBPP_EXTERN_UPDATE_CO进行CJ41时,可能出现概算不能完全更新的问题,提示概算比已有的概算小等等,其他几篇博文也提到该问题,总之,想要一次更新全部的概算,成功的机会不大。
分析问题原因,如果我需要将一个WBS节点的概算调大,如果你不从该WBS的上层先加大概算,那么直接修改就会报错,反之如果需要将一个WBS节点的概算调整小,那么应该从根节点向上层次逐层修改,可是,如果出现有的层次调整变大,有的变小,那么就复杂了。
有没有简单的办法呢?经过调试,其实即使报错,也有部分节点更新成功,使用同一组数据,多执行几次,就全部修改完了。所以为了简化程序,将同一组数据多次调用该函数,发现有错误就再次调用,完全没有错误,就停止执行。执行的次数,同你的数据中WBS有几层,示例代码如下:
sort lt_wbs by stufe.
loop at lt_wbs into ls_wbs.
clear lt_bpak.
select single objnr into lt_bpak-e_objnr
from prps
where pspnr = ls_wbs-pspnr.
lt_bpak-e_vorga = 'KSTP'.
lt_bpak-e_versn = '000'.
lt_bpak-twaer = cns_waers.
lt_bpak-wert = ls_wbs-zgssum.
append lt_bpak.
endloop.
"循环调用BAPI,次数与项目层次数量相同
data:l_times type i.
data: l_flag type c.
sort lt_wbs by stufe descending.
read table lt_wbs into ls_wbs index 1.
l_times = ls_wbs-stufe.
do l_times times.
refresh lt_return[].
call function 'KBPP_EXTERN_UPDATE_CO'
exporting
i_budget_activity = 'KSTP'
* I_BUDGET_ACTIV_SUP_RET = ' '
* I_COMMIT_DATA = ' '
i_delta_amounts = '' "X表示追加,空表示替代
i_rollup_data = '' "X表示向顶层汇总
* I_CHECK_PLAN_DATA = ''
* I_APPLICATION =
i_commit_all = 'X'
* IMPORTING
* E_ERRORS_FOUND =
tables
it_bpak = lt_bpak
it_return = lt_return
exceptions
no_update = 1
others = 2
.
clear l_flag.
loop at lt_return where type = 'E'.
l_flag = 'X'.
endloop.
if l_flag is initial.
exit. "若没有错误,退出循环
endif.
enddo.
loop at lt_return where type = 'E'.
l_flag = 'X'.
exit.
* message E000 with '项目概算更新失败:' LT_RETURN-MESSAGE.
endloop.
if l_flag is initial.
commit work.
message s000 with '项目' p_pspid '概算更新成功。'.
else.
rollback work.
endif.