1. 程式人生 > >BW增強資料來源1-通過增加欄位增強資料來源(兩種方法)

BW增強資料來源1-通過增加欄位增強資料來源(兩種方法)

前言:我們經常會遇到系統標準的資料來源,或者我們自建的資料來源無法滿足要求的情況,這個時候在資料來源中新增幾個相關的欄位,可能就能滿足我們的要求,這個時候就要用到資料來源的增強。下面介紹的兩種增強方法都是發生在資料來源提取資料結束以後將要寫到結果表的時候。

準備工作(自建資料來源)

1)RSO2 建立一個簡單的資料來源:SFLIGHT 業務資料

clip_image002

選擇一個應用程式元件,填寫文字資訊,直接到資料庫SFLIGHT取數,點選儲存

clip_image004

繼續點選 儲存

clip_image006

2)RSA6 選擇剛剛建立的資料來源 點選 clip_image008

clip_image010

建立一個附加結構,用系統自帶的名稱即可,點選clip_image012

clip_image014

填寫短文字,及要增加的欄位 (在此我們增加了一個欄位FLAG,對於容量>=90%的航班,我們打算以FLAG為‘X’標記),然後點選

clip_image016 啟用附加結構

clip_image018

RSA3 測試提取一下

clip_image020

ALV GRID檢視一下提取結果

clip_image022

可以看到最後一個欄位 標識,現在為空(例如第一條,佔用374,容量385,使用率97.14%大於90%,但是現在標識仍然為空)

clip_image024

方法一:使用者出口(User Exit)

1)CMOD 建立一個新專案 BW

clip_image026

2)填寫短文字,儲存,點選Enhancement assignments (增強分配)

clip_image028

3)分配增強“RSAP0001”(:這個增強是固定的,每個系統都一樣),儲存,點選 元件

clip_image030

4)點選clip_image032 啟用元件

clip_image034

可以看到4個使用者出口狀態都已經變綠,選中使用者出口,點選clip_image036

clip_image038

可知:001用於事務資料的資料來源

002用於主資料或文字的資料來源

003只能用於BW版本1.2B,2.0A以後被002替換

004用於層次的資料來源

5)雙擊一個使用者出口,進入Function Module介面

clip_image040

6)這個FM中,只是INCLUDE了一個程式,這個程式現在是不存在的,雙擊 ZXRSAU01

clip_image042

7)不要理會系統警告,回車

clip_image044

8)點選 是

clip_image046

INCLUEDE程式ZXRSAU01建立成功,下面就可以根據FM的輸入輸入引數進行CODING

clip_image048

*&------------------------------------------------------------------*
*&  包括                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 測試提取,結果如下:

clip_image050

方法二:BAdI

1)SE19

clip_image052

2)建立一個Implementation BAdI Name: RSU5_SAPI_BADI

clip_image054

Implementation Name: ZRSU5_SAPI_BADI

clip_image056

填寫描述,點選clip_image016[1] 啟用這個Implementation

clip_image058

在Interface選項卡,會看到系統自動建立了一個class: ZCL_IM_RSU5_SAPI_BADI

雙擊這個class

clip_image060

進入Class Interface介面,會看到有兩個method:

DATA_TRANSFORM 用於一般資料的增強(事務資料,主資料和文字)

HIER_TRANSFORM 用於層次資料的增強

clip_image062

雙擊method,就可以根據method的引數進行CODING了

clip_image064

為了便於管理,我們為每一個需要增強的資料來源建立一個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

clip_image066

設定引數(只比DATA_TRANSFORM的引數少了一個I_DATASOURCE)如下:

clip_image068

儲存後,返回Method介面

clip_image070

點選Code

clip_image072

下面就跟CMOD一樣了,可以進行CODING了

clip_image074

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 測試提取,結果如下:

clip_image050[1]

比較: 建議使用BAdI的方式, User Exit方式增強RSAP0001只能包含在一個專案中, 而BAdI方式可以為RSU5_SAPI_BADI建立多個Implementation,這樣就可以為每個模組建一個Implementation,每個資料來源建一個method,更加便於管理.