cancel
Showing results for 
Search instead for 
Did you mean: 

Package on internal table

Former Member
0 Kudos

Hi,

I’m coding a generic extrator based on the expample function module ZRSAX_BIW_GET_DATA_SIMPLE. I’m 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, it’s an internal table. What do I have to change, so that the coding also works in my situation?

Regards,

Gabi

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

Gabi,

please post the top of the fm here. Just the first few lines with the interface description.

regards

Siggi

Former Member
0 Kudos

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

Former Member
0 Kudos

Hi Gabi,

based on your coding and the interface description the error should not occur. Is it also possible for you to post the relevant part of the dump in here?

regards

Siggi

PS: Additionally you can give me a call if you want.

Former Member
0 Kudos

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

Former Member
0 Kudos

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

Former Member
0 Kudos

Hi Siggi,

in the meantime I wrote a new fm with same coding. I don't know why, but now it works.

Thanks for helping me.

Regards,

Gabi

Answers (0)