BW BW增量更新方法(假增量)

2021-09-30 07:13:42 字數 4675 閱讀 3056

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如何找出被物理刪除的記錄?

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.

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.

endif.

endloop.

這樣的方案,我們每一次都只需把資料來源到dso的轉換增加乙個類似的開始例程,所有物理刪除的問題就可以得到統一的解決了。以後有少數字段調整,修改起來也比較方便。對源系統那端的開發人員,工作量=0,對bw顧問,工作量也很小:)

寫了這麼多,總結一下,使用者物理刪除(無刪除標記的)的假增量方案,也就是如下兩步而已:

1) 每次抽取最近幾個月的資料到標準dso再到cube,

2) 從資料來源到dso的轉換增加乙個開始例程,把每次傳輸源系統刪除的資料找出來,以關鍵值為0的形式更新到後續的資料目標中。

2     備註:

關於這種場景,sapbw350的標準教材裡說到一種方法,好像就是我本文這個意思(寫的非常簡略,我這篇文章把它細節化了),還有一種可能是手工把recordmode這個字段設定成d或者r(刪除或反轉映像?)的意思,教材沒有提!我們這種做法經過實驗是肯定可以的,手工設定recordmode欄位如果可行的話,應該更節約**量….留待大家挖掘。。。

教材原文:

本文說了那麼多,教材這兩句竟然給概括掉了,真牛!有的時候想想,sap官方教材還真是有很多閃光點的,窩在一些無人關注的角落等待你突然發現……

糾刪碼資料增量更新方法實現

當對糾刪碼乙個條帶內的資料進行更新時,還需要更新校驗塊,一般有兩種方法 重新編碼 這種方法導致更新開銷過大 增量更新 利用新資料相對於舊資料的增量來更新校驗塊,相比於重新編碼,這種方法減少了更新過程中涉及到的網路io 硬碟io 計算開銷。原理可以參考該篇 在intel提供的isa l庫中,包含了糾刪...

Hive增量更新方案

hive增量更新方案 方案一 總結出來業界可行方案 1 hive原始表提前規劃好以時間分割槽,初始化裝載源庫記錄為base table 最新資料 2 每個相關表都會有乙個timestamp列,對每一行操作做了修改,都會重置這列timestamp為當前時間戳 3 新增資料通過sqoop 支援當天抽取 ...

TinyOS更新方法

介紹兩種方法 在linux或者cygwin環境下更新 設定環境變數 export cvsroot pserver anonymous tinyos.cvs.sourceforge.net cvsroot tinyos 接入命令 cvs d pserver anonymous tinyos.cvs.s...