‎2006 Oct 09 2:25 PM
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
‎2006 Oct 09 2:28 PM
hi Srini,
1. Replace all the move statement with assignment operator.
2. Try Including all the primary keys in your select statement ..
Regards,
Santosh
‎2006 Oct 09 2:28 PM
hi Srini,
1. Replace all the move statement with assignment operator.
2. Try Including all the primary keys in your select statement ..
Regards,
Santosh
‎2006 Oct 09 2:28 PM
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.
‎2006 Oct 09 2:29 PM
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.
‎2006 Oct 09 3:13 PM
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.
‎2006 Oct 09 5:56 PM
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
‎2006 Oct 09 10:15 PM
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.