on 12-05-2005 8:14 AM
Hi,
Im coding a generic extrator based on the expample function module ZRSAX_BIW_GET_DATA_SIMPLE. Im new in ABAP and have problems to adjust the following part of the coding (creating the data packages in line 92-123):
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT (S_S_IF-T_FIELDS) FROM SFLIGHT
WHERE CARRID IN L_R_CARRID AND
CONNID IN L_R_CONNID.
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.
In my case SFLIGHT is not a standard table, its an internal table. What do I have to change, so that the coding also works in my situation?
Regards,
Gabi
Hi Gabi,
if your table is an internal table you already did the select, didn't you? Then you only need to do a loop over your internal table to populate the return table e_t_data.
Please check out the weblog /people/siegfried.szameitat/blog/2005/09/29/generic-extraction-via-function-module . It might be of some help. If not, please post your code in here.
regards
Siggi
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi Siggi,
I'm alos not sure what to do. How can I split the e_t_data into packages and raise "NO_MORE_DATA".
Here is my coding:
The function 'ZWEEE_COLLECT_SPEC_DATA' fills the internal table E_T_SPEC_EXTR.
FUNCTION ZWEEE_EXTRACTION_SPEC_DATA.
*"----
""Lokale Schnittstelle:
*" 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
*" 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 ZWEEES_MAT_SPEC_CHAR OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----
DataSource for extruct structure
data: E_T_SPEC_EXTR type standard table of ZWEEES_MAT_SPEC_CHAR,
wa_e_t_spec_extr type ZWEEES_MAT_SPEC_CHAR.
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_MATNR FOR ZWEEES_MAT_SPEC_CHAR-MATNR,
L_R_SPECNR FOR ZWEEES_MAT_SPEC_CHAR-SPECNR,
L_R_CRDAT FOR ZWEEES_MAT_SPEC_CHAR-CRDAT,
L_R_UPDDAT FOR ZWEEES_MAT_SPEC_CHAR-UPDDAT.
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 'ZWEEE_SPEC'.
WHEN OTHERS.
IF 1 = 2. MESSAGE E009(R3). ENDIF.
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 = 'MATNR'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_MATNR.
APPEND L_R_MATNR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'SPECNR'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_SPECNR.
APPEND L_R_SPECNR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'CRDAT'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_CRDAT.
APPEND L_R_CRDAT.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'UPDDAT'.
MOVE-CORRESPONDING L_S_SELECT TO L_R_UPDDAT.
APPEND L_R_UPDDAT.
ENDLOOP.
creat extract structure
CALL FUNCTION 'ZWEEE_COLLECT_SPEC_DATA'
TABLES
E_T_DATA = E_T_SPEC_EXTR
EXCEPTIONS
NO_WEEE_PRODUCT = 1
CONV_MATNR_NOT_POSSIBLE = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
MESSAGE E022(R3).
RAISE ERROR_PASSED_TO_MESS_HANDLER.
ENDIF.
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 E_T_SPEC_EXTR
WHERE MATNR IN L_R_MATNR AND
SPECNR IN L_R_SPECNR AND
CRDAT IN L_R_CRDAT AND
UPDDAT IN L_R_UPDDAT.
OPEN CURSOR WITH HOLD S_CURSOR FOR
loop at e_t_spec_extr into wa_e_t_spec_extr
WHERE MATNR IN L_R_MATNR AND
SPECNR IN L_R_SPECNR AND
CRDAT IN L_R_CRDAT AND
UPDDAT IN L_R_UPDDAT.
append wa_e_t_spec_extr to e_t_data.
endloop.
ENDIF. "First data package ?
Fetch records into interface table.
named E_T_SPEC_EXTR.
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.
S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1.
ENDIF. "Initialization mode or data extraction ?
ENDFUNCTION.
Thanks for your help.
Gabi
Hi Gabi,
first of all, your range tabs as well as the table e_t_spec_extr has to be defined globally and not local in the fm, except you pass all data with the first data package.
Additionally you might think about reading only a subset of data into e_t_spec_extr and not all data. This is not a must, but in case of a huge amount of data you might get memory issues.
At your loop at e_t_spec_extr you can do the following:
l_count = 0.
loop at e_t_spec_extr into wa_e_t_spec_extr
WHERE MATNR IN L_R_MATNR AND
SPECNR IN L_R_SPECNR AND
CRDAT IN L_R_CRDAT AND
UPDDAT IN L_R_UPDDAT.
l_index = sy-tabix.
append wa_e_t_spec_extr to e_t_data.
delete e_t_spec_extr index l_index.
l_count = l_count + 1.
if l_count > s_s_if-maxsize.
exit.
endif.
endloop.
describe e_t_spec_extr lines l_count.
IF SY-SUBRC <> 0 or l_count = 0.
CLOSE CURSOR S_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
Hope this helps!
regards
Siggi
Hi Siggi,
thank you very much for your help. Now it is much better.
But if I try to check the extractor with rsa3, I get the following short dump.
An exception occurred. This exception is dealt with in more detail below
. The exception, which is assigned to the class 'CX_SY_DYN_CALL_PARAM_MISSING',
was neither
caught nor passed along using a RAISING clause, in the procedure
"RSA3_GET_DATA_SIMPLE" "(FUNCTION)"
.
Since the caller of the procedure could not have expected this exception
to occur, the running program was terminated.
The reason for the exception is:
When calling the function module "ZWEEE_COLLECT_SPEC_DATA", one of the
parameters
needed according to the interface description was not specified.
This parameter was "E_T_DATA".
Do have an idea what the problem could be? In the module "ZWEEE_COLLECT_SPEC_DATA" is parameter "E_T_DATA" optional.
Regards,
Gabi
Hi Siggi,
this is the import:
I_REQUNR TYPE SRSC_S_IF_SIMPLE-REQUNR Request Number: identif. eine Datenanforderung
I_DSOURCE TYPE SRSC_S_IF_SIMPLE-DSOURCE Name der InfoSource
I_MAXSIZE TYPE SRSC_S_IF_SIMPLE-MAXSIZE maximale Anzahl Zeilen der Ausgabetabelle
I_INITFLAG TYPE SRSC_S_IF_SIMPLE-INITFLAG Initialisierung 'X' bzw. Datenübertragung ' '
I_READ_ONLY TYPE SRSC_S_IF_SIMPLE-READONLY
this are the tabels:
I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT Selektionskriterien
I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS Feldliste für SELECT
E_T_DATA LIKE ZWEEES_MAT_SPEC_CHAR Ausgabetabelle für fixe InfoSources
There is no export and no changing.
Regards,
Gabi
Hi Siggi,
here is the part of the code where it dumps:
000260 ? *" ERROR_PASSED_TO_MESS_HANDLER
000270 ? *"
000280 ? STATICS: S_S_IF_SIMPLE TYPE SRSC_S_IF_SIMPLE,
000290 ? S_FNAME LIKE TFDIR-FUNCNAME.
000300 ? IF I_INITFLAG = 'X'.
000310 ? *====== INIT ===========================================================
000320 ? * create interface structure
000330 ? S_S_IF_SIMPLE-REQUNR = I_REQUNR.
000340 ? IF NOT I_ISOURCE IS INITIAL.
000350 ? S_S_IF_SIMPLE-DSOURCE = I_ISOURCE.
000360 ? ELSE.
000370 ? S_S_IF_SIMPLE-DSOURCE = I_CHABASNM.
000380 ? ENDIF.
000390 ? S_S_IF_SIMPLE-MAXSIZE = I_MAXSIZE.
000400 ? S_S_IF_SIMPLE-INITFLAG = I_INITFLAG.
000410 ? APPEND LINES OF I_T_SELECT TO S_S_IF_SIMPLE-T_SELECT.
000420 ? APPEND LINES OF I_T_FIELDS TO S_S_IF_SIMPLE-T_FIELDS.
000430 ? DATA L_S_OSOURCE TYPE RSAOT_S_OSOURCE.
000440 ? CALL FUNCTION 'RSA1_SINGLE_OLTPSOURCE_GET'
000450 ? EXPORTING
000460 ? I_OLTPSOURCE = S_S_IF_SIMPLE-DSOURCE
000470 ? IMPORTING
000480 ? E_S_OLTPSOURCE = L_S_OSOURCE.
000490 ? S_FNAME = L_S_OSOURCE-EXTRACTOR.
000500 ? * call extractor in init mode
000510 ? DATA L_DEBUG(1).
000520 ? IMPORT L_DEBUG FROM MEMORY ID 'RSFH_DBG'.
000530 ? IF L_DEBUG = RSFH_C_DEBUG_LATE.
000540 ? BREAK-POINT. "#EC NOBREAK
000550 ? ENDIF.
-
> ? CALL FUNCTION S_FNAME
000570 ? EXPORTING
000580 ? I_REQUNR = S_S_IF_SIMPLE-REQUNR
000590 ? I_DSOURCE = S_S_IF_SIMPLE-DSOURCE
000600 ? I_MAXSIZE = S_S_IF_SIMPLE-MAXSIZE
000610 ? I_INITFLAG = S_S_IF_SIMPLE-INITFLAG
000620 ? TABLES
000630 ? I_T_SELECT = S_S_IF_SIMPLE-T_SELECT
000640 ? I_T_FIELDS = S_S_IF_SIMPLE-T_FIELDS
000650 ? EXCEPTIONS
000660 ? NO_MORE_DATA = 1
000670 ? ERROR_PASSED_TO_MESS_HANDLER = 2
000680 ? OTHERS.
000690 ? ELSE.
000700 ? *======= FETCH =========================================================
000710 ? REFRESH E_T_DATA.
000720 ? CLEAR E_T_DATA.
And the content of the system fields:
SY-SUBRC 4
SY-TABIX 1
SY-FDPOS 30
SY-PAGNO 0
SY-COLNO 1
SY-UCOMM
SY-MSGTY I
SY-MSGNO 616
SY-MSGV2 RE
SY-MSGV4
SY-INDEX 0
SY-DBCNT 0
SY-LSIND 0
SY-LINNO 1
SY-PFKEY
SY-TITLE Report for the extractor call
SY-MSGID SF
SY-MSGV1 RSFHGEN2
SY-MSGV3 EN
Regards,
Gabi
Hi Gabi,
this looks like the table is missing in your extract fm which is the fm that is entered in the datasource maintenance. Please run the extraction again in rsa3 and check the debug flag. Processing will stop almost right before that function call. Check out the variable s_fname. It looks like you need to add e_t_data to that fm. As you can see in the dump, e_t_data is not part of the tables parameters.
s_fname must contain the name of your extract fm 'ZWEEE_EXTRACTION_SPEC_DATA'.
regards
Siggi
Message was edited by: Siegfried Szameitat
User | Count |
---|---|
75 | |
9 | |
8 | |
7 | |
7 | |
6 | |
6 | |
6 | |
5 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.