需求
在财务、制造、营销这些模块常常会涉及到“xxx月xxx天目标”、“xxx年xxx月目标”的目标值录入,录入之后会再做修改,这样就需要用版本号去区分每次录入的目标,但是最终在BW中只需要用到最新的那版数据,即是去最大版本号的数据。常见的版本号都是取【当前系统时间】。
方案
BW中使用到的架构一般如图所示:
对录入表的版本号处理过程在处理1和处理2。
处理1
1,在建立抽取层DSO时,增加一个标识字段(后面在合并层使用到),在转换中设置为一个常量,名称随便取,类型为char(1)。
2,在转换中使用例程,用ABAP代码将版本号进行格式化,将时间格式的版本号转成字符串,方便后面处理。
3,直接将数据从数据源抽取到抽取层DSO中。
处理2
1,合并层的DSO根据实际需求建立,不需要添加【标识字段】。
2,在转换的开始例程中插入以下的ABAP代码:
"创建内表
data: BEGIN OF LS_ZEFIO20,
* Field: ZBBH 版本号.
ZBBH TYPE C LENGTH 20,
* Field: ZBS ZBS.
ZBS TYPE C LENGTH 1,
END OF LS_ZEFIO20.
DATA LT_ZEFIO20 like TABLE OF LS_ZEFIO20.
**从抽取层活动表 把数据写到内表中
SELECT
ZBBH
ZBS
INTO TABLE
LT_ZEFIO20
FROM /BIC/AZEFIO202.
"根据年 标识 版本号 降序排列
SORT LT_ZEFIO20 DESCENDING BY ZBS ZBBH.
"根据标识去除重复值
DELETE ADJACENT DUPLICATES FROM LT_ZEFIO20 COMPARING ZBS.
"根据版本号排序
SORT LT_ZEFIO20 BY ZBBH.
LOOP AT SOURCE_PACKAGE ASSIGNING <SOURCE_FIELDS> .
"二分法查找 根据版本号取最大版本号的数据
READ TABLE LT_ZEFIO20 INTO LS_ZEFIO20
BINARY SEARCH WITH KEY
ZBBH = <SOURCE_FIELDS>-ZBBH.
IF sy-subrc = 0.
ELSE.
DELETE source_package.
ENDIF.
ENDLOOP.
3,执行DTP,验证是否取到最大版本号。