Application Development 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: 

Code Performance

Former Member
0 Kudos

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

6 REPLIES 6

former_member555112
Active Contributor
0 Kudos

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.

Former Member
0 Kudos

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

Former Member
0 Kudos

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..

former_member194613
Active Contributor
0 Kudos

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

ThomasZloch
Active Contributor
0 Kudos

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

Former Member
0 Kudos

self solved with help