惯例闲话:最近忙于项目上的事情,遇到的可吐槽的事情很多,更新不是很快,请诸位见谅。
回归正题,这个聊聊结算规则的维护问题。
先简单回顾下结算规则。
对于结算型WBS而言,结算规则的维护是一个很常规的业务操作,财务部门人员在建项目或期末结账的时候,确定结算规则并维护。
结算规则的简单理解——把WBS比作一个篮子,过程中收集了各种各样成本和费用比作篮子里的物品,现在这个篮子的使命结束了,要把篮子里的东西拿出来装进指定的箱子。这里,指定的箱子,就是结算规则。
闲人请教了一位工程财务大拿,他的例子更简单易懂——WBS就是个瓢,瓢里水满了,要倒入财务的大缸里面。
结算规则最容易被吐槽的一个地方,是维护的复杂性。对于1、结构较简单的项目而言,用户还能勉强接受
2、WBS的结算规则一样,用户也能勉强接受,可以CJB2批量刷
但是,对于结构庞大,且各个层级的WBS结算规则都有不同的情况下,那么手工维护肯定是不能落地的。
诸位肯定不约而同想到了BDC程序,这也是前几年闲人的一贯做法,但是BDC程序终究不稳定,最近项目上又再次遇到了结算规则多样的结构,这次闲人表示不再对BDC妥协了,想办法搞一搞,万一成功了呢?
果然在BIng上英文搜索找到了一些线索,沿着线索找到了这个函数K_SRULE_SAVE_UTASK。
后面的事情就简单了,贴源代码
FUNCTION zfm_ps_wbssettle_update.
*"----------------------------------------------------------------------
"“本地接口:
*” IMPORTING
*" REFERENCE(I_PSPID) TYPE PS_PSPID
*" EXPORTING
*" REFERENCE(ES_RETURN) TYPE BAPIRET2
*" TABLES
*" IT_WBS_STL STRUCTURE ZSPS_WBSSETTLE
*" ET_RETURN STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
DATA: lt_wbs_stl TYPE TABLE OF zsps_wbssettle,
ls_wbs_stl TYPE zsps_wbssettle,
lt_cobrb TYPE TABLE OF cobrb,
ls_cobrb TYPE cobrb.
lt_wbs_stl[] = it_wbs_stl[]."输入表赋值
IF lt_wbs_stl[] IS INITIAL.
es_return-type = ‘E’.
es_return-message = ‘结算表参数未赋值’.
RETURN.
ELSE."继续搞事情
ENDIF.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_cobrb
FROM cobrb
FOR ALL ENTRIES IN lt_wbs_stl
WHERE objnr = lt_wbs_stl-objnr."检查结算规则是否存在。
IF lt_cobrb[] IS NOT INITIAL."有数据的情况下,删除
CALL FUNCTION ‘K_SRULE_SAVE_UTASK’
TABLES
t_cobrb_delete = lt_cobrb
EXCEPTIONS
srule_utask_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
es_return-type = 'E'.
es_return-message = '已存在结算规则且删除失败,请检查项目是否被占用'.
RETURN.
ELSE."继续搞事情
COMMIT WORK.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDIF.
CLEAR:lt_cobrb[].
LOOP AT lt_wbs_stl INTO ls_wbs_stl.
***完全结算
CALL FUNCTION 'CONVERSION_EXIT_PERBZ_INPUT'
EXPORTING
input = 'FUL'
IMPORTING
output = ls_cobrb-perbz.
按WBS层级分配结算规则后期做配置表
CASE ls_wbs_stl-zkonty.
WHEN 'PSG'."****结算规则类型-首层1获利能力段****
CALL FUNCTION 'CONVERSION_EXIT_OBART_INPUT' "内外码转换
EXPORTING
input = ls_wbs_stl-zkonty
IMPORTING
output = ls_cobrb-konty
EXCEPTIONS
not_found = 1
OTHERS = 2.
WHEN 'G/L' ."****结算规则类型-下层WBS总账科目****
CALL FUNCTION 'CONVERSION_EXIT_OBART_INPUT' "内外码转换
EXPORTING
input = ls_wbs_stl-zkonty
IMPORTING
output = ls_cobrb-konty
EXCEPTIONS
not_found = 1
OTHERS = 2.
ls_cobrb-hkont = ls_wbs_stl-empge."结算接收方_总账科目
WHEN OTHERS.
ENDCASE.
ls_cobrb-objnr = ls_wbs_stl-objnr."对象号
ls_cobrb-lfdnr = '0000001'. "分配规则的顺序号码
ls_cobrb-kokrs = 'CSCE'. "成本控制范围
ls_cobrb-prozs = '100.00'. "结算百分比
ls_cobrb-bukrs = ls_wbs_stl-pbukr."公司代码
APPEND ls_cobrb TO lt_cobrb.
ENDLOOP.
CALL FUNCTION ‘K_SRULE_SAVE_UTASK’
TABLES
t_cobrb_insert = lt_cobrb
EXCEPTIONS
srule_utask_error = 1
OTHERS = 2.
IF sy-subrc NE 0.
es_return-type = ‘E’.
es_return-message = ‘维护失败’.
ELSE.
es_return-type = ‘S’.
es_return-message = ‘维护成功’.
ENDIF.
CLEAR:lt_wbs_stl[],lt_cobrb[].
ENDFUNCTION.
运行结果
小结:这个函数2012年左右出来,期间由于各种BUG没有被广泛使用,2018年更新后,bing上有不少老外分享了一部分使用经验,但是还是要多结合业务场景测试才能跑通。