‎2008 Nov 05 1:02 PM
Hi
I am using folowing code in a report to fetch some data.
but facing following probelms with it;
1. Getting duplicate entries.
2. Report is running extremely slow.
Kindly suggets some techniques to optimize the code more as well as removing duplicate entries.
THanks in Advance.
****************COde***************************************
----
SELECTION SCREEN
----
SELECT-OPTIONS: s_werks FOR ekpo-werks NO INTERVALS NO-EXTENSION,
s_lifnr FOR ekko-lifnr NO INTERVALS NO-EXTENSION OBLIGATORY,
s_belnr FOR bkpf-belnr NO INTERVALS NO-EXTENSION,
s_budat FOR bkpf-budat.
INITIALIZATION.
PERFORM initialize.
&----
*& Event AT SELECITION-SCREEN *
&----
AT SELECTION-SCREEN.
PERFORM check.
&----
*& Event AT START-OF-SELECTION *
&----
START-OF-SELECTION.
PERFORM get_data.
**&----
***& Event AT END-OF-SELECTION *
**&----
END-OF-SELECTION.
**********Checking Table Initial ****************************************
IF itab_tmp[] IS INITIAL.
MESSAGE e028 WITH 'No IR Data available for Corresponding Input'.
ENDIF.
IF itab_bkpf[] IS INITIAL.
MESSAGE e028 WITH 'No IR Data available for Corresponding Input'.
ENDIF.
IF itab[] IS INITIAL.
MESSAGE e028 WITH 'No Data available for Corresponding Input'.
ENDIF.
WRITE OUT REPORT**************************************************
PERFORM write_data.
&----
*& Form INITIALIZE
&----
text
----
--> p1 text
<-- p2 text
----
FORM initialize.
i_repid = sy-repid.
ENDFORM. "INITIALIZE
&----
*& Form CHECK
&----
text
----
--> p1 text
<-- p2 text
----
FORM check.
Validate Plant if it is not initial
IF NOT s_werks IS INITIAL.
CLEAR ekpo.
SELECT werks
UP TO 1 ROWS
INTO ekpo-werks
FROM ekpo
WHERE werks IN s_werks.
ENDSELECT.
IF sy-subrc NE 0.
There are no entries for Plant
MESSAGE e028 WITH 'Plant not found'.
ENDIF.
ENDIF.
Validate VENDOR if it is not initial
IF NOT s_lifnr IS INITIAL.
CLEAR ekko.
SELECT lifnr
UP TO 1 ROWS
INTO ekko-lifnr
FROM ekko
WHERE lifnr IN s_lifnr.
ENDSELECT.
IF sy-subrc NE 0.
There are no entries for Vendor
MESSAGE e028 WITH 'Vendor not found'.
ENDIF.
ENDIF.
*
Validate INVOICE NUMBER if it is not initial
IF NOT s_belnr IS INITIAL.
CLEAR bkpf.
SELECT belnr
UP TO 1 ROWS
INTO bkpf-belnr
FROM bkpf
WHERE belnr IN s_belnr.
ENDSELECT.
IF sy-subrc NE 0.
There are no entries for this INVOICE NUMBER
MESSAGE e028 WITH 'INVOICE NUMBER not found'.
ENDIF.
ENDIF.
*
*validate POSTING DATE
IF NOT s_budat IS INITIAL.
CLEAR bkpf.
SELECT budat
UP TO 1 ROWS
INTO bkpf-budat
FROM bkpf
WHERE budat IN s_budat.
ENDSELECT.
IF sy-subrc NE 0.
There are no entries for this INVOICE date
MESSAGE e028 WITH 'Posting Date not found'.
ENDIF.
ENDIF.
ENDFORM. "CHECK
&----
*& Form GET_DATA
&----
text
----
--> p1 text
<-- p2 text
----
FORM get_data.
SELECT lifnr ekkoebeln ekkobstyp maktmaktx ekpowerks ekpo~matnr
INTO CORRESPONDING FIELDS OF TABLE itab_final
FROM ekko AS ekko
INNER JOIN ekpo AS ekpo
ON ekkoebeln = ekpoebeln
INNER JOIN makt AS makt
ON ekpomatnr = maktmatnr
WHERE
ekko~lifnr IN s_lifnr
AND ekpo~werks IN s_werks
AND ekko~bstyp = 'L'.
DELETE ADJACENT DUPLICATES FROM itab_final.
*COMPARING ALL FIELDS.
***********************GR DETAILS***********************************************************************
SELECT belnr menge wrbtr budat xblnr ebeln vgabe ebelp
FROM ekbe
INTO CORRESPONDING FIELDS OF table itab2
for all entries in itab_final
WHERE ebeln = itab_final-ebeln
AND vgabe = '1'
AND matnr = itab_final-matnr.
DELETE ADJACENT DUPLICATES FROM itab2.
*COMPARING ALL FIELDS.
LOOP AT itab_final.
z_sytabix = sy-tabix.
if itab2[] is initial.
DELETE itab_final INDEX z_sytabix .
endif.
Loop at itab2 where ebeln = itab_final-ebeln.
itab-lifnr = itab_final-lifnr. "Vendor
itab-ebeln = itab_final-ebeln. "Purch doc
itab-maktx = itab_final-maktx.
itab-matnr = itab_final-matnr.
itab-werks = itab_final-werks.
itab-price = ( itab2-wrbtr / itab2-menge ) * 1000.
itab-menge = itab2-menge. "quantity
itab-wrbtr = itab2-wrbtr. "amount
itab-xblnr = itab2-xblnr. "del. note
itab-budat = itab2-budat. "receipt date
itab-belnr = itab2-belnr. "gr no.
itab-ebelp = itab2-ebelp.
APPEND itab.
CLEAR itab2.
ENDLOOP.
CLEAR itab_final.
endloop.
SORT itab.
DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
********************************************************************************
SELECT belnr vgabe ebelp lfbnr "Reference no belnr
FROM ekbe
INTO CORRESPONDING FIELDS OF table itab_tmp
for all entries in itab
WHERE lfbnr = itab-belnr
AND vgabe = '2'
AND ebelp = itab-ebelp.
DELETE ADJACENT DUPLICATES FROM itab_tmp COMPARING ALL FIELDS.
LOOP at itab.
z_sytabix = sy-tabix.
if itAb_tmp[] is initial.
DELETE itab INDEX z_sytabix .
endif.
Loop at itab_tmp where lfbnr = itab-belnr.
itab-belnr_bkpf = itab_tmp-belnr. "Invoice No
.
MODIFY itab.
CLEAR itab_tmp.
ENDSELECT.
ENDLOOP.
clear itab.
ENdloop.
SORT itab.
DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
*********************************IR DATA*******************************************
IF itab[] IS NOT INITIAL.
SELECT belnr budat xblnr "Invoice no Invoice date
INTO CORRESPONDING FIELDS OF table itab_bkpf
FROM bkpf
for all entries in ITAB
WHERE xblnr = itab-belnr_bkpf
AND blart = 'ZA'
and xblnr NE ' '
and xblnr NE 0
OR budat BETWEEN s_budat-low AND s_budat-high .
DELETE ADJACENT DUPLICATES FROM itab_bkpf COMPARING ALL FIELDS.
LOOP AT itab.
z_sytabix = sy-tabix.
if itab_bkpf[] is initial.
DELETE itab INDEX z_sytabix .
endif.
loop at itab_bkpf where xblnr = itab-belnr_bkpf.
itab-budat_bkpf = itab_bkpf-budat. "Invoice Date.
itab-xblnr_bkpf = itab_bkpf-xblnr. "Reference NO.
itab-belnr_bkpf = itab_bkpf-belnr. "INvoice no.
MODIFY itab.
CLEAR itab_bkpf.
DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
ENDLOOP.
CLEAR itab.
endloop.
ENDIF.
SORT itab.
DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.
ENDFORM. "GET DATA
‎2008 Nov 05 1:12 PM
from the code i could see that you havent sorted the itab before using delete adjacent duplicates , you have to do delete adjacent duplicates for comparing fields that you are using in the where clause for your below code
DELETE ADJACENT DUPLICATES FROM itab_final.
*COMPARING ALL FIELDS.
***********************GR DETAILS***********************************************************************
SELECT belnr menge wrbtr budat xblnr ebeln vgabe ebelp
FROM ekbe
INTO CORRESPONDING FIELDS OF table itab2
for all entries in itab_final
WHERE ebeln = itab_final-ebeln
AND vgabe = '1'
AND matnr = itab_final-matnr.
since you are using ebeln and matnr in where clause you have to do
sort itab_final by ebeln matnr.
delete adjacent duplicates from itab_final comapring ebeln matnr
repeat the same for all " FOR ALL ENTRIES IN " in your program you can see performance improvement.
‎2008 Nov 05 1:28 PM
some finds:
SELECT lifnr ekkoebeln ekkobstyp maktmaktx ekpowerks ekpo~matnr
INTO CORRESPONDING FIELDS OF TABLE itab_final
FROM ekko AS ekko
INNER JOIN ekpo AS ekpo
ON ekkoebeln = ekpoebeln
INNER JOIN makt AS makt
ON ekpomatnr = maktmatnr
WHERE
ekko~lifnr IN s_lifnr
AND ekpo~werks IN s_werks
AND ekko~bstyp = 'L'.
==> add the language to the WHERE conditions : makt~spras EQ sy-langu
DELETE ADJACENT DUPLICATES FROM itab_final.
==> sort the internal table before this statement
+ pls. use 'Display text as code' so it will be easier to read
‎2008 Nov 05 1:55 PM
Apart from sorting, one more thing is that you should check if the control table is initial before using for all entries :
sort itab_final.
DELETE ADJACENT DUPLICATES FROM itab_final.
*COMPARING ALL FIELDS.
if itab_final[] is not initial. "Add this---------------------------
SELECT belnr menge wrbtr budat xblnr ebeln vgabe ebelp
FROM ekbe
INTO CORRESPONDING FIELDS OF table itab2
for all entries in itab_final
WHERE ebeln = itab_final-ebeln
AND vgabe = '1'
AND matnr = itab_final-matnr.
endif. "itab_final[] is not initial.
sort itab2.