MISSION: 基于簇表建立数据源。
难度:簇表不能用RSO2直接建立数据源,也不能建VIEW来建数据源。所以只能用FM。
SAP 有一个 FM: RSAX_BIW_GET_DATA_SIMPLE,可以作为样板。代码如下:
RSAX_BIW_GET_DATA_SIMPLE
FUNCTION ZBW_SD_YUFEI1.
*"--------------------------------------------------------------------
*"*"本地接口:
*" 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 ZBWS001 OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"--------------------------------------------------------------------
* Example: DataSource for table SFLIGHT
TABLES: KONV.
DATA: wa_zKONV LIKE LINE OF e_t_data,
l_tline LIKE tline OCCURS 0 WITH HEADER LINE,
l_name(70) TYPE c.
DATA: rsal_save_subrc LIKE sy-subrc,
rsal_s_logparms LIKE rslogparms.
DEFINE log_write.
rsal_save_subrc = sy-subrc.
rsal_s_logparms-msgty = &1.
rsal_s_logparms-msgid = &2.
rsal_s_logparms-msgno = &3.
rsal_s_logparms-msgv1 = &4.
rsal_s_logparms-msgv2 = &5.
call function 'RSAL_LOG_WRITE'
exporting
i_msgty = rsal_s_logparms-msgty
i_msgid = rsal_s_logparms-msgid
i_msgno = rsal_s_logparms-msgno
i_msgv1 = rsal_s_logparms-msgv1
i_msgv2 = rsal_s_logparms-msgv2.
sy-subrc = rsal_save_subrc.
END-OF-DEFINITION.
* 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_KNUMV FOR KONV-KNUMV,
l_r_KPOSN FOR KONV-KPOSN,
l_r_STUNR FOR KONV-STUNR,
l_r_ZAEHK FOR KONV-ZAEHK,
l_r_KSCHL FOR KONV-KSCHL,
l_r_KBETR FOR KONV-KBETR.
* 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 'Z_BW_001'.
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 = 'KNUMV'.
MOVE-CORRESPONDING l_s_select TO l_r_KNUMV.
APPEND l_r_KNUMV.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KPOSN'.
MOVE-CORRESPONDING l_s_select TO l_r_KPOSN.
APPEND l_r_KPOSN.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'STUNR'.
MOVE-CORRESPONDING l_s_select TO l_r_STUNR.
APPEND l_r_STUNR.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'ZAEHK'.
MOVE-CORRESPONDING l_s_select TO l_r_ZAEHK.
APPEND l_r_ZAEHK.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KSCHL'.
MOVE-CORRESPONDING l_s_select TO l_r_KSCHL.
APPEND l_r_KSCHL.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KBETR'.
MOVE-CORRESPONDING l_s_select TO l_r_KBETR.
APPEND l_r_KBETR.
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 (s_s_if-t_fields) FROM mchb
SELECT KNUMV KPOSN KSCHL KBETR
FROM KONV
WHERE KONV~KNUMV IN l_r_KNUMV
AND KONV~KPOSN IN l_r_KPOSN
AND KONV~STUNR IN l_r_STUNR
AND KONV~ZAEHK IN l_r_ZAEHK
AND KONV~KSCHL IN l_r_KSCHL
AND KONV~KBETR IN l_r_KBETR.
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 e_t_data
PACKAGE SIZE s_s_if-maxsize.
IF sy-subrc <> 0.
CLOSE CURSOR s_cursor.
RAISE no_more_data.
ENDIF.
LOOP AT e_t_data INTO wa_zkonv.
*******The feature values
* IF wa_zmch1_mchb-cuobj_bm IS NOT INITIAL.
* SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv1
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000001'.
*
* SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv2
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000002'.
*
* SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv3
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000003'.
*
* SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt1
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000006'.
*
* SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt2
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000007'.
*
* SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt3
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000013'.
*
* SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt4
* WHERE objek = wa_zmch1_mchb-cuobj_bm
* AND klart = '023'
* AND atinn = '0000000014'.
* ENDIF.
.
IF sy-subrc <> 0.
MESSAGE 'NO DATA' TYPE 'S'.
* Implement suitable error handling here
ENDIF.
READ TABLE l_tline INDEX 1.
* wa_zkonv-chtxt = l_tline-tdline.
MODIFY e_t_data FROM wa_zkonv.
ENDLOOP.
s_counter_datapakid = s_counter_datapakid + 1.
ENDIF. "Initialization mode or data extraction ?
ENDFUNCTION.