BW project CO ETL设计说明书.docx
《BW project CO ETL设计说明书.docx》由会员分享,可在线阅读,更多相关《BW project CO ETL设计说明书.docx(74页珍藏版)》请在冰豆网上搜索。
BWprojectCOETL设计说明书
BWproject
COETL设计说明书
当前版本:
拥有者:
最后更新日期:
最后更新者:
作者:
创建日期:
批准者:
批准日期:
修订历史
版本号
更新日期
修订作者
主要改变描述
1.概述
本项目ETL部分的核心功能就是按照本设计说明书的架构,将数据由数据源系统(SAPR3)加载到数据仓库(SAPBW)中。
其实现的困难在于ETL工作将面临复杂的源数据环境,包括多种R3标准数据源和增强结构、繁多的数据种类、巨大的加载数据量、错综复杂的数据关系和参差不齐的数据质量,这些都使ETL的架构和应用设计面临相当的挑战。
通过高效的ETL系统结构、层次化的应用功能划分和BW标准的元素,ETL系统和应用架构设计需要能够达到以下目标:
Ø支持在此框架下实现BW数据仓库所需要的ETL功能;
Ø支持在规定的时间窗口内能够完成数据加载工作,即需要满足日常数据加载的性能需求;
Ø能够支持有效的应用程序开发模式,提高开发效率,尽量减少应用开发成本;
Ø减少系统维护的复杂性,支持后续增加新数据或功能的开发工作。
ETL设计说明书为ETL开发提供指导,着重叙述数据仓库系统ETL系统的架构、功能和实施过程,其中包含了主要数据转换过程以及涉及到的客户化例程的说明。
ETL过程依赖于源数据的准备就绪,本设计说明书同时也列出了模块所对应的SAP标准数据源和主数据数据源。
由于ETL的复杂性,本设计尝试从多个层面进行说明,希望能够尽可能回答开发过程中所面临的问题达到指导开发的目的,但实际开发过程中,开发人员仍然可能遇到设计说明书没有涉及的问题,因此,遵循设计的基本思想,通过开发人员的反馈,在开发的过程中不断地完善和修正设计,对于ETL的开发是非常重要的。
对于任何ETL开发过程中遇到的技术问题,开发人员需要与设计人员协商讨论,以迅速解决问题,保证开发顺利进行。
而同时,为保证ETL系统架构的完整、统一、程序的可维护性以及开发的可管理性,对设计的修改必须得到控制,重要的变动必须通过版本管理流程来协调进行。
本设计说明书将包括以下部分:
Ø架构设计:
设计对应模块ETL系统的逻辑架构以及分析数据流。
ØETL过程说明:
包括ETL过程涉及到的各步骤说明,如信息包的更新机制,转换过程中涉及到的特定例程控制,DTP的执行和更新机制等等。
Ø数据加载流程:
说明了对于本模块而言在运行特定步骤之前需满足的条件。
2.ETL系统架构设计
COETL系统逻辑架构
上图是ETL系统逻辑架构。
从宏观设计上,历史数据、初始数据加载和日常数据加载的ETL都将按照此架构设计。
该架构将ETL作为一个整体来设计。
对于数据仓库的加载,ETL分为数据抽取(Extract)、数据转换(Transform)以及数据加载(Load)3个阶段。
3.COETL数据流
COPA数据流
COPC-原材料价量差数据流
COPC-制费人工数据流
COPC-顶正单位成本数据流
数据源环境
数据源全部由SAP系统提供,数据源包括两种类型
业务数据数据源
ØZ_CO_PA_DXJT_03——基于成本核算的获利能力分析(基于视图ZCOPA)
Ø0CO_PC_01——成本对象控制:
计划/实际数据
Ø0CO_PC_ACT_05——物料估价:
价格
Ø0CO_PC_ACT_1——实际成本核算/物料分类帐
Ø
主数据数据源
Ø0CUST_SALES_ATTR——客户号
Ø0MATERIAL_ATTR——物料(属性)
4.COPA模型设计
PSA设计
PSA数据源
COPA模型的PSA业务数据源包含Z_CO_PA_DXJT_03;
信息包
Z_CO_PA_DXJT_03信息包只包含全量信息包
全量信息包:
此信息包放在处理链里
Level1ODS层设计
COPA_110:
基于成本核算的获利能力分析(写入优化的)
COPA_110是写优化DSO,其结构与PSA一样,其结构如下:
在Z_CO_PA_DXJT_03到COPA_110的数据加载中,在DTP中没有过滤,在提取方式的设置如下所示:
Level2EDW层设计
COPA模型中没有Level2EDW层。
Level3DM层设计
DataMart层是企业数据仓库的最终数据层,所有的报表基于这一层开发,所以其设计需要满足FunctionSpec所有报表需求;在COPA模型中,CO_IC001是所有公司COPA的数据;其模型如下:
DTP
DTP中没有过滤器:
转换
⏹分销渠道
根据客户编号去客户编号(销售视图)的属性表/bi0/pcust_sales找到分销渠道
data:
l_distr_chan type /bi0/oidistr_chan.
select single distr_chan into l_distr_chan from /bi0/pcust_sales
where cust_sales = source_fields-cust_sales and
price_list <> ''.
if sy-subrc = 0.
result = l_distr_chan.
else.
result = ''.
endif.
⏹部门
根据客户编号去客户编号(销售视图)的属性表/bi0/pcust_sales找到部门
data:
l_division type /bi0/oidivision.
select single division into l_division from /bi0/pcust_sales
where cust_sales = source_fields-cust_sales and
price_list <> ''.
if sy-subrc = 0.
result = l_division.
else.
result = ''.
endif.
5.COPC-顶正单位成本模型设计
PSA设计
PSA数据源
COPC模型的PSA业务数据源包含0CO_PC_01、0CO_PC_ACT_05;
信息包
5.1.1.10CO_PC_01
信息包包含初始化信息包和增量信息包
初始化信息包:
只执行一次,抽2001.001——2009.009的数据,货币类型是20的数据,完全更新
增量信息包:
抽取上个月(ABAP程序控制)的数据,货币类型是20,完全更新,此信息包放在处理链里
增量信息包中的ABAP例程
DATA:
L_IDX LIKE SY-TABIX.
READ TABLE L_T_RANGE WITH KEY
FIELDNAME = 'FISCPER'.
L_IDX = SY-TABIX.
*....
*--获取上个月的增量数据
DATA :
FISCPER(7) TYPE C ,
LASTDATE TYPE D ,
YEAR(6) TYPE C .
CALL FUNCTION 'FIMA_DATE_CREATE'
EXPORTING
I_DATE = SY-DATUM
I_MONTHS = '-1'
I_SET_LAST_DAY_OF_MONTH = 'X'
IMPORTING
E_DATE = LASTDATE.
BREAK-POINT .
YEAR = LASTDATE+0(6) .
CONCATENATE YEAR+0(4) '0' YEAR+4
(2) INTO FISCPER .
L_T_RANGE-SIGN = 'I'.
L_T_RANGE-OPTION = 'BT'.
L_T_RANGE-LOW = FISCPER.
L_T_RANGE-HIGH = FISCPER.
MODIFY L_T_RANGE INDEX L_IDX.
P_SUBRC = 0.
5.1.1.20CO_PC_ACT_05
包含初始化信息包和增量信息包
初始化信息包:
抽取ZTZQ、ZTZ、ZTF、ZHS、TZC、TTZ、TTS、TTF、TSX、THS、CTZ这几个公司代码,2009.009之前的数据,因数据量大,分2个信息包抽取、完全更新方式
增量信息包:
抽取上个月(ABAP程序控制)的数据,完全更新,此信息包放在处理链里。
增量信息包中的ABAP例程
data:
l_idx like sy-tabix.
read table l_t_range with key
fieldname = 'FISCPER'.
l_idx = sy-tabix.
*....
*--获取上个月的增量数据
DATA :
FISCPER(7) TYPE C ,
LASTDATE TYPE D ,
YEAR(6) TYPE C .
CALL FUNCTION 'FIMA_DATE_CREATE'
EXPORTING
I_DATE = SY-DATUM
I_MONTHS = '-1'
I_SET_LAST_DAY_OF_MONTH = 'X'
IMPORTING
E_DATE = LASTDATE.
BREAK-POINT .
YEAR = LASTDATE+0(6) .
CONCATENATE YEAR+0(4) '0' YEAR+4
(2) INTO FISCPER .
L_T_RANGE-SIGN = 'I'.
L_T_RANGE-OPTION = 'BT'.
L_T_RANGE-LOW = FISCPER.
L_T_RANGE-HIGH = FISCPER.
modify l_t_range index l_idx.
p_subrc = 0.
Level1ODS层设计
CO_D110:
成本对象控制(写入优化的)
CO_D110是写优化DSO,其结构如下:
5.1.1.3DTP
在0CO_PC_01到CO_D110的数据加载中,在DTP中添加了过滤,只抽取目前系统中存在的工厂,提取模式是DELTA:
5.1.1.4转换
没有开始例程,转换规则如下:
0LEADMATNR汇总订单的高层订单物料
去PP_D110关联订单的物料
data l_leadmatnr type /bi0/oileadmatnr.
select single leadmatnr into l_leadmatnr
from /bic/app_d11000
where prodorder = source_fields-prodorder
and plant = source_fields-plant.
result = l_leadmatnr.
ZTEC_DATE技术完成时间
去PP_D110关联订单的技术完成时间
data l_ztec_date type /bic/oiztec_date.
select single /bic/ztec_date into l_ztec_date
from /bic/app_d11000
where prodorder = source_fields-prodorder
and plant = source_fields-plant.
result = l_ztec_date.
0LEADPRODNR汇总制造订单的标题
去PP_D110关联订单的的LEADPRODNR
data l_leadprodnr type /bi0/oileadprodnr.
select single leadprodnr into l_leadprodnr
from /bic/app_d11000
where prodorder = source_fields-prodorder
and plant = source_fields-plant.
result = l_leadprodnr.
CO_D120:
物料估价:
价格(写入优化的)
CO_D120是写优化DSO,其结构如下:
5.1.1.5DTP
在0CO_PC_ACT_05到CO_D120的数据加载中,在DTP没有加过滤,提取模式是DELTA:
5.1.1.6转换
没有开始和结束例程,也没有转换例程,转换规则如下:
Level2EDW层设计
CO_D210:
大订单入库数量汇总
CO_D210结构如下:
5.1.1.7DTP:
DTP里没有加任何过滤,提取方式是DELTA:
5.1.1.8转换ODSOCO_D110->ODSOCO_D210
5.1.1.8.1开始例程:
CO_D210存储大订单的累积入库量及理论入库量,该DSO不区分月份,将同一定在在不同月的数据入库量做合计,得到一个订单的累计入库值;理论量由于只有在第一个月存在值,其后月份为0,故也是采用合计模式;该累计值和理论值是为后面的计算比率做准备。
*-- 过滤小订单,并且只保留成本要素为产成品的记录
data:
zpack type _ty_s_sc_1.
data:
zlin like zpack.
*--删除非顶正的记录
delete source_package where ( plant <> 'CTZ1' and plant <> 'TTZ1'
and plant <> 'ZTS1' and plant <> 'ZTZ1' ).
loop at source_package into zlin.
if zlin-prodorder <> zlin-leadprodnr or zlin-costelmnt <>
'9000002004'.
delete source_package.
endif.
endloop.
转换规则如下图:
5.1.1.8.2实际入库量例程:
取报告的值类型=10的数量作为实际入库数量
*-- 改字段记录的是实际发生值(根据VTYPE=010来判断)。
*-- 由于源数据记录的是入库,数据为负数,所以乘以-1
if source_fields-vtype = 010.
result = -1 * source_fields-quantity.
else.
result = 0.
endif.
5.1.1.8.3理论入库量例程:
取报告的值类型=20的数量作为理论入库数量
*-- 改字段记录的是理论发生值(根据VTYPE=020来判断)。
*-- 由于源数据记录的是入库,数据为负数,所以乘以-1
if source_fields-vtype = 20.
result = -1 * source_fields-quantity.
else.
result = 0.
endif.
CO_D220:
大订单物料消耗数量,费用金额汇总
该DSO存储的原物料消耗的累计数量及费用金额及理论数据,不需要用月份区分,CO_D220与CO_D210功能相似;分别记录的是原材料消耗累计及成品产出累计;为计算成本做准备;
CO_D220结构如下:
5.1.1.9DTP:
DTP里没有加任何过滤,提取方式是DELTA:
5.1.1.10转换ODSOCO_D110->ODSOCO_D220:
5.1.1.10.1开始例程:
delete source_package where piobjsv = ''.
* DELETE SOURCE_PACKAGE WHERE FISCPER < '2007011' OR ( FISCPER <
* '2008011' AND FISCPER > '2008006' ).
*--删除非顶正的记录
delete source_package where ( plant <> 'CTZ1' and plant <> 'TTZ1'
and plant <> 'ZTS1' and plant <> 'ZTZ1' ).
data:
zpack type _ty_s_sc_1.
data:
zlin like zpack.
data:
va_fiscper type /bi0/oifiscper .
*-- 删除不含费用类型(COSTELMNT+0(6) <>'690400')的大订单,删除大于当前月份的。
*-- 删除半成品的记录(zlin-MATERIAL = zlin-COMPONENT)
loop at source_package into zlin.
if ( zlin-prodorder = zlin-leadprodnr and zlin-costelmnt+0(6) <>
'690400') or zlin-material = zlin-component.
delete source_package.
endif.
endloop.
转换规则如下图:
5.1.1.10.2实际源材料耗用量例程:
取报告的值类型=10的数量作为实际源材料耗用量
*-- 该字段是实际的生产投入量。
以010来判断VTYPE = 010
if source_fields-vtype = 010.
result = source_fields-quantity.
else.
result = 0.
endif.
5.1.1.10.3理论源材料耗用量例程:
取报告的值类型=20的数量作为理论源材料耗用量
*-- 该字段为理论的生产投入量。
以020来判断VTYPE = 020
if source_fields-vtype = 20.
result = source_fields-quantity.
else.
result = 0.
endif.
5.1.1.10.4实际制费金额例程:
取报告的值类型=20的金额作为实际制费金额
*-- 该字段是成本要素(制费)的实际金额。
以010来判断VTYPE = 010
if source_fields-vtype = 10.
result = source_fields-amount.
else.
result = 0.
endif.
5.1.1.10.5理论制费金额例程:
取报告的值类型=20的金额作为理论制费金额
*-- 该字段是成本要素(制费)的理论金额。
以020来判断VTYPE = 020
data:
l_conf_act2 type /bi0/oiconf_act2.
if source_fields-vtype = 20.
*-- Modified by Tiger 2009/11/27 ---------Begin -----
*-- 修改费用的理论值的计算公式:
理论金额/1000*投入量
if source_fields-costelmnt+0(6) = '690400'.
select single conf_act2 into l_conf_act2 from /bic/app_d13000
where plant = source_fields-plant and
prodorder = source_fields-prodorder .
result = source_fields-amount / 1000 * l_conf_act2 .
else.
*-- Modified by Tiger 2009/11/27 ---------End -----
result = source_fields-amount.
endif.
else.
result = 0.
endif.
CO_D230:
大订单入库数量按月
CO_D230用来根据月份计算产成品每月入库量,并且从CO_D210中读取成品的理论量及实际量,所以CO_D230的加载一定要在CO_D210之后完成;并且CO_D230中根据技术完成日期判断订单已结\未结状态;以便后续加载计算比率;
CO_D230结构如下:
5.1.1.11DTP:
DTP里没有加任何过滤,提取方式是DELTA:
5.1.1.12转换ODSOCO_D110->ODSOCO_D230:
5.1.1.12.1开始例程:
data:
zpack type _ty_s_sc_1.
data:
zlin like zpack.
* BREAK-POINT .
*--删除非顶正的记录
delete source_package where ( plant <> 'CTZ1' and plant <> 'TTZ1'
and plant <> 'ZTS1' and plant <> 'ZTZ1' ).
*--删除所有的小订单zlin-PRODORDER <> zlin-LEADPRODNR
*--删除非产成品zlin-COSTELMNT <> '9000002004'
*--删除非实际值zlin-VTYPE <> 10
loop at source_package into zlin.
if zlin-prodorder <> zlin-leadprodnr or
zlin-costelmnt <> '9000002004' or zlin-vtype <> 10 or
zlin-component = ''.