业务需求
根据输入的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 .