声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4287014.html
员工 0HR_PA_0 业务数据源中有一个CALMONTH日历年/月的字段,只要员工还在职,每个员工每个月都会产生一条数据:
   
人事事件 0HR_PA_1 业务数据源中有一个CALDAY日历天的字段,只要员工发生人事事件(如入职、晋升、调离、离职等),该数据源中就会产生一条数据:
 
 
需求:将 0HR_PA_0 、0HR_PA_1 两个数据源中的数据抽到DSO后,需要在原有的数据字段上附加上 人事子范围 、公司代码、员工组 、员工子组、人事范围、雇佣状态 、组织单位、业务范围  这些数据字段(从上面图中可以看到这两个业务数据源中原本没有这些字段),即需要将主数据属性直接存入到交易数据中(而非导航属性那样,主数据属性是通过导航的方式关联起来,而这里是要求将这些主数据属性直接存储到Fact表的维度表中,即要求以场景A来建模,场景A具体应用及实现请参照另一篇文章),如何用场景A来实现?
 
分析:现需要将业务数据源中原本没有的这些字段附加到业务数据上,除了通过直接对业务数据源进行增强外,针对这两个业务数据源( 0HR_PA_0 、0HR_PA_1 ),有更简便的方法就是在DSO层,通过  Read Master Data 读取主数据转换规则 将这些附加字段数据从相应主数据中读取出来(前提是附加的这些字段是交易数据能关联到的主数据属性字段, 如这里附加的这些字段,都是可以通过0HR_PA_0 、0HR_PA_1业务数据源与员工0EMPLOYEE、组织0ORGUNIT关联得到的,但增强方式没有这个要求)。由于  人事子范围 、公司代码、员工组 、员工子组、人事范围、雇佣状态 、组织单位  这些字段是InfoObect员工OEMPLOYEE的属性(且这些属性与时间相关):
而 业务范围 又是 组织单位 0ORGUNIT信息对象 的属性(且也与时间相关):
现在要附加上的这些字段分别属于 OEMPLOYEE( 人事子范围 、公司代码、员工组 、员工子组、人事范围、雇佣状态 、组织单位) 、 0ORGUNIT(业务范围)这两个信息对象中,并且 业务范围 这个字段需要在 组织单位 属性抓出来后,才能根据组织单位到 0ORGUNIT信息对象 中将 业务范围 属性抓出来。下面屡一下这些附加字段的抓取顺序:先将业务数据源0HR_PA_0 、0HR_PA_1的数据抽取到第一层DSO中(明细层,原样存储数据源的数据,在这一层不会增加数据源抽取结构以外的字段);再将第一层DSO数据转换存储到第二层DSO中,第二层DSO需在第一层DSO的基本上,附加上 人事子范围 、公司代码、员工组 、员工子组、人事范围、雇佣状态 、组织单位 这些字段,这些字段通过 Read Master Data  转换规则从主数据OEMPLOYEE中抓取出来,但要注意的是这些属性是与时间相关的,读取时需要加上业务时间这一条件(即从0EMPLOYEE底表里抓取这些属性字段时,除了员工编号外,还需要加上 业务时间0CALMONTH 条件);最后第三层DSO在第二层的基本上再附加上业务范围 这一字段,此时需从 0ORGUNIT信息对象 底表抓取,条件是 组织单位 + 业务时间0CALDAY。下面以 员工0HR_PA_0 数据源为例,采用三层DSO建模:
 
具体转换规则如下:
上面在通过  Read Master Data 读取主数据 转换规则读取主属性时,由于主属性是时间相关的,则读取主数据的时间条件取值可以是以下三种:
当前日期:读取主属性时,会以当前时间点(YYYYMMDD)为时间限制条件值,抓取当前时间点所对应有效属性,即抓取满足 DateFrom <= 当前时间 <=DateTo 时间条件的主数据( DateFrom 、 DateTo为主数据底表两个字段,用它们来表示数据的有效期)
常数日期:以某个常数日期(也是YYYYMMDD,到天)为时间条件,读取相应时间点的有效主属性
Form(从):以DSO源中的某个日期字段(上面选择的为0CALMONTH,该字段为源DSO中的某个时间字段,只到月)为时间条件,读取相应时间点的主属性。由于这里选择的日期字段0CALMONTH只到月,以此为时间限制条件(DateFrom <= 0CALMONTH <=DateTo )去主数据底表里查询时,可能会有多条数据对应,这时是取最早的,还是最晚的数据(但不能取到中间某个时间段主数据),就要看选择的是“开始”还是“结束”了,选择的不同,抓取到的主属性也是不一样的,具体请看下面的测试:
 
员工 0HR_PA_0 业务数据源 中的日历年月CALMONTH只到月,以此字段作为业务产生的时间来读取时间相关的主数据属性时,”开始“、”结束“测试结果如下:
 
 
 
人事事件 0HR_PA_1 业务数据源 中的日历天CALDAY与上面区别在于精确到天了,所以不管选择”开始“还是”结束“,同一业务数据所抓取到的主数据结果是一样的:
所以从上面两组(0HR_PA_0、0HR_PA_1)测试结果来看,”开始“、”结束“只对到月(或季度、年)业务时间起作用,如员工0HR_PA_0数据源的0CALMOTH业务时间字段;对已精确到天的业务时间不起作用,如人事事件0HR_PA_1数据源的0CALDAY业务时间字段,到天时不管选择的是“开始”还是“结束”读取到的主数据属性都是一样的,因为已精确到某一天,所以读取到的主数据有且仅有一条;
根据不到天(如只到月、季度、年)的业务时间来抓取时间相关主数据时,  Read Master Data 中选择“开始”时,如果有多条符合(原因就是业务时间没有精确到天,而主数据的DATEFrom与DAETo是到天的,在以业务时间为条件从主数据底表读取主属性时,会忽略掉主数据有效时间字段DATEFrom与DAETo中的天,这样就会匹配到多条主数据),就取有效时间段最早的那条;如果选择“结束”时,有多条符合就取最晚(最新的)的那一条,注:不可能只取中间某个时间的主数据
 
 
上面实例是以员工0HR_PA_0数据源为例,演示了如何通过   Read Master Data 转换规则 读取时间相关的主数据,并且是通过三层DSO建模来实现的,实质上也可以只通过两层DSO就可以实现OEMPLOYEE与 0ORGUNIT主数据的读取。具体实现方式:需要在第一层DSO的End Routine中,先根据数据源中的员工编号从OEMPLOYEE信息对象底表中 将 组织单位 抓取出来(注:通过End Routine程序抓取主数据时,也需要考虑时间相关,End Routine程序代码中需加上时间限制条件),然后在第二层DSO的转换规则中,通过 Read Master Data 方式将将所有的附加字段一次性全读取出来,而不需要分两层DSO分两次读取OEMPLOYEE与 0ORGUNIT主数据。注:上面员工0HR_PA_0数据源不能采用这种 End Routine +  Read Master Data 的两层DSO方式,因为业务时间只到月,虽然程序可以读取时间相关的主数据,但程序无法灵活实现“开始”与“结束”,只有人事事件0HR_PA_1数据可以使用 End Routine +  Read Master Data 的两层DSO方式建模,因为相应业务时间到天了,可通过End Routine精确读取到一条时间相关的主数据,与“开始”“结束”无关。下面采用这种End Routine +  Read Master Data只有两层DSO方式来建模:
 
0ORGUNIT抓取是通过End Routine实现的,但要注意的是,0ORGUNIT的抓取虽然是放在End Routine代码里实现的,不需要划线,但规则类型也不能选择“无转换”,否则DSO 激活时,New表里抓取到的 组织单位 在激活后Active表里的组织单位就会丢失,所以最好选择规则类型为常数转换规则,值为空,这样在激活后就不会消失),具体代码如下:
 METHOD end_routine.
*=== Segments ===

FIELD-SYMBOLS:
      <RESULT_FIELDS>    TYPE _ty_s_TG_1.

DATA:
      MONITOR_REC     TYPE rstmonitor.

*$*$ begin of routine - insert your code only below this line        *-*
    ... "insert your code here
*--  fill table "MONITOR" with values of structure "MONITOR_REC"
*-   to make monitor entries

    ... "to cancel the update process
*    raise exception type CX_RSROUT_ABORT.

DATA:t_docinfo TYPE TABLE OF _ty_s_TG_1.
    DATA:wa_docinfo TYPE  _ty_s_TG_1.

**=======调试使用
    Data: t_zjzjtest TYPE TABLE OF zjzjtest .
    DATA wa_zjzjtest type zjzjtest.
**=======end

SELECT ORGUNIT EMPLOYEE
      INTO CORRESPONDING FIELDS OF TABLE t_docinfo
      FROM /BI0/MEMPLOYEE FOR ALL ENTRIES IN RESULT_PACKAGE
      WHERE EMPLOYEE = RESULT_PACKAGE-EMPLOYEE
      "员工主数据表为 /BI0/MEMPLOYEE,其属性是与时间相关的,所以查询时需加上时间条件,
      "读取业务数据产生时所对应的主数据. RESULT_PACKAGE-CALDAY 为业务发生的时间,
      "dateto与datefrom为主数据的有效期
      and datefrom <= RESULT_PACKAGE-CALDAY and dateto >=
      RESULT_PACKAGE-CALDAY .

sort t_docinfo by EMPLOYEE ASCENDING.

LOOP AT RESULT_PACKAGE ASSIGNING <RESULT_FIELDS> .
      READ TABLE t_docinfo WITH key EMPLOYEE = <RESULT_FIELDS>-EMPLOYEE
      BINARY
      SEARCH INTO wa_docinfo.

<RESULT_FIELDS>-ORGUNIT = wa_docinfo-ORGUNIT.
**=======调试使用

APPEND wa_docinfo-ORGUNIT to  t_zjzjtest.
**=======end
    ENDLOOP.

**=======调试使用
    DELETE FROM zjzjtest.
    MODIFY zjzjtest from TABLE t_zjzjtest.
**=======end

*$*$ end of routine - insert your code only before this line         *-*
  ENDMETHOD.                    "end_routine

 
在第二层DSO中将OEMPLOYEE与 0ORGUNIT两个主数据一次全部读取出来:

HR数据抽取:通过 Read Master Data 转换规则读取时间相关主属性数据的更多相关文章

  1. Data Pump(数据抽取)介绍

    从10g开始,Oracle提供更高效的Data Pump(即expdp/impdp)来进行数据的导入和导出,老的exp/imp还可以用,但已经不建议使用.注意:expdp/impdp和exp/imp之 ...

  2. 机器学习&深度学习经典资料汇总,data.gov.uk大量公开数据

    <Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost到随机森林.D ...

  3. MS MDS系列之初始MS Master Data Service(微软主数据服务)

    背景介绍: 主数据服务(Master Data Services)是微软平台支持的主数据管理(MDM)平台.类似MDS这样的系统,如果后续维护得当,会给企业提供一个强大的中心数据库系统,来防止企业数据 ...

  4. 数据抽取 CDC

    什么是数据抽取 数据抽取是指从源数据源系统抽取目的数据源系统需要的数据.实际应用中,数据源较多采用的是关系数据库. [编辑] 数据抽取的方式 (一) 全量抽取 全量抽取类似于数据迁移或数据复制,它将数 ...

  5. 利用haohedi ETL将数据库中的数据抽取到hadoop Hive中

    采用HIVE自带的apache 的JDBC驱动导入数据基本上只能采用Load data命令将文本文件导入,采用INSERT ... VALUES的方式插入速度极其慢,插入一条需要几十秒钟,基本上不可用 ...

  6. Data Lake Analytics,大数据的ETL神器!

    0. Data Lake Analytics(简称DLA)介绍 数据湖(Data Lake)是时下大数据行业热门的概念:https://en.wikipedia.org/wiki/Data_lake. ...

  7. Oracle实时数据抽取项目问题总结

    Oracle实时数据抽取项目问题总结 项目背景介绍 项目主要是将Oracle.MySQL.SQLServer.Db2等其他数据库的实时变更数据同步到其他异构数据库中.本篇文章主要是讨论oracle的实 ...

  8. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  9. QM模块包含主数据(Master data)和功能(functions)

    QM模块包含主数据(Master data)和功能(functions)   QM主数据   QM主数据 1 Material   Master MM01/MM02/MM50待测 物料主数据 2 Sa ...

随机推荐

  1. Unity学习疑问记录之新GUI

    学习Unity 4.6新GUI系统 http://segmentfault.com/a/1190000000642686

  2. Java程序设计 实验二 Java面向对象程序设计

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏 ...

  3. xml案例(考生成绩管理系统)

    package itacst.dao; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node ...

  4. 【iCore3 双核心板】例程二十三:LAN_HTTP实验——网页服务器

    实验指导书及代码包下载: http://pan.baidu.com/s/1getgyKr iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  5. C#中 MD5和SHA1加密代码

    Pwd = FormsAuthentication.HashPasswordForStoringInConfigFile(entity.Pwd, "MD5"); Pwd = For ...

  6. 初探XML

    1.XML是什么? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签 ...

  7. 对list进行切片

    取一个list的部分元素是非常常见的操作.比如,一个list如下: >>> L = ['Adam', 'Lisa', 'Bart', 'Paul'] 取前3个元素,应该怎么做? 笨办 ...

  8. 利用AdaBoost元算法提高分类性能

    当做重要决定时,大家可能都会吸取多个专家而不只是一个人的意见.机器学习处理问题时又何尝不是如此?这就是元算法背后的思路.元算法是对其他算法进行组合的一种方式. 自举汇聚法(bootstrap aggr ...

  9. 读源码之RESideMenu

    RESideMenu是github上比较出名的一个开源库,主要是实现侧滑菜单,现在有三千多个star了.效果如下.   据说创意来源于dribbble的一个设计,还是比较好看的.感兴趣的可以去gith ...

  10. Web Project犯错误!

    创建一个Web Project关于数据库连接,输入doGet中调用req.setCharacterEncoding("utf-8)错误输成uft-8 经常忘记HttpServletReque ...