05-29-2009 6:00 AM
Hi experts,
Is there any way to improve the performance of below code
or any proper way to selecting data.
My purpose is getting GR/IR on Miro Document and Posting date basis.
THE CODE IS.
TABLES : bkpf, rseg, bseg.
DATA : BEGIN OF it_bkpf OCCURS 0.
INCLUDE STRUCTURE bkpf.
DATA : bbelnr TYPE bkpf-belnr,
bgjahr TYPE bkpf-gjahr.
DATA : END OF it_bkpf.
*data : it_bkpf like bkpf OCCURS 0 WITH HEADER LINE.
DATA : it_rseg LIKE rseg OCCURS 0 WITH HEADER LINE.
DATA : it_bseg LIKE bseg OCCURS 0 WITH HEADER LINE.
DATA : bbelnr TYPE bkpf-belnr.
DATA : bgjahr TYPE bkpf-gjahr.
DATA : bawkey TYPE bkpf-awkey.
data : dmbtr1 type bseg-dmbtr.
data : dmbtr2 type bseg-dmbtr.
PARAMETERS : p_budat LIKE bkpf-budat.
SELECT SINGLE * FROM bkpf
WHERE budat = p_budat
AND blart = 'RE'.
WRITE 😕 bkpf-awkey(10).
WRITE :/20 'I/R'.
WRITE :/20 sy-uline(30).
SELECT * FROM bseg
WHERE belnr = bkpf-belnr
AND gjahr = bkpf-gjahr.
IF bseg-shkzg ='H'.
bseg-dmbtr = bseg-dmbtr * -1.
ENDIF.
dmbtr1 = dmbtr1 + bseg-dmbtr.
WRITE :/20 bseg-belnr, bseg-dmbtr.
ENDSELECT.
bbelnr = bkpf-awkey(10).
bgjahr = bkpf-awkey+10(4).
SELECT SINGLE * FROM rseg
WHERE belnr = bbelnr
AND gjahr = bgjahr.
SKIP 2.
CONCATENATE rseg-lfbnr rseg-lfgja INTO bawkey.
SELECT SINGLE * FROM bkpf
WHERE awkey = bawkey.
WRITE :/20 'G/R'.
WRITE :/20 sy-uline(30).
SELECT * FROM bseg
WHERE belnr = bkpf-belnr
AND gjahr = bkpf-gjahr.
IF bseg-shkzg ='H'.
bseg-dmbtr = bseg-dmbtr * -1.
ENDIF.
dmbtr2 = dmbtr2 + bseg-dmbtr.
WRITE :/20 bseg-belnr, bseg-dmbtr.
ENDSELECT.
dmbtr1 = dmbtr1 - dmbtr2.
skip 2.
write 😕 dmbtr1.
Moderator message - Please see before posting. You would have saved everyone (including yourself) a lot of time - post locked
Edited by: Rob Burbank on May 29, 2009 9:39 AM
05-29-2009 6:14 AM
Hi,
I would suggest the following changes.
Your code
TABLES : bkpf, rseg, bseg.
DATA : BEGIN OF it_bkpf OCCURS 0.
INCLUDE STRUCTURE bkpf.
DATA : bbelnr TYPE bkpf-belnr,
bgjahr TYPE bkpf-gjahr.
DATA : END OF it_bkpf.
*data : it_bkpf like bkpf OCCURS 0 WITH HEADER LINE.
DATA : it_rseg LIKE rseg OCCURS 0 WITH HEADER LINE.
DATA : it_bseg LIKE bseg OCCURS 0 WITH HEADER LINE.
DATA : bbelnr TYPE bkpf-belnr.
DATA : bgjahr TYPE bkpf-gjahr.
DATA : bawkey TYPE bkpf-awkey.
data : dmbtr1 type bseg-dmbtr.
data : dmbtr2 type bseg-dmbtr.
PARAMETERS : p_budat LIKE bkpf-budat.
SELECT SINGLE * FROM bkpf
WHERE budat = p_budat
AND blart = 'RE'.
WRITE 😕 bkpf-awkey(10).
{color:red}* Since you are just selectin one record here; so you can make use of BUKRS while matching with BSEG{color}
WRITE :/20 'I/R'.
WRITE :/20 sy-uline(30).
{color:green}Instead of using SELECT-ENDSELECT please take records into internal table and then loop on the internal table to WRITE the records{color}
SELECT * FROM bseg
WHERE belnr = bkpf-belnr
AND gjahr = bkpf-gjahr.
IF bseg-shkzg ='H'.
bseg-dmbtr = bseg-dmbtr * -1.
ENDIF.
dmbtr1 = dmbtr1 + bseg-dmbtr.
WRITE :/20 bseg-belnr, bseg-dmbtr.
ENDSELECT.
bbelnr = bkpf-awkey(10).
bgjahr = bkpf-awkey+10(4).
SELECT SINGLE * FROM rseg
WHERE belnr = bbelnr
AND gjahr = bgjahr.
SKIP 2.
CONCATENATE rseg-lfbnr rseg-lfgja INTO bawkey.
{color:green}
same points here
* Make use of BUKRS in you select query on BSEG.
Instead of using SELECT-ENDSELECT please take records into internal table and then loop on the internal table to WRITE the records{color}
SELECT SINGLE * FROM bkpf
WHERE awkey = bawkey.
WRITE :/20 'G/R'.
WRITE :/20 sy-uline(30).
SELECT * FROM bseg
WHERE belnr = bkpf-belnr
AND gjahr = bkpf-gjahr.
IF bseg-shkzg ='H'.
bseg-dmbtr = bseg-dmbtr * -1.
ENDIF.
dmbtr2 = dmbtr2 + bseg-dmbtr.
WRITE :/20 bseg-belnr, bseg-dmbtr.
ENDSELECT.
dmbtr1 = dmbtr1 - dmbtr2.
skip 2.
write 😕 dmbtr1.
05-29-2009 6:14 AM
BSEG is cluster table. you used this table multible times with endselect.
Try to use bseg table in only once and use proper key fields in order.
It will improve lot of performance.
Rgds,
Kiran
05-29-2009 8:29 AM
Hi,
Follow the below mentioned steps.
Try to use internal tables without header lines. Do not use occurs 0.
Use TYPES for types declaration. Then declare the internal table.
Fetch data from a database table only once. Fetch whatever data is required in one fetch. Then manipulate and play with the data as you wish.
Do not use select, end select . Use into table
This will improve your performance.
Sample Code
Types: Begin of ty_mara
Matnr type matnr,
End of ty_mara.
Data: it_mara type standard table of ty_mara,
Wa_mara type ty_mara.
Select matnr from mara into table it_mara where matnr = u2026..
05-29-2009 1:08 PM
I would like to see that somebody else recommends what should be done here:
You must run the SQL trace, I tell you how look the whole piece of code need, there are 5 selects,
i.e. the whole time splits in 5 parts.
Check the largest one, can it be improved? If yes do it.
My blog on the SQL trace tells you the details.
Siegfried
05-29-2009 1:13 PM
I'd recommend it
Some problems are apparent even without ST05:
- select on BKPF without BUKRS
- select single without unique selection
- select on BSEG without BUKRS
- 2nd select on BKPF without AWTYP
- select * without workarea, transferring all columns
- ...
Thomas
05-29-2009 1:53 PM