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

performance

Former Member
0 Likes
1,145

could anyone suggest me the changes to be done in the following code performance wise.

form getdata.

data: wrecord type i.

data: wtime type t.

data: wtoday type d.

move sy-datum to wtoday.

move sy-uzeit to wtime.

if wtime eq '000000'. wtoday = wtoday - 1. endif.

status = 1.

if sy-batch = 'X'.

select mblnr mjahr bldat cputm from mkpf into table mkpftbl

where bldat eq wtoday and tcode2 eq ctcode2.

else.

select mblnr mjahr bldat cputm from mkpf into table mkpftbl

where mblnr in mblnr and mjahr in mjahr and tcode2 eq ctcode2.

endif.

describe table mkpftbl lines wrecord.

if wrecord > 0.

loop at mkpftbl.

select zeile matnr werks charg menge from mseg

into (mseg-zeile, mseg-matnr, mseg-werks, mseg-charg,

mseg-menge)

where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and

bwart eq cbwart and werks eq splant.

move mkpftbl-wmblnr to msegtbl-wmblnr.

move mkpftbl-wmjahr to msegtbl-wmjahr.

move mkpftbl-wbldat to msegtbl-wbldat.

move mkpftbl-wcputm to msegtbl-wcputm.

move mseg-zeile to msegtbl-wzeile.

move mseg-matnr to msegtbl-wmatnr.

move mseg-werks to msegtbl-wwerks.

move mseg-charg to msegtbl-wcharg.

move mseg-menge to msegtbl-wmenge.

append msegtbl.

clear msegtbl.

endselect.

endloop.

status = 0.

endif.

endform. "GetData

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,112

hi Srini,

1. Replace all the move statement with assignment operator.

2. Try Including all the primary keys in your select statement ..

Regards,

Santosh

6 REPLIES 6
Read only

Former Member
0 Likes
1,113

hi Srini,

1. Replace all the move statement with assignment operator.

2. Try Including all the primary keys in your select statement ..

Regards,

Santosh

Read only

Former Member
0 Likes
1,112

This part of the code as to be changed:

loop at mkpftbl.

select zeile matnr werks charg menge from mseg

into (mseg-zeile, mseg-matnr, mseg-werks, mseg-charg,

mseg-menge)

where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and

bwart eq cbwart and werks eq splant.

move mkpftbl-wmblnr to msegtbl-wmblnr.

move mkpftbl-wmjahr to msegtbl-wmjahr.

move mkpftbl-wbldat to msegtbl-wbldat.

move mkpftbl-wcputm to msegtbl-wcputm.

move mseg-zeile to msegtbl-wzeile.

move mseg-matnr to msegtbl-wmatnr.

move mseg-werks to msegtbl-wwerks.

move mseg-charg to msegtbl-wcharg.

move mseg-menge to msegtbl-wmenge.

append msegtbl.

clear msegtbl.

endselect.

Change with <b>for all entries in mkpftbl</b>.

select zeile matnr werks charg menge from mseg

into corresponding fields of table msegtbl

for all entries in mkpftbl

where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and

bwart eq cbwart and werks eq splant.

Regards,

PRakash.

Read only

Former Member
0 Likes
1,112

I guess this should be select single

loop at mkpftbl.
<b>select single</b> zeile matnr werks charg menge from mseg
into (mseg-zeile, mseg-matnr, mseg-werks, mseg-charg,
mseg-menge)
where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and
bwart eq cbwart and werks eq splant.

Read only

Former Member
0 Likes
1,112

1. Replace the loop at mkpftbl...endloop with

select mblnr mjahr zeile matnr werks charg menge from mseg into corresponding fields of table msegtbl

for all enteries in mkpftbl

where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and

bwart eq cbwart and werks eq splant.

loop at msegtbl.

read table mkpftbl with key wmblnr = msegtbl-mblnr

and wmjahr = msegtbl-mjahr.

move mkpftbl-wbldat to msegtbl-wbldat.

move mkpftbl-wcputm to msegtbl-wcputm.

modify msegtbl.

endloop.

Read only

Former Member
0 Likes
1,112

Your problem is caused by the fact that you are not using an index in your first SELECT. Rather than:


where bldat eq wtoday 

see if you can use:

where <b>budat</b> eq wtoday 

There is an index on budat in MKPF but not bldat.

Rob

Read only

Former Member
0 Likes
1,112

As per your code you are fetching data from MSEG into loop which is a wrong way from performance point of view. You should not fetch data from DB in loop but instead use for all entries statement. Comment the code for fetching data in loop shown below

loop at mkpftbl.

select zeile matnr werks charg menge from mseg

into (mseg-zeile, mseg-matnr, mseg-werks, mseg-charg,

mseg-menge)

where mblnr eq mkpftbl-wmblnr and mjahr eq mkpftbl-wmjahr and

bwart eq cbwart and werks eq splant.

You can use the following statement:

You can create an internal table itab_mseg with the fields you want to fetch from msge (mblnr mjahr zeile matnr werks charg menge ).

if not mkpftbl[] is initial.

select mblnr mjahr zeile matnr werks charg menge

from mseg

into table itab_mseg

for all entries in mkpftbl

where mblnr eq mkpftbl-wmblnr

and mjahr eq mkpftbl-wmjahr

and bwart eq cbwart

and werks eq splant.

if sy-subrc eq 0.

sort itab_mseg by mblnr mjahr zeile.

  • Here you might be having duplicate records, so u have to decide whether u want to delete the duplicate records or want to play with all of these

endif.

Then here you can Read the records one by one using read statement in binary search mode.

loop at mkpftbl.

clear itab_mseg.

read table itab_mseg with key mblnr = mkpftbl-mblnr

mjahr = mkpftbl-mjahr

binary search.

if s-subrc eq 0.

here u can move entries from itab_mseg header to msegtbl and append it.

endif.

endloop.