Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Optimizing code

Former Member
0 Likes
439

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

3 REPLIES 3
Read only

Former Member
0 Likes
407

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.

Read only

JozsefSzikszai
Active Contributor
0 Likes
407

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

Read only

Former Member
0 Likes
407

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.