1 说说假增量

我们都知道,对于BW来说,很多ECC的标准数据源自带了增量更新功能,每天各种凭证产生的增量数据会自动堆积到增量队列里,然后BW端做一个增量信息包按天把这些增量抽取到数据仓库里,非常轻松自然,对于客户和顾问,都是透明的自动的容易实施的,这也是上过ECC的企业数据仓库采用SAP BW的一个优势所在。

但是对于非ECC的一般数据库或者ECC的自定义数据源,做增量更新就苦了。对于ECC的自定义数据源,SAP给了一种标准方案,我们看看这种方法:用一个时间字段或数字字段标记增量,当这个字段在表里的数值变化时,就认为是增量,把这条记录作为增量记录,增量信息包会挑出这些记录传送上去。这种方法的问题是显而易见的,不管是时间还是数字字段,我们都需要ABAP工作者额外编程去控制这个字段的变化,这样才能正确让系统选择出增量(用表中的凭证创建日期等字段作为时间字段去控制是不可行的,因为你不能保证今天不会修改昨天的数。)对于非ECC的一般数据库连接,SAP很干脆的说,不支持增量(06年是这么讲的,以后支不支持不晓得)

总结一下,在不同的数据源下,对增量的支持是这样的 :

因此,对于不支持或不好实现增量的情况,我们比较推荐的方法是,使用带选择条件的完全抽取信息包,每一次定期抽取之前N个月的数据(前提是客户保证,不修改N之前月的数据),然后上传到DSO中,如果这N个月的数据没有变化,则会被覆盖掉,系统当什么事都没发生;如果有变化,则会把变化部分覆盖DSO相同主键的数据,然后记录到DSO的更改日志表,再往CUBE中传变化部分(当然:DSO到CUBE的DTP要设置成增量DTP),这样,就以比较小的抽取时间的代价(每天只要抽最近N个月,N尽量小的数据),换来了增量抽取的几乎全部优点(每次抽取时间比较短,数据量小,传到CUBE也同样只传增量部分)。这种做法,SAP 官方教材极力推荐,见下图(取自教材350增量更新一章最后一节),BW江湖人送外号假增量即是此种方法。

比如说,每天抽取最近两个月的数据,在信息包里我们可以这么写例程去控制(时间选择字段为T_DATE):

data: l_idx like sy-tabix.
data: tmp_date type d.
read table l_t_range with key fieldname = 'T_DATE'.
l_idx = sy-tabix.
tmp_date = sy-datum - 60.
l_t_range-high = sy-datum.
l_t_range-low = tmp_date.
l_t_range-sign = 'I'.
l_t_range-option = 'BT'.
modify l_t_range index l_idx.
p_subrc = 0.

这样最近两个月的数据每天抽取,每天覆盖,再利用DSO的更改日志表,就实现了“假增量”。

如果数据源对应的不是DSO,是CUBE,那么就无法使用更改日志表,BW也给我们一种实现假增量的方式,见下图:

解释一下这个图,CUBE里的数据是不能覆盖的,所以,如果要每天抽取部分数据的话,必须要把上次相同抽取条件(比如:今年)的数(请求)给删掉,这个我们可以在处理链里设置:删除信息块中的重叠请求:

一般来说,数据源都是先把数传递到DSO再到CUBE,每次删除重复请求感觉上也不是很安全,所以上述方法使用的不多。

先到DSO再到CUBE,每一次用程序抽取最近N个月数据的这种假增量方法看似比较完美,其实背后隐藏了一个极大的问题,即用户在源系统物理删除的那部分记录如何在BW也每天自动删除掉。原系统物理删除掉的记录,BW在抽取过程中是无法自动识别的,在DSO的更改日志里当然也体现不出来,CUBE端肯定也不会自动删除掉,这个如何处理?放任不管是肯定不行的,在这次首钢项目的开始,项目组就提出了这个问题,要求给出合适的解决方案。

1 让客户最偷懒的,解决物理删除问题的假增量方案

解决方案经过研究,可以有以下两种主要思路。第一种,由开发源系统的客户方维护人员,在视图里增加一个删除标记,每一次数据删除了,都打上这个标记,BW抽取上来后,在报表里设置条件,凡是有这个标记的数据,就不显示出来。这种方案的问题在于客户必须要修改它那边源系统的代码,很多时候,客户想偷个懒,不太愿意改,这种方案需要客户配合,也不是标准的解决方案。第二种方法,在BW这边识别,并在抽取时自动进行处理,这样客户什么也不需要做,相当舒服,但是BW这边如何能尽量方便的处理,就得综合考虑一些问题了。

问题一: BW如何找出被物理删除的记录?

可以在开始例程里统一判断,即把开始例程的SOURCE_PACKAGE和DSO中相关记录进行比对,DSO中有,而SOURCE_PACKAGE找不到的记录,即可认为是删除,例程如下:

SELECT * FROM /bic/az3pp_o0900 INTO TABLE it_dso.

LOOP AT it_dso INTO st_dso.

READ TABLE SOURCE_PACKAGE INTO st_source WITH KEY STAT_DATE =

st_dso-calday.

IF sy-subrc <> 0.

“ 确认删除,此处开始处理问题二

ENDIF.

ENDLOOP.

问题二: 找到被删除记录后,怎么能让DSO的更改日志知道这条记录被删除了?

我们知道,DSO的更改日志会自动把这一次的数据和上一次的数据进行比对,把差异记录在日志表里,再传递到CUBE中,因此,我们可以考虑,手工把被删除数据的关键值统一设置为0,这样,假设原来关键值是15的话,DSO会被覆盖成0,DSO的更改日志表会变成-15,再传到CUBE中就是15 +(-15)= 0了。这样等于针对删除记录自动产生了反冲记录,可以同时保证DSO和CUBE数据的准确性了(DSO和CUBE该记录都为0了),例程如下:

LOOP AT it_dso INTO st_dso.

READ TABLE SOURCE_PACKAGE INTO st_source WITH KEY STAT_DATE =

st_dso-calday.

IF sy-subrc <> 0.

st_source-STAT_DATE = st_dso-calday.

st_source-L4_FACILITY_ID = st_dso-plant.

st_source-L4_WORKCENTER_ID = st_dso-workcenter.

st_source-EQPT_OUT = 0.

st_source-EQPT_SCRAP = 0.

st_source-SACRPT_HRM_INPUT = 0.

st_source-SALE_OUT = 0.

st_source-SALEMAT_HRM_INPU = 0.

st_source-record = tmp_record.

APPEND st_source TO SOURCE_PACKAGE.

ENDIF.

ENDLOOP.

注意,上述例程中非关键值要设置成和原先一样,关键值都要设置成0.

完整例程如下:

DATA it_dso TYPE TABLE OF /bic/az3pp_o0900.

DATA st_dso TYPE /bic/az3pp_o0900.

DATA st_source TYPE _ty_s_sc_1.

DATA tmp_record TYPE rsarecord.

SELECT * FROM /bic/az3pp_o0900 INTO TABLE it_dso.

READ TABLE SOURCE_PACKAGE INTO st_source INDEX 1.

tmp_record = st_source-record.

CLEAR st_source.

LOOP AT it_dso INTO st_dso.

READ TABLE SOURCE_PACKAGE INTO st_source WITH KEY STAT_DATE =

st_dso-calday.

IF sy-subrc <> 0.

st_source-STAT_DATE = st_dso-calday.

st_source-L4_FACILITY_ID = st_dso-plant.

st_source-L4_WORKCENTER_ID = st_dso-workcenter.

st_source-EQPT_OUT = 0.

st_source-EQPT_SCRAP = 0.

st_source-SACRPT_HRM_INPUT = 0.

st_source-SALE_OUT = 0.

st_source-SALEMAT_HRM_INPU = 0.

st_source-record = tmp_record.

APPEND st_source TO SOURCE_PACKAGE.

ENDIF.

ENDLOOP.

这样的方案,我们每一次都只需把数据源到DSO的转换增加一个类似的开始例程,所有物理删除的问题就可以得到统一的解决了。以后有少数字段调整,修改起来也比较方便。对源系统那端的开发人员,工作量=0,对BW顾问,工作量也很小:)

写了这么多,总结一下,用户物理删除(无删除标记的)的假增量方案,也就是如下两步而已:

1) 每次抽取最近几个月的数据到标准DSO再到CUBE,

2) 从数据源到DSO的转换增加一个开始例程,把每次传输源系统删除的数据找出来,以关键值为0的形式更新到后续的数据目标中。

2 备注:

关于这种场景,SAPBW350的标准教材里说到一种方法,好像就是我本文这个意思(写的非常简略,我这篇文章把它细节化了),还有一种可能是手工把RECORDMODE这个字段设置成D或者R(删除或反转映像?)的意思,教材没有提!我们这种做法经过实验是肯定可以的,手工设置RECORDMODE字段如果可行的话,应该更节约代码量….留待大家挖掘。。。

教材原文:

请关注最后两句!我是写这篇文章的时候去翻教材才发现的,具体方法应该就是本文这种或者备注猜测的那种。

本文说了那么多,教材这两句竟然给概括掉了,真牛!有的时候想想,SAP官方教材还真是有很多闪光点的,窝在一些无人关注的角

转载于:https://www.cnblogs.com/hanmos/archive/2012/08/08/2629082.html

BW:BW增量更新方法(假增量)相关推荐

  1. 增量更新同步_OneDrive增量更新功能正式推出 仅同步文件更改部分降低网络占用...

    微软的云存储应用OneDrive目前用户量还是蛮多的,不过在功能更新方面OneDrive动作相对来说还是有些慢的. 比如非常实用的增量更新功能直到最近微软才正式推出,现在所有个人和企业级用户都可以使用 ...

  2. mysql增量抽取方法_DataX增量抽取数据

    datax增量项目地址: datax作业配置文件 datax.json { "job": { "setting": { "speed": { ...

  3. mysql的增量备份方法_Mysql 增量备份,全部备份实现方法以及自动化脚本

    前情摘要 自己作死干了一件特别蠢的事情(具体略) 然后开始研究如何进行增量备份 增量备份 原理 mysql 有个 binlog 的功能,会记录所有的用户的操作,可以依靠这个,配合全备份,将数据库回滚到 ...

  4. mysql的增量备份方法_mySQL 增量备份方案(转)

    1.在 /etc/my.cnf 下面设置开启bin-log 编辑 vim /etc/my.cnf [mysqld] binlog_format       = MIXED                ...

  5. SAP-BW数据仓库增量更新

      1    说说假增量 我们都知道,对于BW来说,很多ECC的标准数据源自带了增量更新功能,每天各种凭证产生的增量数据会自动堆积到增量队列里,然后BW端做一个增量信息包按天把这些增量抽取到数据仓库里 ...

  6. Android的增量更新

    Android的增量更新 随着现在移动端的不断普及,移动端逻辑越来越复杂,对移动端APP的要求也越来越高,所以对于一个没有用户的量APP,最重要的是用户.而一个对于一个有用户量的APP来说,最重要的是 ...

  7. kettle spoon判断增量更新_Kettle增量更新设计技巧

    摘要:本文主要讨论一些在ETL中设计增量更新的方法和技巧. ETL中增量更新是一个比较依赖与工具和设计方法的过程,Kettle中主要提供Insert / Update 步骤,Delete 步骤和Dat ...

  8. Android之增量更新详解

    前言:自从 Android 4.1 开始, Google Play 引入了应用程序的增量更新功能,App使用该升级方式,可节省约2/3的流量.现在国内主流的应用市场也都支持应用的增量更新了,最常见的应 ...

  9. Android中的全量更新、增量更新以及热更新

    在客户端开发过程中,我们可能会遇到这样一种需求:点击某个按钮弹出一个弹窗,提示我们可以更新到apk的某个版本,或者我们可以通过服务端接口进行强制更新.在这种需求中,我们是不需要通过应用商店来更新我们的 ...

最新文章

  1. 为了进行差错控制,必须对传送的数据帧进行校验。在局域网中广泛使用的校验方法是循环冗余校验。当接收端发现错误后采取的措施是
  2. 服务器越来越慢的原因及解决办法
  3. MySQL LEFT/RIGHT JOIN:外连接查询
  4. ALV列、行、单元格颜色设置
  5. 虚函数和抽象函数的区别
  6. 剑指offer-求二叉树深度
  7. Linux 网络编程——网络字节序(三)
  8. php做微信小程序登录,php(ThinkPHP)实现微信小程序的登录过程
  9. n个小球放入m个盒子中_飞么盒子卫生巾自助售卖机前景
  10. 优启通怎么重装系统win10_重装系统失败?小编教你安全给神舟战神GX9 Pro重装win10系统方法...
  11. C#设计模式之14-命令模式
  12. 设置hive的执行引擎_0506-如何将Hue4.0版本中默认执行引擎设置为Hive而非Impala
  13. OpenShift 之 Quarkus(1)创建第一个Quarkus应用
  14. Android Preference 的使用
  15. matlab 追赶法
  16. linux文件权限的设置命令
  17. 逻辑回归算法深度思考-优点和缺点
  18. 阿里云使用经验分享——小投入大收益
  19. JetPack-Compose - Flutter 动态UI?
  20. 用Kali进行ARP断网攻击

热门文章

  1. ElasticSearch创建、修改、获取、删除、索引Indice mapping和Index Template案例
  2. LAMP(7限定某个目录禁止解析php、 限制user_agent、 PHP相关配置、PHP扩展模块
  3. Eclipse新建web项目正常启动tomcat不报错,但不能访问项目的解决方法
  4. mysql存储引擎优化参数
  5. Django学习笔记2:一个简单的开发实例
  6. linux下shell的工作原理
  7. [独家]网易遭遇****** 留下“装B”两字
  8. c++排序算法ppt_C/C++学习教程:C语言排序算法—插入排序算法
  9. axios打包放到服务器上接口地址404_如何把网页文件放到云虚拟主机
  10. 学生社团网站html,学生社团活动平台的设计与实现.docx