什么是例程(Routine)?
例程就是我們可以自己定義的程序代碼。通過程序代碼來完成我們的需求,因為業務是千變萬化,如果想讓產品能跟隨上業務的腳步,就必須要有非常靈活的功能來補充。大家都知道軟件產品都是通過代碼來編制出來的,所以這里的例程是用最靈活的代碼來進行補充,以達到完成客戶靈活的業務變化。當然在BW模塊中,代碼的編寫只是其中一個小的功能,不像ABAP顧問,主要是通過編程來實現需求。BW顧問注重的是建模,性能,是完成數據倉庫,分析數據等等。
在“轉換”中,最重要的有三種類型的例程,開始例程,轉換例程及結束例程;此外還有專家例程,反向例程。
開始例程:開始例程在每個數據包開始進行轉換時運行。開始例程沒有返回的值,它直接對數據包進行計算、修改或刪除等操作,將操作的結果直接保存在數據包中進行后續的轉換步驟。當然,開始例程也可以訪問和操作SAPBI 系統中的其他數據庫表。
轉換例程:則是在每筆數據傳輸過程中,對數據進行的一個轉換,例如數據根據條件進行的匹配轉換。當在每個字段的詳細規則中,選擇例程的規則類型就會彈出對話框來貼些轉換例程。
結束例程:結束例程對經過轉換規則轉換后的數據進行操作,它操作的是一個與目標對象字段結構一致的表結構。與開始例程一樣,它也是逐個數據包進行處理的。在結束例程中,可以進行各種數據的操作,比如,刪除不需要的數據、進行數據質量檢查等。
專家例程 : 專家例程是系統提供的進行數據轉換的另一個選項,這一類型的例程較少使用。一般只在SAP BI 提供的標准函數不能滿足轉換需要的時候,才使用專家例程。在已知道數據庫表邏輯時,出於提高性能的考慮,也可以使用專家例程而不使用圖形界面。
專家例程還可以更方便地將一條長記錄分成多條短記錄。使用專家例程可以編寫系統提供的規則類型以外的任意轉換,這時需要自定義寫入數據加載日志的信息。一旦為一個轉換創建了專家例程,系統會刪除同一轉換內已經定義好的其他轉換規則。
反向例程 :在上圖中沒有標識出來,它將目標對象在運行報表時的選擇條件和輸出字段轉化為對源對象的選擇條件和輸出字段的要求。
反向例程只在兩種情況下使用。
1) 如果為虛擬信息提供者定義了例程,出於性能方面的考慮,可以使用反向例程。由於虛擬信息提供者本身並不存儲數據,只在運行報表時直接到源系統讀取數據,轉換中的例程可能使報表的選擇條件與輸出字段與源系統不存在直接的對應關系,因此有必要把這些信
息通過反向例程傳給源對象。
2) 當使用SAPBI 的報表跳轉功能,從SAPBI 系統跳轉到其他SAP 系統的事務處理界面時,如果數據是經過例程轉換的,需要使用反向例程將報表中相應的信息返回給其他的SAP 系統。
在這兩種情況下,如果不使用反向例程,系統選擇源對象所有的值。
在代碼*$*$ begin of global …和*$*$end of global ...之間輸入用戶的數據定義。用戶可以使用兩種方式聲明數據:
1 )使用語句'CLASS DATA'進行全局數據聲明。用這一方法聲明的數據在整個數據請求
中都有效。
2) 使用語句'DATA'進行全局數據聲明。用這一方法聲明的數據只在當前的數據包中都
有效。
全局數據聲明使不同的例程之間共享數據成為可能。例如,可以在例程中使用其他例程
的中間計算結果,或者在稍后再次調用同時例程時重用例程的數據。
下面分別給出一個開始例程,傳輸例程及結束例程的應用場景及代碼實現,如下:
1.開始例程程序范例及場景:
在數據傳輸伊始就需要刪除AAA工廠數據,則可以在傳輸例程中寫入如下程序:
*$*$ begin of routine - insert your code only below this line
"刪除AAA工廠
DELETE SOURCE_PACKAGE WHERE /BIC/ZPLANT = 'AAA'
*$*$ end of routine - insert your code only before this line
2.轉換例程應用:
在數據傳輸過程中需要補充物料前導零,則在信息對象例程中加入以下代碼即可。
*$*$ begin of routine - insert your code only below this line
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = SOURCE_FIELDS-MATNR
IMPORTING
OUTPUT = RESULT.
*$*$ end of routine - insert your code only before this line
3.結束例程應用:
如果數據源的結構是一個扁平化結構,現在需要將其拆分成多行,例如結構源數據是
辦事處 一月份銷量 二月份銷量 三月份銷量...
而目標的結構為 辦事處 月份 銷量;則就可以在結束例程里做文章了;示例代碼如下:
先在開始例程中定義一個與源一模一樣的內表,並且將源值賦給這個內表,代碼如下:
*$*$ begin of routine - insert your code only below this line *-*
... "insert your code here
ITAB [] = SOURCE_PACKAGE [].
*$*$ end of routine - insert your code only before this line *-*
然后在結束例程中,在寫入以下程序:
*$*$ begin of routine - insert your code only below this line *-*
... "insert your code here
REFRESH RESULT_PACKAGE.
DATA: WA_RESULT TYPE _TY_S_TG_1.
LOOP AT ITAB INTO WA_ITAB.
WA_TG-/BIC/ZSM_OFF = WA_ITAB-ORG_ID.
*****1月
WA_TG-CALMONTH2 = '01'.
WA_TG-/BIC/ZSM_BPQTY = WA_ITAB-M1.
APPEND WA_TG TO ITAB_TG.
****2月
WA_TG-CALMONTH2 = '02'.
WA_TG-/BIC/ZSM_BPQTY = WA_ITAB-M2.
APPEND WA_TG TO ITAB_TG.
****3月
WA_TG-CALMONTH2 = '03'.
WA_TG-/BIC/ZSM_BPQTY = WA_ITAB-M3.
APPEND WA_TG TO ITAB_TG.
ENDLOOP.
LOOP AT ITAB_TG INTO WA_TG.
MOVE-CORRESPONDING WA_TG TO WA_RESULT.
APPEND WA_RESULT TO RESULT_PACKAGE.
ENDLOOP.
*$*$ end of routine - insert your code only before this line *-*