BW 建立資料來源(包括表/資料結構/函式)
用到的TCODE:
SE37/SE80函式構建器
SE11 ABAP字典(包括資料庫表/檢視/資料型別等)
SE16 資料瀏覽器
RSA6 資料來源目錄
RSO2 維護一般資料來源(事務資料/主資料屬性/文字)
RSA3 提取器檢驗程式(資料來源測試)
Step1:TCODE: SE11 建立資料庫表
表名:ZHBSJ
Step2:TCODE: SE11 建立資料結構
資料結構名:ZDS_ZHBSJ_STR
Step3:TCODE: SE80 建立函式組和函式
函式組:ZDS_ZHBSJ_GRP,函式:ZDS_ZHBSJ
篩選出“函式組”,以“RSAX”作為關鍵字搜尋我們要作為函式組模板的物件,並右擊選擇“複製”
函式組建立完成後,需要複製函式模組,這裡我們只需要複製“RSAX_BIW_GET_DATA_SIMPLE”,並輸入新函式模組名“ZDS_ZHBSJ”,然後點選“複製”
這時候我們再檢視這個函式組,如下圖所示:
Step4:TCODE: SE37 更改函式資訊,修改原始碼
下圖中關聯型別更改為我們剛建立的資料結構ZDS_ZHBSJ_STR
FUNCTION ZDS_ZHBSJ.
*"----------------------------------------------------------------------
*"*"本地介面:
*" IMPORTING
*" VALUE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR
*" VALUE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*" VALUE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*" VALUE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*" VALUE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*" VALUE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF
*" TABLES
*" I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
*" I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
*" E_T_DATA STRUCTURE ZDS_ZHBSJ_STR OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------
* Example: DataSource for table SFLIGHT
TABLES: ZHBSJ.
DATA: it_data TYPE TABLE OF ZDS_ZHBSJ_STR.
DATA: wa_data LIKE LINE OF e_t_data.
TYPES:BEGIN OF TY_T001,
BUKRS TYPE BUKRS,
WAERS TYPE WAERS,
END OF TY_T001.
DATA:LS_T001 TYPE TY_T001,
LT_T001 TYPE TABLE OF TY_T001.
* Auxiliary Selection criteria structure
DATA: L_S_SELECT TYPE SRSC_S_SELECT.
* Maximum number of lines for DB table
STATICS: S_S_IF TYPE SRSC_S_IF_SIMPLE,
* counter
S_COUNTER_DATAPAKID LIKE SY-TABIX,
* cursor
S_CURSOR TYPE CURSOR.
* Select ranges
RANGES: L_R_RYEAR FOR ZHBSJ-RYEAR,
L_R_POPER FOR ZHBSJ-POPER,
L_R_DOCNR FOR ZHBSJ-DOCNR,
L_R_CPUDT FOR ZHBSJ-CPUDT,
L_R_RBUKRS FOR ZHBSJ-RBUKRS.
* Initialization mode (first call by SAPI) or data transfer mode
* (following calls) ?
IF I_INITFLAG = SBIWA_C_FLAG_ON.
************************************************************************
* Initialization: check input parameters
* buffer input parameters
* prepare data selection
************************************************************************
* Check DataSource validity
CASE I_DSOURCE.
WHEN 'ZDS_ZHBSJ'.
WHEN OTHERS.
IF 1 = 2. MESSAGE E009(R3). ENDIF.
* this is a typical log call. Please write every error message like this
LOG_WRITE 'E' "message type
'R3' "message class
'009' "message number
I_DSOURCE "message variable 1
' '. "message variable 2
RAISE ERROR_PASSED_TO_MESS_HANDLER.
ENDCASE.
APPEND LINES OF I_T_SELECT TO S_S_IF-T_SELECT.
* Fill parameter buffer for data extraction calls
S_S_IF-REQUNR = I_REQUNR.
S_S_IF-DSOURCE = I_DSOURCE.
S_S_IF-MAXSIZE = I_MAXSIZE.
* Fill field list table for an optimized select statement
* (in case that there is no 1:1 relation between InfoSource fields
* and database table fields this may be far from beeing trivial)
APPEND LINES OF I_T_FIELDS TO S_S_IF-T_FIELDS.
ELSE. "Initialization mode or data extraction ?
************************************************************************
* Data transfer: First Call OPEN CURSOR + FETCH
* Following Calls FETCH only
************************************************************************
* First data package -> OPEN CURSOR
IF S_COUNTER_DATAPAKID = 0.
* Fill range tables BW will only pass down simple selection criteria
* of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'RYEAR'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_RYEAR.
APPEND L_R_RYEAR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'POPER'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_POPER.
APPEND L_R_POPER.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'DOCNR'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_DOCNR.
APPEND L_R_DOCNR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'CPUDT'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_CPUDT.
APPEND L_R_CPUDT.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'RBUKRS'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_RBUKRS.
APPEND L_R_RBUKRS.
ENDLOOP.
* Determine number of database records to be read per FETCH statement
* from input parameter I_MAXSIZE. If there is a one to one relation
* between DataSource table lines and database entries, this is trivial.
* In other cases, it may be impossible and some estimated value has to
* be determined.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT * FROM ZHBSJ WHERE RYEAR IN L_R_RYEAR AND
POPER IN L_R_POPER AND
DOCNR IN L_R_DOCNR AND
CPUDT IN L_R_CPUDT AND
RBUKRS IN L_R_RBUKRS.
ENDIF. "First data package ?
* Fetch records into interface table.
* named E_T_'Name of extract structure'.
FETCH NEXT CURSOR S_CURSOR
APPENDING CORRESPONDING FIELDS
OF TABLE it_data
PACKAGE SIZE S_S_IF-MAXSIZE.
IF SY-SUBRC <> 0.
CLOSE CURSOR S_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
SELECT BUKRS WAERS FROM T001 INTO CORRESPONDING FIELDS OF TABLE LT_T001.
SORT LT_T001 BY BUKRS .
LOOP AT it_data INTO wa_data.
IF wa_data-ZZPS_PSP_PNR IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ABPSP_OUTPUT'
EXPORTING
INPUT = wa_data-ZZPS_PSP_PNR
IMPORTING
OUTPUT = wa_data-ZZWBSID .
ENDIF.
READ TABLE LT_T001 INTO LS_T001 WITH KEY BUKRS = wa_data-RBUKRS BINARY SEARCH ."根據表ZHBSJ和T001的相同欄位RBUKRS,在T001中查詢對應的本位幣貨幣碼WAERS
IF SY-SUBRC = 0 .
wa_data-WAERS = LS_T001-WAERS .
ENDIF.
APPEND wa_data TO e_t_data.
CLEAR wa_data.
ENDLOOP.
S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1.
ENDIF. "Initialization mode or data extraction ?
ENDFUNCTION.
Step5:TCODE:RSO2 建立資料來源
資料來源名:ZDS_ZHBSJ
這次的資料來源我們以事務資料作為資料來源
填寫應用程式元件/簡要描述/中間的說明/長文字描述資訊
點選儲存圖示後,跳到如下介面,將有查詢條件的欄位在“選擇”上選中,然後點選儲存,這時候資料來源就新增完成了
Step6:TCODE:RSA3 測試資料來源
輸入我們要測試的資料來源名稱,然後點選“提取”按鈕,就可以提取到滿足條件的資料記錄
好,到這裡,所有的工作都完成了!
注意:
資料來源建立完成後,在資料結構中若需要新增欄位,此新增欄位在資料來源會預設為欄位隱藏,這時候請一定不要忘記取消隱藏!