BW增強資料來源1-通過增加欄位增強資料來源(兩種方法)
前言:我們經常會遇到系統標準的資料來源,或者我們自建的資料來源無法滿足要求的情況,這個時候在資料來源中新增幾個相關的欄位,可能就能滿足我們的要求,這個時候就要用到資料來源的增強。下面介紹的兩種增強方法都是發生在資料來源提取資料結束以後將要寫到結果表的時候。
準備工作(自建資料來源)
1)RSO2 建立一個簡單的資料來源:SFLIGHT 業務資料
選擇一個應用程式元件,填寫文字資訊,直接到資料庫SFLIGHT取數,點選儲存
繼續點選 儲存
填寫短文字,及要增加的欄位 (在此我們增加了一個欄位FLAG,對於容量>=90%的航班,我們打算以FLAG為‘X’標記),然後點選
RSA3 測試提取一下
ALV GRID檢視一下提取結果
可以看到最後一個欄位 標識,現在為空(例如第一條,佔用374,容量385,使用率97.14%大於90%,但是現在標識仍然為空)
方法一:使用者出口(User Exit)
1)CMOD 建立一個新專案 BW
2)填寫短文字,儲存,點選Enhancement assignments (增強分配)
3)分配增強“RSAP0001”(注:這個增強是固定的,每個系統都一樣),儲存,點選 元件
可知:001用於事務資料的資料來源
002用於主資料或文字的資料來源
003只能用於BW版本1.2B,2.0A以後被002替換
004用於層次的資料來源
5)雙擊一個使用者出口,進入Function Module介面
6)這個FM中,只是INCLUDE了一個程式,這個程式現在是不存在的,雙擊 ZXRSAU01
7)不要理會系統警告,回車
8)點選 是
INCLUEDE程式ZXRSAU01建立成功,下面就可以根據FM的輸入輸入引數進行CODING
*&------------------------------------------------------------------*
*& 包括 ZXRSAU01
*&------------------------------------------------------------------*
FIELD-SYMBOLS: <S> LIKE ZOXHHD0148.
DATA: RATE TYPE P DECIMALS 2.
*判斷資料名稱
CASE I_DATASOURCE.
WHEN 'SFLIGHT'.
*只有資料來源為 SFLITH 時,才執行以下程式碼
LOOP AT C_T_DATA ASSIGNING <S>.
CHECK <S>-SEATSMAX IS NOT INITIAL.
CLEAR RATE.
*計算航班使用率
RATE = <S>-SEATSOCC / <S>-SEATSMAX * 100.
IF RATE >= '90.00'.
<S>-FLAG = 'X'. "使用率大於90%,打上標記
ENDIF.
ENDLOOP.
ENDCASE.
RSA3 測試提取,結果如下:
方法二:BAdI
1)SE19
2)建立一個Implementation BAdI Name: RSU5_SAPI_BADI
Implementation Name: ZRSU5_SAPI_BADI
在Interface選項卡,會看到系統自動建立了一個class: ZCL_IM_RSU5_SAPI_BADI
雙擊這個class
進入Class Interface介面,會看到有兩個method:
DATA_TRANSFORM 用於一般資料的增強(事務資料,主資料和文字)
HIER_TRANSFORM 用於層次資料的增強
雙擊method,就可以根據method的引數進行CODING了
為了便於管理,我們為每一個需要增強的資料來源建立一個method,然後在方法DATA_TRANSFORM和HIER_TRANSFORM中動態呼叫
METHOD IF_EX_RSU5_SAPI_BADI~DATA_TRANSFORM.
DATA: LV_METHOD TYPE SEOCMPNAME.
* check if any data is extracted
CHECK C_T_DATA IS NOT INITIAL.
* get method name for datasource
* add one character as methods can't start with a number
CONCATENATE 'M_' I_DATASOURCE INTO LV_METHOD.
* check whether method exist
SELECT SINGLE CMPNAME
INTO LV_METHOD
FROM SEOCOMPO
WHERE CLSNAME = 'ZCL_IM_RSU5_SAPI_BADI'
AND CMPNAME = LV_METHOD.
CHECK SY-SUBRC EQ 0.
* check method is implemented
CALL METHOD (LV_METHOD)
EXPORTING
I_UPDMODE = I_UPDMODE
I_T_SELECT = I_T_SELECT
I_T_FIELDS = I_T_FIELDS
CHANGING
C_T_DATA = C_T_DATA
C_T_MESSAGES = C_T_MESSAGES.
ENDMETHOD.
建一個Static Method M_SFLIGHT(注意:這裡我們以'M_' + 資料來源名稱作為 Method的名稱,因為有些系統的資料來源以數字開頭,而Method不允許以數字開頭) 點選 Parameters
設定引數(只比DATA_TRANSFORM的引數少了一個I_DATASOURCE)如下:
儲存後,返回Method介面
點選Code
下面就跟CMOD一樣了,可以進行CODING了
METHOD SFLIGHT.
FIELD-SYMBOLS: <S> TYPE ZOXHHD0148.
DATA: RATE TYPE P DECIMALS 2.
* map the data
LOOP AT C_T_DATA ASSIGNING <S>.
CHECK <S>-SEATSMAX IS NOT INITIAL.
CLEAR RATE.
*計算航班使用率
RATE = <S>-SEATSOCC / <S>-SEATSMAX * 100.
IF RATE >= '90.00'.
<S>-FLAG = 'X'. "使用率大於90%,打上標記
ENDIF.
ENDLOOP.
ENDMETHOD.
RSA3 測試提取,結果如下:
比較: 建議使用BAdI的方式, User Exit方式增強RSAP0001只能包含在一個專案中, 而BAdI方式可以為RSU5_SAPI_BADI建立多個Implementation,這樣就可以為每個模組建一個Implementation,每個資料來源建一個method,更加便於管理.