获取WBS的预算

业务需求

根据输入的WBS,获取对应的总体预算,如果获取不到,就取上层WBS的总体预算

业务前台查看WBS预算

CJ31(可以通过CJ30修改预算)

FH0024W037项目的预算数据:

SH0224Z028项目的预算数据(其中SH0224Z028001已占用预算7):

数据库相关说明

①PRPS --- WBS(工作中断结构) 元素主数据---WBS的基础数据

PSPNR : WBS的内部编号,8位长度

POSID : WBS的外部编号,在前台界面看到的,24位长度。

PSPNR与POSID的转换例程:CONVERSION_EXIT_ABPSP_INPUT  /  CONVERSION_EXIT_ABPSP_OUTPUT

OBJNR : 开头的两个字母代表了不同的成本控制范围,TBO01表保存了所有对象的说明,其中PR代表 WBS。故WBS的对象编号都是以PR开头的。

②PRHI ---工作分解结构,边缘(层次指针)---WBS的层级数据

ABAP代码

关键函数:KBPR_READ_DATA

DATA : L_WAERS TYPE TWAER,
       BEGIN OF LS_IN ,
         POSID TYPE PRPS-POSID,
       END OF LS_IN,
       LT_IN LIKE TABLE OF LS_IN ,     "需要查找的WBS
       BEGIN OF LS_OUT ,
         POSID TYPE PS_POSID,          "WBS
         PSPNR TYPE PS_POSNR,          "WBS 要素
         GJAHR TYPE GJAHR,             "财年
         WAERS TYPE TWAER,             "货币
         WTGEV TYPE BP_WGTV,           "总预算
         WTGES TYPE BP_WGT,            "已用预算
         KYYS  TYPE BP_WGT,            "可用预算
       END OF LS_OUT ,
       LT_OUT   LIKE TABLE OF LS_OUT , "总体预算数据

       BEGIN OF LS_OBJNR,
         OBJNR TYPE BP_OBJEKT,
       END OF LS_OBJNR,
       LT_BPCU  TYPE TABLE OF BPCU,     "货币
       LT_OBJNR LIKE TABLE OF LS_OBJNR, "需要查询的WBS的对象编号(PRPS-OBJNR)
       LT_VALUE TYPE TABLE OF CO_WRTTP, "值类型
       LT_BPTR  TYPE TABLE OF BPTR,     "基础数据
       LT_BPGE  TYPE TABLE OF BPGE,     "总体预算数据
       LT_BPJA  TYPE TABLE OF BPJA.     "年度预算数据

"1-传入需要查询的WBS数据
LT_IN = VALUE #( ( POSID = 'SH0224Z028001' )
                 ( POSID = 'FH0024W03701002' )
                 ( POSID = 'FH0024W03702' ) ).
L_WAERS = 'CNY'.


"2-准备WBS相关数据:对象编号及其上层WBS数据
SELECT PRPS~PSPNR,
       PRPS~POSID,
       PRHI~UP,
       PRPS~OBJNR
  FROM PRPS
  INNER JOIN PRHI ON PRHI~POSNR = PRPS~PSPNR
  INNER JOIN @LT_IN AS A ON A~POSID = PRPS~POSID
  INTO TABLE @DATA(LT_IN_WBS).

CHECK LT_IN_WBS IS NOT INITIAL .

DATA(LT_IN_WBS_MIN_1) = LT_IN_WBS .

DO .
  SELECT DISTINCT
         PRPS~PSPNR,
         PRPS~POSID,
         PRHI~UP,
         PRPS~OBJNR
    FROM PRPS
    INNER JOIN PRHI ON PRHI~POSNR = PRPS~PSPNR
    INNER JOIN @LT_IN_WBS_MIN_1 AS A ON A~UP = PRPS~PSPNR
    INTO TABLE @DATA(LT_IN_WBS_MIN_2).

  IF LT_IN_WBS_MIN_2 IS INITIAL .
    EXIT .
  ELSE .
    APPEND LINES OF LT_IN_WBS_MIN_2 TO LT_IN_WBS .
    CLEAR LT_IN_WBS_MIN_1 .
    LT_IN_WBS_MIN_1 = LT_IN_WBS_MIN_2 .
    DELETE LT_IN_WBS_MIN_1 WHERE UP IS INITIAL .
    IF LT_IN_WBS_MIN_1 IS INITIAL .
      EXIT .
    ENDIF .
  ENDIF .
ENDDO .

"此时LT_IN_WBS存放的是WBS及其上层WBS数据
SORT LT_IN_WBS BY POSID .
delete ADJACENT DUPLICATES FROM LT_IN_WBS COMPARING POSID .


"3-通过函数获取原始预算数据
LT_BPCU = VALUE #( ( WAERS = L_WAERS ) ).
LT_VALUE = VALUE #( ( '42' ) ).                      "42:已分配的预算
MOVE-CORRESPONDING LT_IN_WBS TO LT_OBJNR .

CALL FUNCTION 'KBPR_READ_DATA'
  TABLES
    TAB_BPCU  = LT_BPCU
    TAB_OBJNR = LT_OBJNR
    TAB_VALUE = LT_VALUE
    BP_TR     = LT_BPTR
    BP_GE     = LT_BPGE
    BP_JA     = LT_BPJA.


"4-整合数据
LOOP AT LT_IN INTO LS_IN.
  CLEAR : LS_OUT .

  READ TABLE LT_IN_WBS WITH KEY POSID = LS_IN-POSID INTO DATA(LS_IN_WBS).
  IF SY-SUBRC = 0 .
    MOVE-CORRESPONDING LS_IN_WBS TO LS_OUT .
    LS_OUT-WAERS = L_WAERS.                       "货币

    "总体预算
    DO .
      READ TABLE LT_BPGE INTO DATA(LS_BPGE) WITH KEY OBJNR = LS_IN_WBS-OBJNR .
      IF SY-SUBRC = 0 .
        LS_OUT-WTGEV = LS_BPGE-WTGEV.                 "总预算
        LS_OUT-WTGES = LS_BPGE-WTGES.                 "已用预算
        LS_OUT-KYYS  = LS_BPGE-WTGEV - LS_BPGE-WTGES. "可用预算
        EXIT .
      ELSE .
        READ TABLE LT_IN_WBS WITH KEY PSPNR = LS_IN_WBS-UP INTO LS_IN_WBS .
        IF SY-SUBRC <> 0 .
          EXIT .
        ENDIF .
      ENDIF .
    ENDDO .


    APPEND LS_OUT TO LT_OUT.
  ENDIF .

ENDLOOP .

测试结果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值