對於某些與時間相關的數據(主數據有變化的數據)進行分析時,根據用戶不同的需求,數據可歸為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種場景。
- 場景A:能夠還原業務數據的真實情況,這種是遵循歷史的。此場景下,BBB物料在2000.01月份產生的業務數據會被歸到Food組;在2000.02月份產生的業務數據會被歸到Chemicals組
- 場景B:只注重於當前,不遵循歷史,根據出具報表時間來判斷物料所屬組。也就是說不管以前BBB物料曾經屬於過哪些物料組,只看現在它屬於哪個組。比如查看報表的日期為2月份,則BBB物料在1月分產生的業務即使屬於Food,但還是歸到當前最新所屬物料組Chemicals
- 場景C:與場景B相似,不同的是,場景B只的依據是查看報表的當前時間,這個標准是定死的,即當前時間,另一個不同的地方是在建模方面,物料組屬性在場景B是與時間無關的,但在C場景中是相關的。場景C在B的基礎上更靈活,你可以設定這個標准為過去的某個時間點,也可以是當前時間,這種可變標准是通過報表里的變量Key Date來實現的。此場景下(假設當前已經到了2000.03月份了),如果Key Date設定為2000.01月份,則BBB物料在2000.02月份產生的業務數據雖然在歷史上來看屬於Chemicals,但還是會被歸到Food組;如果Key Date設定為2000.02月份,則BBB物料在2000.01月份產生的業務數據雖然在歷史上來看屬於Food,但還是會被歸到Chemicals組
- 場景D:具有可比性,即只統計一段時間內主數據未發生過變化的數據。該場景也是在C場景的基礎上(物料組屬性也是與時間相關的),物料主數據屬性附加了兩個有效期字段,這兩字段實質上與系統產生的有效期字段是完全一樣的,另外也有Key Date,因為如果沒有Key Date,而查詢時間相關的屬性時,會以當前時間為Key Date,所以為了像場景C那樣數據的真實性,所以還是加上了Key Date變量。在D場景下,如果當前日期已到了3月份,則在查看1996.1到9999.12之間從未發生過變化的數據時,BBB與EEE就不會出現
場景A:數據在不同時期所屬有變化,但變化后在統計時也要區分開來,即原來與現在是屬於哪類還是屬於哪類,要符合歷史實際情況,一就是一,二就是二。這種需要將主數據特征與其變化的屬性一起作為CUBE的維度,同時出現在Cube中(即變化的屬性特征也會現在交易數據里)。下面針對該場景進行實現:
下面開始建模:
創建物料主數據的數據源,並加載一月分的數據到ZMTR00中。結果數據會是這樣:
物料組特征需直接在Cube的維度中使用,所以需要去掉此勾 :
否則在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中復制並修改如下:
加載交易數據:
報表設計: