對於某些與時間相關的數據(主數據有變化的數據)進行分析時,根據用戶不一樣的需求,數據可歸爲4種不一樣的場景中,這4種場景是咱們BW顧問建模以前必定要弄清楚的,要根據業務用戶的需求才能肯定採用那種場景,選定場景後咱們才能開始建模。下面我會是針對這四種不一樣的場景,有不一樣的實現,其統計分析結果是不同的數據庫
需求分析:BBB物料在2000.01月份所屬物料組爲Food,而到了2000.02月份時變爲了Chemicals了,而且在2000.02月份新增了EEE物料主數據,在2000.01月份與2000.02月份BBB都產生了交易數據(但EEE物料只在2000.02月份產生了交易數據)。這樣在統計時,BBB物料是歸到Food組仍是Chemicals組?因爲歸到哪組參照的標準不一樣,這就產生了下面不一樣的4種場景。ide
場景A:數據在不一樣時期所屬有變化,但變化後在統計時也要區分開來,即原來與如今是屬於哪類仍是屬於哪類,要符合歷史實際狀況,一就是一,二就是二。這種須要將主數據特徵與其變化的屬性一塊兒做爲CUBE的維度,同時出如今Cube中(即變化的屬性特徵也會如今交易數據裏)。下面針對該場景進行實現:設計
下面開始建模:orm
建立物料主數據的數據源,並加載一月分的數據到ZMTR00中。結果數據會是這樣:htm
物料組特徵需直接在Cube的維度中使用,因此須要去掉此勾 :blog
不然在Cube中引用物料組特徵屬性ZMTRGP00時會提示它只是個屬性,不進使用:
建立CUBE,而且將物料特徵ZMTR00的物料組屬性特徵ZMTRGP00引用進來,也做爲一個維度:
除了將物料組ZMTRGP00設置 爲物料ZMTR00的屬性外,還須要將物料組屬性特徵ZMTRGP00設置爲CUBE的維度,這樣物料ZMTR00與其屬性ZMTRGR00都會出如今維度表中,處於平等地位。可是,交易數據中並無此列的值,因此物料組屬性特徵ZMTRGP00的值只能從物料特徵ZMTR00主數據中的物料組屬性裏讀取,並在Transformateion裏進行賦值處理。
規則 Read Master Data:表示目標字段的值從指定的InfoObject特徵主數據表裏讀取相應屬性來填充,這就要求源字段是由InfoObject特徵字段組成成,而且這個InfoObject帶有主數據。因爲這裏的源是一個DataSource,組成DataSource的字段不會是InfoObject,而是普通的數據庫表字段定義,因此上而會提示出錯。知足這種要求的源(字段由InfoObject組成,而非普通表字段),只能是DSO、CUBE等。下面咱們只能使用DSO過渡一下:
建立DTP抽數,這樣就將交易數據存儲到了上面這個過渡DSO中了。
再爲Cube建立Transformateion,源爲上面建立過渡型DSO:
此時源爲DSO,而非DataSource了,而且組成DSO的原字段中有ZMTR00這個InfoObject,且這個InfoObject具備主數據表,並含有ZMTRGP00屬性,因此這個DSO能夠用爲 Read Master Data 規則的源:
再爲Cube建立Transformateion:
而且爲了模擬交易數據的過程(交易數據本應該分兩次抽的,一月與二月分開抽),因此要爲DTP加上過濾條件,分兩次抽取,此次只抽一月份的數據:
運行這個DTP,一月份4條交易數據已被抽到CUBE中去了:
到目前爲止,一月份的主數據與交易數據都已加載完成。下面進行二月份數據加載
加載二月份主數據:
再查看P表:
發現P表裏有M版本的,因此在更新主數據後,要激活一下主數據後更新的數據才生效:
加載二月份交易數據,爲CUBE新建立(緣由是因爲DSO中的數據已被上面CUBE的Delta DTP抽過了,再使用那個Delta DTP是抽不上數據的,因此從新新的DTP)一個Full全量的DTP(也可建立一個Delta DTP,因 爲此時兩個Delta DTP條件不重疊也是能夠的),並將DTP過濾條件設置爲二月份的:
此時CUBE中的數據以下,且知足場景A的需求了:
下面進行報表設計:
因爲報表查看器(Business Query)Excle有問題,因此臨時使用ECC自帶的查看器 RSRT 來查看:
結論:這種正是由於將物料組屬性也放在了維度表裏,記錄了物料屬性哪一個物料組的全過程,因此BBB在2000.1月與2000.2屬於不一樣物料組時,也記錄下來了。而且在出報表時,也是基於此維度表來查詢某個物料屬於哪一個物料組的,因此場景A的統計結果不會隨着查詢時間變化而變化:
場景B:根據查看報表時間的不一樣,查詢的結果會有所不一樣,其結果是以最新的數據狀態來展示,無論過去是啥,只注重於今天。這種只須要將變化的屬性做爲與時間無關的導航屬性便可,這是咱們一般的作法。下面針對該場景進行實現:
下面直接在場景A實現上繼續。
這裏咱們並無將A場景中的CUBE的物料組ZMTRGP00維度給刪除。現將ZMTR00的屬性ZMTRGP00修改爲導航屬性(非時間相關),並在CUBE中打上勾:
這樣在Query Designer裏就會看到物料維度下有三個維度字段:
結論:因爲直接使用的物料組屬性是存放在主數據表裏的,而且該屬性與時間無關,因此物料主數據表裏的物料組屬性值只能存儲最新的值,好比這裏在2000.1月時BBB屬於Food,但到了2000.2月後卻變成了Chemical了,最後使用最新的Chemical覆蓋了之前的Food,而且這個變化過程並未記錄下來,因此報表在2000.2月以前某個時間點查看與在2000.2月以後某個時間點查看的結果是不一樣的(在2000.2月查時,會將之前爲Food的銷售額也看做成了Chemical了)。因此場景B的統計結果會隨着查詢時間點的變化可能會發生變化,緣由是主數據屬性隨着時間發生了變化
場景B的第二種實現:
場景C:根據查看報表指定的Key Date不一樣,查詢的結果會有所不一樣,一筆業務數據到底屬於哪一個範疇,則根據指定的Key Date來劃分,這樣,一筆數據在昨天看來或在今天看來是不同的。這種與場景B有點類似,只不過B只能根據查詢報表當前來定業務數據到底該劃分到哪一個組,而場景B除了根據當前外,還能夠基於歷史的任一天來靈活查看。下面針對該場景進行實現:
因爲該物料的物料組屬性設置的與時間相關,因此會出現0DATETO與0DATEFROM兩個字段,按理須要物料主數據文件裏有這兩列,爲了省事,就在Transformation裏設置對應固定值,這裏抽的是2000.1月份的主數據,因此有效期設置爲 2000.01.01 到 2000.01.31:
物料主數據表數據以下(系統會自動爲每一個物料加上兩個有效期:一個是在輸入的有效期以前的期間,另外一個是在輸入的有效期以後的期間):
從上面數據來看,系統會自動爲每一個物料多生成兩個期間,一個是在咱們指定的有效期之間的期間,另外一個是在咱們指定的有效期以後的期間
下面再次抽取2月份的物料主數據,先修改轉換規則的有效時間爲2000.02.01 到 2000.02.29:
建立CUBE:
建立轉換規則時金額字段報錯:
編輯規則,因爲金額字段的單位固定爲RMB,因此這裏不須要對金額進行轉換:
下面建立報表測試:
因爲Key Date輸入的爲 2000-01-15 ,在這一時間點上,EEE 尚未對應的物料組屬性(即那個時候尚未產生業務數據),因此是 # 表示。其餘物料都是按 2000-01-15 這一天所屬物料組來統計的,如 BBB物料,雖然在2000.2月份變成了Chemical組了,但輸入的Key Date爲2000-01-15,則按2000-01-15這天的標準來判斷BBB物料到底屬性哪一個物料組,經到數據主數據表裏查找這一時間點(2000-01-15)所對應的組仍是Food,而無論業務什麼發生的,而是按查詢時指定的Key Date爲依據進行判斷,因此BBB物料在2000.2月份的銷售金額本來屬於Chemical的,卻仍是歸到了Food組了:
再將報表的Key Date設置爲2000.02.15:
本來BBB有一筆在2000.01月份業務發生時,是屬於Food物料組的,但因爲Key Date輸入的爲 2000-02-15,即物料屬於哪一個物料組要按着這個指定的Key Date爲判斷依據,因此這筆發生的業務要算到Chemical物料組裏而不是Food組
結論:主數據的屬性隨着時間的變化而變化時,數據統計的標準能夠是過去的某天,也可也是今天。同一筆業務數據根據不一樣的Key Date分類統計時會劃分到不一樣的分組裏,這樣以不一樣的時間點來看報表時,統計結果會有所不一樣
場景C第二種實現:
注:因爲同一InfoObject屬性裏不能屢次添加同一屬性,因此經過Reference的方式建立Valid From與Valid TO:
從場景C中物料特徵複製,加上兩個日期字段 Valid From與Valid To,而且作爲時間相關的導航屬性:
建立好Transformation後,加載主數據:
Cube從場景C中複製並修改以下:
加載交易數據:
報表設計: