Hi Experts,
My extractor is picking only one data packet. I have come to know that this is happening because of the wrong placing of the end if statement. There should be an end if statement after open cursor statement. Can anyone sugguest me a solution.
Logic Implemented in the code:
FUNCTION z_fi_gl_openitems.
*"----
""Local Interface:
*" 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 ZFI_GL_OPITEM OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----
Example: DataSource for table SFLIGHT
TABLES: bseg,bkpf,bsis,bsid,bsik.
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
DATA: bsis_cursor TYPE cursor,
bsik_cursor TYPE cursor,
bsid_cursor TYPE cursor,
bseg_cursor TYPE cursor.
Select ranges
RANGES: zgjahr FOR bseg-gjahr,
zbukrs FOR bseg-bukrs,
zbudat FOR bsis-budat,
zmonat FOR bsis-monat,
ZBELNR for BSEG-BELNR.
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 'ZFI_GL_OPENITEMS'.
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 = 'GJAHR'.
MOVE-CORRESPONDING l_s_select TO zgjahr.
APPEND zgjahr.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'BUKRS'.
MOVE-CORRESPONDING l_s_select TO zbukrs.
APPEND zbukrs.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'MONAT'.
MOVE-CORRESPONDING l_s_select TO zmonat.
APPEND zmonat.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'BUDAT'.
MOVE-CORRESPONDING l_s_select TO zbudat.
APPEND zbudat.
ENDLOOP.
LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'BELNR'.
MOVE-CORRESPONDING l_s_select TO zbelnr.
APPEND zbelnr.
ENDLOOP.
*
OPEN CURSOR bsis_cursor FOR
SELECT bukrs gjahr belnr
FROM bsis WHERE xopvw = 'X'
AND bukrs IN zbukrs
AND gjahr IN zgjahr
AND BELNR IN ZBELNR
AND budat IN zbudat
AND monat IN zmonat.
FETCH NEXT CURSOR bsis_cursor
APPENDING CORRESPONDING FIELDS
OF TABLE itab_bsis
PACKAGE SIZE s_s_if-maxsize.
IF sy-subrc <> 0.
CLOSE CURSOR bsis_cursor.
RAISE no_more_data.
ENDIF.
SORT itab_bsis .
DELETE ADJACENT DUPLICATES FROM itab_bsis.
APPEND LINES OF itab_bsis TO itab_final.
*
OPEN CURSOR bsik_cursor FOR
SELECT bukrs gjahr belnr
FROM bsik WHERE bukrs IN zbukrs
AND gjahr IN zgjahr
AND BELNR IN ZBELNR
AND budat IN zbudat
AND monat IN zmonat.
FETCH NEXT CURSOR bsik_cursor
APPENDING CORRESPONDING FIELDS
OF TABLE itab_bsik
PACKAGE SIZE s_s_if-maxsize.
IF sy-subrc <> 0.
CLOSE CURSOR bsik_cursor.
RAISE no_more_data.
ENDIF.
SORT itab_bsik .
DELETE ADJACENT DUPLICATES FROM itab_bsik.
APPEND LINES OF itab_bsik TO itab_final.
OPEN CURSOR BSID_CURSOR FOR
SELECT BUKRS GJAHR BELNR
FROM BSID WHERE bukrs IN zbukrs
AND gjahr IN zgjahr
AND BELNR IN ZBELNR
AND budat IN zbudat
AND monat IN zmonat.
FETCH NEXT CURSOR BSID_CURSOR
APPENDING CORRESPONDING FIELDS
OF TABLE ITAB_BSID
PACKAGE SIZE S_S_IF-MAXSIZE.
IF SY-SUBRC <> 0.
CLOSE CURSOR BSID_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
SORT ITAB_BSID .
DELETE ADJACENT DUPLICATES FROM ITAB_BSID.
APPEND LINES OF ITAB_BSID TO ITAB_FINAL.
SORT itab_final.
DELETE ADJACENT DUPLICATES FROM itab_final.
**IF ITAB_FINAL[] IS NOT INITIAL.
*
OPEN CURSOR with hold BSEG_CURSOR for
SELECT bukrs belnr gjahr buzei hkont koart umskz bschl wrbtr dmbtr valut augdt augbl kokrs kostl prctr aufnr projk
werks gsber fkber pprct pargb vbund xref3 sgtxt xnegp zuonr
from BSEG FOR ALL ENTRIES IN itab_final
WHERE bukrs EQ itab_final-bukrs
AND gjahr EQ itab_final-gjahr
AND belnr EQ itab_final-belnr.
FETCH NEXT CURSOR BSEG_CURSOR
APPENDING CORRESPONDING FIELDS OF TABLE E_T_DATA
PACKAGE SIZE S_S_IF-MAXSIZE.
IF SY-SUBRC <> 0.
CLOSE CURSOR BSEG_CURSOR.
RAISE NO_MORE_DATA.
ENDIF.
S_COUNTER_DATAPAKID = S_COUNTER_DATAPAKID + 1.
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.
*IF ITAB_FINAL[] IS NOT INITIAL.
*
SELECT bukrs belnr gjahr buzei hkont koart umskz bschl wrbtr dmbtr valut augdt augbl kokrs kostl prctr aufnr projk
werks gsber fkber pprct pargb vbund xref3 sgtxt xnegp zuonr
FROM bseg INTO CORRESPONDING FIELDS OF TABLE e_t_data
FOR ALL ENTRIES IN itab_final
WHERE bukrs EQ itab_final-bukrs
AND gjahr EQ itab_final-gjahr
AND belnr EQ itab_final-belnr
AND BUZEI EQ itab_final-buzei.
*
DATA v_awsys TYPE bkpf-awsys.
SELECT awsys INTO v_awsys
FROM bkpf "into CORRESPONDING FIELDS OF TABLE E_T_DATA
FOR ALL ENTRIES IN itab_final
WHERE bukrs EQ itab_final-bukrs
AND gjahr EQ itab_final-gjahr
AND belnr EQ itab_final-belnr.
READ TABLE e_t_data WITH KEY bukrs = itab_final-bukrs
gjahr = itab_final-gjahr
belnr = itab_final-belnr
buzei = itab_final-buzei.
IF sy-subrc EQ 0.
e_t_data-awsys = v_awsys.
CLEAR v_awsys.
MODIFY e_t_data FROM e_t_data TRANSPORTING awsys.
ENDIF.
ENDSELECT .
*
*
*endif.
ENDIF.
"First data package ?
Fetch records into interface table.
named E_T_'Name of extract structure'.
ENDIF. "Initialization mode or data extraction ?
ENDFUNCTION.