闲人闲谈PS之二十二——WBS结算规则批量维护函数

惯例闲话:最近忙于项目上的事情,遇到的可吐槽的事情很多,更新不是很快,请诸位见谅。

回归正题,这个聊聊结算规则的维护问题。
先简单回顾下结算规则。
对于结算型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上有不少老外分享了一部分使用经验,但是还是要多结合业务场景测试才能跑通。

猜你喜欢

转载自blog.csdn.net/weixin_47375646/article/details/121118619
今日推荐