Ну вот, только, чур, предоставляется "AS IS". Если найдёте ошибку, пишите (пока, вроде, работает).
Позволяет фильтровать по БЕ и финансовому периоду.
Code:
FUNCTION ZJ3RK_BIW_GET_DATA_SIMPLE.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" 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 ZEXTRJ_3RKKRS OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------
DATA: L_S_SELECT TYPE SRSC_S_SELECT.
STATICS: S_S_IF TYPE SRSC_S_IF_SIMPLE,
S_COUNTER_DATAPAKID LIKE SY-TABIX,
S_CURSOR TYPE CURSOR.
RANGES: L_R_BUKRS FOR ZEXTRJ_3RKKRS-BUKRS,
L_R_FISCPER FOR ZEXTRJ_3RKKRS-FISCPER.
STATICS tmstmp_low TYPE TZNTSTMPS.
STATICS tmstmp_high TYPE TZNTSTMPS.
STATICS tz TYPE ttzz-tzone.
STATICS: date_low TYPE d,
time_low TYPE t.
STATICS: date_high TYPE d,
time_high TYPE t.
STATICS datamode TYPE c.
STATICS: gjahr_low TYPE GJAHR,
monat_low TYPE MONAT.
STATICS: gjahr_high TYPE GJAHR,
monat_high TYPE MONAT.
DATA: foundflag TYPE c.
DATA: line_beg TYPE i,
line_end TYPE i.
FIELD-SYMBOLS <fs_data> TYPE ZEXTRJ_3RKKRS.
* 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 'ZJ_3RKKRS2'.
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'.
break-point.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'BUKRS'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_BUKRS .
APPEND L_R_BUKRS.
ENDLOOP.
foundflag = ''.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'FISCPER'.
IF L_S_SELECT-SIGN = 'I' AND L_S_SELECT-OPTION = 'BT' AND L_S_SELECT-LOW = ''.
gjahr_low = '0000'.
monat_low = '00'.
gjahr_high = L_S_SELECT-HIGH+0(4).
monat_high = L_S_SELECT-HIGH+5(2).
foundflag = 'X'.
ELSEIF L_S_SELECT-SIGN = 'I' AND L_S_SELECT-OPTION = 'EQ' AND L_S_SELECT-LOW = ''.
gjahr_low = L_S_SELECT-LOW+0(4).
monat_low = L_S_SELECT-LOW+5(2).
gjahr_high = '0000'.
monat_high = '00'.
foundflag = 'X'.
ELSE.
gjahr_low = L_S_SELECT-LOW+0(4).
monat_low = L_S_SELECT-LOW+5(2).
gjahr_high = L_S_SELECT-HIGH+0(4).
monat_high = L_S_SELECT-HIGH+5(2).
foundflag = 'X'.
ENDIF.
ENDLOOP.
IF foundflag = ''.
gjahr_low = '0000'.
monat_low = '00'.
gjahr_high = '9999'.
monat_high = '99'.
ENDIF.
foundflag = ''.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'TIMESTAMP'.
IF L_S_SELECT-SIGN = 'I' AND L_S_SELECT-OPTION = 'BT' AND L_S_SELECT-LOW = ''.
tmstmp_low = '000000000000000'.
tmstmp_high = L_S_SELECT-HIGH.
datamode = 'C'.
foundflag = 'X'.
ELSE.
tmstmp_low = L_S_SELECT-LOW.
tmstmp_high = L_S_SELECT-HIGH.
datamode = 'D'.
foundflag = 'X'.
ENDIF.
ENDLOOP.
IF foundflag = ''.
datamode = 'F'.
tmstmp_high = '99991231235959'.
date_high = '99991231'.
time_high = '235959'.
ELSE.
CONVERT TIME STAMP tmstmp_high
TIME ZONE sy-zonlo
INTO DATE date_high
TIME time_high.
ENDIF.
IF datamode = 'C' or datamode = 'F'.
IF gjahr_high = '0000' AND monat_high = '00'.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT * FROM J_3RKKRS
WHERE GJAHR = gjahr_low
AND MONAT = monat_low
AND BUKRS IN L_R_BUKRS
AND CPUDT <= date_high
AND ( CPUDT < date_high OR CPUTM <= time_high ).
ELSE.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT * FROM J_3RKKRS
WHERE GJAHR >= gjahr_low
AND GJAHR <= gjahr_high
AND ( GJAHR > gjahr_low OR MONAT >= monat_low )
AND ( GJAHR < gjahr_high OR MONAT <= monat_high )
AND BUKRS IN L_R_BUKRS
AND CPUDT <= date_high
AND ( CPUDT < date_high OR CPUTM <= time_high ).
ENDIF.
ELSE.
CONVERT TIME STAMP tmstmp_low
TIME ZONE sy-zonlo
INTO DATE date_low
TIME time_low.
IF gjahr_high = '0000' AND monat_high = '00'.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT * FROM J_3RKKRS
WHERE GJAHR = gjahr_low
AND MONAT = monat_low
AND BUKRS IN L_R_BUKRS
AND CPUDT <= date_high
AND ( CPUDT < date_high OR CPUTM <= time_high )
AND CPUDT >= date_low
AND ( CPUDT > date_low OR CPUTM >= time_low ).
ELSE.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT * FROM J_3RKKRS
WHERE GJAHR >= gjahr_low
AND GJAHR <= gjahr_high
AND ( GJAHR > gjahr_low OR MONAT >= monat_low )
AND ( GJAHR < gjahr_high OR MONAT <= monat_high )
AND BUKRS IN L_R_BUKRS
AND CPUDT <= date_high
AND ( CPUDT < date_high OR CPUTM <= time_high )
AND CPUDT >= date_low
AND ( CPUDT > date_low OR CPUTM >= time_low ).
ENDIF.
ENDIF.
ENDIF. "First data package ?
DESCRIBE TABLE E_T_DATA LINES line_beg.
line_beg = line_beg + 1.
FETCH NEXT CURSOR S_CURSOR
APPENDING CORRESPONDING FIELDS
OF TABLE E_T_DATA
PACKAGE SIZE S_S_IF-MAXSIZE.
DESCRIBE TABLE E_T_DATA LINES line_end.
LOOP AT E_T_DATA FROM line_beg TO line_end ASSIGNING <fs_data>.
CONVERT DATE <fs_data>-CPUDT
TIME <fs_data>-CPUTM
INTO TIME STAMP <fs_data>-TIMESTAMP
TIME ZONE sy-zonlo.
CONCATENATE <fs_data>-GJAHR '0' <fs_data>-MONAT INTO <fs_data>-FISCPER.
ENDLOOP.
IF SY-SUBRC <> 0.
CLOSE CURSOR S_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1.
ENDIF. "Initialization mode or data extraction ?
ENDFUNCTION.
У таблицы J_3RKKRS, дополнительно, лучше создать индекс по полям
CPUDT
CPUTM
BUKRS
GJAHR
MONAT
(в таком порядке) После чего выбор дельты будет работать быстрее.