Our extractor program which fetches the data from R/3 to BW. But the extractor short dumps when we extract large amount of data. Can anyone say where we can optimize our code for better performance.
Extractor code is,
FUNCTION Z_01FBIW_EXTRACTOR .
*"----
""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 TYPE ZBWFI_FDATA1 OPTIONAL
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----
DATA: Begin of s_bkpf,
mandt like bkpf-mandt,
bukrs like bkpf-bukrs,
belnr like bkpf-belnr,
gjahr like bkpf-gjahr,
blart like bkpf-blart,
bldat like bkpf-bldat,
budat like bkpf-budat,
cpudt like bkpf-cpudt,
monat like bkpf-monat,
xblnr like bkpf-xblnr,
bktxt like bkpf-bktxt,
xref1_hd like bkpf-xref1_hd,
xref2_hd like bkpf-xref2_hd,
wwert like bkpf-wwert,
kursf like bkpf-kursf,
xmwst like bkpf-xmwst,
ldgrp like bkpf-ldgrp,
yke_awsys like bkpf-yke_awsys,
ktopl like t001-ktopl,
End of s_bkpf.
DATA: Begin of s_bseg,
mandt like bseg-mandt,
bukrs like bseg-bukrs,
belnr like bseg-belnr,
gjahr like bseg-gjahr,
buzei like bseg-buzei,
dmbtr like bseg-dmbtr,
wrbtr like bseg-wrbtr,
hkont like bseg-hkont,
lifnr like bseg-lifnr,
kunnr like bseg-kunnr,
zuonr like bseg-zuonr,
sgtxt like bseg-sgtxt,
aufnr like bseg-aufnr,
fkber_long like bseg-fkber_long,
paobjnr like bseg-paobjnr,
projk like bseg-projk,
bewar like bseg-bewar,
vbund like bseg-vbund,
mwskz like bseg-mwskz,
txjcd like bseg-txjcd,
menge like bseg-menge,
matnr like bseg-matnr,
werks like bseg-werks,
zterm like bseg-zterm,
zfbdt like bseg-zfbdt,
zlsch like bseg-zlsch,
zlspr like bseg-zlspr,
uzawe like bseg-uzawe,
qsskz like bseg-qsskz,
kidno like bseg-kidno,
End of s_bseg.
DATA: Begin of s_faglflexa,
rclnt like faglflexa-rclnt,
rbukrs like faglflexa-rbukrs,
docnr like faglflexa-docnr,
ryear like faglflexa-ryear,
rldnr like faglflexa-rldnr,
docln like faglflexa-docln,
buzei like faglflexa-buzei,
usnam like faglflexa-usnam,
rtcur like faglflexa-rtcur,
bschl like faglflexa-bschl,
drcrk like faglflexa-drcrk,
tsl like faglflexa-tsl,
hsl like faglflexa-hsl,
ksl like faglflexa-ksl,
rcntr like faglflexa-rcntr,
prctr like faglflexa-prctr,
RACCT like faglflexa-racct,
kokrs like faglflexa-kokrs,
segment like faglflexa-segment,
pprctr like faglflexa-pprctr,
runit like faglflexa-runit,
End of s_faglflexa.
DATA: Begin of s_bseg_add,
mandt like bseg_add-mandt,
belnr like bseg_add-belnr,
bukrs like bseg_add-bukrs,
gjahr like bseg_add-gjahr,
buzei like bseg_add-buzei,
dmbtr like bseg_add-dmbtr,
wrbtr like bseg_add-wrbtr,
dmbe2 like bseg_add-dmbe2,
zuonr like bseg_add-zuonr,
sgtxt like bseg_add-sgtxt,
aufnr like bseg_add-aufnr,
hkont like bseg_add-hkont,
paobjnr like bseg_add-paobjnr,
projk like bseg_add-projk,
bewar like bseg_add-bewar,
mwskz like bseg_add-mwskz,
txjcd like bseg_add-txjcd,
menge like bseg_add-menge,
matnr like bseg_add-matnr,
werks like bseg_add-werks,
End of s_bseg_add.
DATA: Begin of s_z01trtr_doc_hist,
mandt like z01trtr_doc_hist-mandt,
belnr like z01trtr_doc_hist-belnr,
bukrs like z01trtr_doc_hist-bukrs,
gjahr like z01trtr_doc_hist-gjahr,
leg_sys like z01trtr_doc_hist-leg_sys,
cyc_num like z01trtr_doc_hist-cyc_num,
rep_ind like z01trtr_doc_hist-rep_ind,
rec_typ like z01trtr_doc_hist-rec_typ,
buzei_leg like z01trtr_doc_hist-buzei_leg,
hkont like z01trtr_doc_hist-hkont,
lifnr like z01trtr_doc_hist-lifnr,
kunnr like z01trtr_doc_hist-kunnr,
wrbtr like z01trtr_doc_hist-wrbtr,
dmbtr like z01trtr_doc_hist-dmbtr,
dmbe2 like z01trtr_doc_hist-dmbe2,
zuonr like z01trtr_doc_hist-zuonr,
sgtxt like z01trtr_doc_hist-sgtxt,
aufnr like z01trtr_doc_hist-aufnr,
fkber_long like z01trtr_doc_hist-fkber_long,
paobjnr like z01trtr_doc_hist-paobjnr,
projk like z01trtr_doc_hist-projk,
bewar like z01trtr_doc_hist-bewar,
vbund like z01trtr_doc_hist-vbund,
mwskz like z01trtr_doc_hist-mwskz,
txjcd like z01trtr_doc_hist-txjcd,
menge like z01trtr_doc_hist-menge,
matnr like z01trtr_doc_hist-matnr,
werks like z01trtr_doc_hist-werks,
zterm like z01trtr_doc_hist-zterm,
zfbdt like z01trtr_doc_hist-zfbdt,
zlsch like z01trtr_doc_hist-zlsch,
zlspr like z01trtr_doc_hist-zlspr,
uzawe like z01trtr_doc_hist-uzawe,
qsskz like z01trtr_doc_hist-qsskz,
kidno like z01trtr_doc_hist-kidno,
indust like z01trtr_doc_hist-indust,
poo_tag like z01trtr_doc_hist-poo_tag,
brand like z01trtr_doc_hist-brand,
leg_doc like z01trtr_doc_hist-leg_doc,
ser_off like z01trtr_doc_hist-ser_off,
bus_lin like z01trtr_doc_hist-bus_lin,
pro_str like z01trtr_doc_hist-pro_str,
product like z01trtr_doc_hist-product,
End of s_z01trtr_doc_hist.
DATA: t_bkpf LIKE HASHED TABLE OF s_bkpf WITH UNIQUE KEY BUKRS BELNR GJAHR WITH HEADER LINE,
t_bseg like table of s_bseg with header line,
t_faglflexa like table of s_faglflexa with header line,
T_Z01TRTR_DOC_HIST like TABLE OF s_z01trtr_doc_hist with header line,
t_bseg_add like table of s_bseg_add with header line.
Data : begin of s_t001,
mandt like t001-mandt,
bukrs like t001-bukrs,
ktopl like t001-ktopl,
end of s_t001.
Data : t_t001 like table of s_t001 with header line.
TYPES: BEGIN of i_data.
Include structure zcapbisfibwextr.
Include structure z01SBIW.
TYPES: END OF i_data.
DATA: h_tabix LIKE sy-tabix.
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.
RANGES: R_BUKRS FOR BKPF-BUKRS,
R_BELNR FOR BKPF-BELNR,
R_GJAHR FOR BKPF-GJAHR,
R_CPUDT FOR BKPF-CPUDT,
R_LDGRP FOR BKPF-LDGRP,
R_YKE_AWSYS FOR BKPF-YKE_AWSYS. " included cpudt in the ranges
IF I_INITFLAG = SBIWA_C_FLAG_ON.
************************************************************************
Initialization: check input parameters
buffer input parameters
prepare data selection
************************************************************************
Check DataSource validity
CASE I_DSOURCE.
WHEN 'ZCAPBIDSFIBW_EXTR'.
WHEN OTHERS.
IF 1 = 2. MESSAGE E009(R3).
ENDIF.
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
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 = 'BUKRS'.
MOVE-CORRESPONDING L_S_SELECT TO R_BUKRS.
APPEND R_BUKRS.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'BELNR'.
MOVE-CORRESPONDING L_S_SELECT TO R_BELNR.
APPEND R_BELNR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'GJAHR'.
MOVE-CORRESPONDING L_S_SELECT TO R_GJAHR.
APPEND R_GJAHR.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'CPUDT'. " Fill range table added for feild CPUDT
MOVE-CORRESPONDING L_S_SELECT TO R_CPUDT.
APPEND R_CPUDT.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'LDGRP'.
MOVE-CORRESPONDING L_S_SELECT TO R_LDGRP.
APPEND R_LDGRP.
ENDLOOP.
LOOP AT S_S_IF-T_SELECT INTO L_S_SELECT WHERE FIELDNM = 'YKE_AWSYS'.
MOVE-CORRESPONDING L_S_SELECT TO R_YKE_AWSYS.
APPEND R_YKE_AWSYS.
ENDLOOP.
Determine number of database records to be read per FETCH statement
from input parameter I_MAXSIZE.
OPEN CURSOR WITH HOLD S_CURSOR FOR
SELECT mandt bukrs belnr gjahr blart bldat budat cpudt monat xblnr bktxt xref1_hd xref2_hd wwert kursf xmwst ldgrp yke_awsys
FROM BKPF WHERE BUKRS IN R_BUKRS AND BELNR IN R_BELNR AND GJAHR IN R_GJAHR AND CPUDT IN R_CPUDT AND LDGRP IN R_LDGRP
AND YKE_AWSYS IN R_YKE_AWSYS.
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 T_BKPF
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
Sort t_bkpf by mandt bukrs belnr gjahr. " Sorted based on the primary keys of table BKPF
CHECK NOT t_bkpf[] IS INITIAL.
Select mandt bukrs ktopl from t001 into table t_t001.
FREE t_faglflexa.
SELECT rclnt rbukrs docnr ryear rldnr docln buzei
usnam rtcur bschl drcrk tsl hsl
ksl rcntr prctr racct kokrs segment pprctr runit
FROM faglflexa INTO TABLE t_faglflexa FOR ALL ENTRIES IN t_bkpf
WHERE ryear = t_bkpf-gjahr
AND docnr = t_bkpf-belnr
AND rbukrs = t_bkpf-bukrs.
IF sy-subrc IS INITIAL.
SORT t_faglflexa BY ryear docnr rbukrs rldnr.
ENDIF.
FREE t_bseg.
SELECT mandt bukrs belnr gjahr buzei dmbtr
wrbtr hkont lifnr kunnr zuonr sgtxt
aufnr fkber_long paobjnr projk bewar vbund
mwskz txjcd menge matnr werks zterm
zfbdt zlsch zlspr uzawe qsskz kidno
FROM bseg INTO TABLE t_bseg FOR ALL ENTRIES IN t_bkpf
WHERE bukrs = t_bkpf-bukrs
AND belnr = t_bkpf-belnr
and gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
SORT t_bseg BY bukrs belnr gjahr buzei.
ENDIF.
FREE t_bseg_add.
SELECT mandt belnr bukrs gjahr buzei dmbtr
wrbtr dmbe2 zuonr sgtxt aufnr hkont
paobjnr projk bewar mwskz txjcd menge
matnr werks
FROM bseg_add INTO TABLE t_bseg_add FOR ALL ENTRIES IN t_bkpf
WHERE bukrs = t_bkpf-bukrs
AND belnr = t_bkpf-belnr
AND gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
SORT t_bseg_add BY mandt bukrs belnr gjahr buzei.
ENDIF.
FREE t_z01trtr_doc_hist.
SELECT mandt belnr bukrs gjahr leg_sys cyc_num rep_ind rec_typ buzei_leg hkont
lifnr kunnr wrbtr dmbtr dmbe2 zuonr sgtxt aufnr fkber_long paobjnr
projk bewar vbund mwskz txjcd menge matnr werks zterm zfbdt
zlsch zlspr uzawe qsskz kidno indust poo_tag brand leg_doc ser_off
bus_lin pro_str product
FROM z01trtr_doc_hist INTO TABLE t_z01trtr_doc_hist FOR ALL ENTRIES IN t_bkpf
WHERE bukrs = t_bkpf-bukrs
AND belnr = t_bkpf-belnr
AND gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
SORT t_z01trtr_doc_hist BY bukrs belnr gjahr.
ENDIF.
DATA: l_index TYPE sytabix.
LOOP AT t_bkpf.
READ TABLE t_t001 WITH KEY MANDT = t_bkpf-mandt
BUKRS = t_bkpf-bukrs.
IF sy-subrc = 0.
t_bkpf-ktopl = t_t001-ktopl.
ENDIF.
IF ( t_bkpf-ldgrp = '0L' AND t_bkpf-yke_awsys <> ' ' OR " Change of condition
t_bkpf-ldgrp = ' ' AND t_bkpf-yke_awsys <> ' ' ).
READ TABLE t_faglflexa BINARY SEARCH WITH KEY ryear = t_bkpf-gjahr
docnr = t_bkpf-belnr
rbukrs = t_bkpf-bukrs.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_faglflexa FROM l_index.
IF t_faglflexa-ryear <> t_bkpf-gjahr
OR t_faglflexa-docnr <> t_bkpf-belnr
OR t_faglflexa-rbukrs <> t_bkpf-bukrs.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_faglflexa TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
READ TABLE t_z01trtr_doc_hist BINARY SEARCH WITH KEY bukrs = t_bkpf-bukrs
belnr = t_bkpf-belnr
gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_z01trtr_doc_hist FROM l_index.
IF t_z01trtr_doc_hist-bukrs <> t_bkpf-bukrs
OR t_z01trtr_doc_hist-belnr <> t_bkpf-belnr
OR t_z01trtr_doc_hist-gjahr <> t_bkpf-gjahr.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_z01trtr_doc_hist TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
ELSEIF ( t_bkpf-ldgrp = '0L' AND t_bkpf-yke_awsys = ' ' ) OR
( t_bkpf-ldgrp = ' ' AND t_bkpf-yke_awsys = ' ' ).
READ TABLE t_bseg BINARY SEARCH WITH KEY bukrs = t_bkpf-bukrs
belnr = t_bkpf-belnr
gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_bseg FROM l_index.
IF t_bseg-bukrs <> t_bkpf-bukrs
OR t_bseg-belnr <> t_bkpf-belnr
OR t_bseg-gjahr <> t_bkpf-gjahr.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_bseg TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
READ TABLE t_faglflexa BINARY SEARCH WITH KEY ryear = t_bkpf-gjahr
docnr = t_bkpf-belnr
rbukrs = t_bkpf-bukrs.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_faglflexa FROM l_index.
IF t_faglflexa-ryear <> t_bkpf-gjahr
OR t_faglflexa-docnr <> t_bkpf-belnr
OR t_faglflexa-rbukrs <> t_bkpf-bukrs.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_faglflexa TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
ELSEIF t_bkpf-yke_awsys = ' '.
READ TABLE t_bseg_add BINARY SEARCH WITH KEY bukrs = t_bkpf-bukrs
belnr = t_bkpf-belnr
gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_bseg_add FROM l_index.
IF t_bseg_add-bukrs <> t_bkpf-bukrs
OR t_bseg_add-belnr <> t_bkpf-belnr
OR t_bseg_add-gjahr <> t_bkpf-gjahr.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_bseg_add TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
READ TABLE t_faglflexa BINARY SEARCH WITH KEY ryear = t_bkpf-gjahr
docnr = t_bkpf-belnr
rbukrs = t_bkpf-bukrs.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_faglflexa FROM l_index.
IF t_faglflexa-ryear <> t_bkpf-gjahr
OR t_faglflexa-docnr <> t_bkpf-belnr
OR t_faglflexa-rbukrs <> t_bkpf-bukrs.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_faglflexa TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
ELSE.
READ TABLE t_faglflexa BINARY SEARCH WITH KEY ryear = t_bkpf-gjahr
docnr = t_bkpf-belnr
rbukrs = t_bkpf-bukrs.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_faglflexa FROM l_index.
IF t_faglflexa-ryear <> t_bkpf-gjahr
OR t_faglflexa-docnr <> t_bkpf-belnr
OR t_faglflexa-rbukrs <> t_bkpf-bukrs.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_faglflexa TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
READ TABLE t_z01trtr_doc_hist BINARY SEARCH WITH KEY bukrs = t_bkpf-bukrs
belnr = t_bkpf-belnr
gjahr = t_bkpf-gjahr.
IF sy-subrc IS INITIAL.
l_index = sy-tabix.
LOOP AT t_z01trtr_doc_hist FROM l_index.
IF t_z01trtr_doc_hist-bukrs <> t_bkpf-bukrs
OR t_z01trtr_doc_hist-belnr <> t_bkpf-belnr
OR t_z01trtr_doc_hist-gjahr <> t_bkpf-gjahr.
EXIT.
ENDIF.
CLEAR e_t_data.
MOVE-CORRESPONDING t_z01trtr_doc_hist TO e_t_data.
MOVE-CORRESPONDING t_bkpf TO e_t_data.
APPEND e_t_data.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
Free T_bkpf.
Free T_bseg.
Free T_Bseg_add.
Free T_faglflexa.
Free t_z01trtr_doc_hist.
ENDFUNCTION.