BW 增加自定义数据源
tcode: rso2 (sbiw) ,rsa3(测试)

1. table :


2.funciton




FUNCTION ZZFUN_BW_EXTRACT_ZFI003.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" REFERENCE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR OPTIONAL
*" REFERENCE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*" REFERENCE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*" REFERENCE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*" REFERENCE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*" REFERENCE(I_REMOTE_CALL) TYPE SBIWA_FLAG DEFAULT
*" SBIWA_C_FLAG_OFF
*" TABLES
*" E_T_DATA STRUCTURE ZBW_FI003 OPTIONAL
*" I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
*" I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
*"----------------------------------------------------------------------
* 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
DATA: L_BUKRS LIKE ZBW_FI003-BUKRS,
L_GJAHR LIKE ZBW_FI003-GJAHR.
RANGES:
L_R_MONAT FOR ZBW_FI003-MONAT.
* 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 'Z01DST28'.
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 = 'BUKRS'.
L_BUKRS = L_S_SELECT-LOW.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'GJAHR'.
L_GJAHR = L_S_SELECT-LOW.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'MONAT'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_MONAT.
APPEND L_R_MONAT.
ENDLOOP.
IF L_BUKRS <> '9999' AND L_BUKRS <> ''.
SUBMIT ZFIR_003 WITH P_BUKRS = L_BUKRS
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT AND RETURN .
ELSEIF L_BUKRS = ''.
SUBMIT ZFIR_003 WITH P_BUKRS = '1010'
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT AND RETURN .
SUBMIT ZFIR_003 WITH P_BUKRS = '1020'
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT AND RETURN .
SUBMIT ZFIR_003 WITH P_BUKRS = '1030'
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT AND RETURN .
SUBMIT ZFIR_003 WITH P_BUKRS = '1040'
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT AND RETURN .
SUBMIT ZFIR_003 WITH P_BUKRS = '1060'
WITH P_GJAHR = L_GJAHR
WITH S_MONAT IN L_R_MONAT
