07-23-2007 9:30 AM
experts try to modify the code to increase performance. It is very difficult to alter this code ie removing select inside the loop etc. I hope someone is there to prove that they r expert
tables: zmtp, mkpf, mseg, mast, lfa1. ztemp has lifnr, matnr,kbetr
data: begin of sk_data occurs 0,
matnr like mseg-matnr, "1
idnrk like stpo-idnrk, "2
kbetr like zmtp-kbetr, "3
menge like mseg-menge, "4
compu like mseg-menge, "5
alqty like mseg-menge, "6
scqty like mseg-menge, "7
chqty like mseg-menge, "8
lifnr like lfa1-lifnr, "9
bomus like mseg-menge, "bom usage
rsq like mseg-menge, "real scrap qty
end of sk_data.
data: t_data like table of sk_data with header line.
parameters: p_werks like t001w-werks obligatory memory id wer,
p_lifnr like lfa1-lifnr obligatory memory id lif.
select-options: s_budat for mkpf-budat.
start-of-selection.
perform get_data.
perform display.
top-of-page.
perform top.
form get_data .
data: lt_stb like stpox occurs 0 with header line.
data: begin of lt_we occurs 0,
mblnr like mkpf-mblnr,
end of lt_we.
data: lt_wo like table of lt_we with header line.
data: lt_wa like table of lt_we with header line.
data: lt_121 like table of lt_we with header line.
data: begin of lt_menge occurs 0,
mblnr like mseg-mblnr,
matnr like mseg-matnr,
bwart like mseg-bwart,
menge like mseg-menge,
end of lt_menge.
select mblnr into table lt_we
from mkpf
where budat in s_budat
and vgart = 'WE'.
select mblnr into table lt_wo
from mkpf
where budat in s_budat
and vgart = 'WO'.
select lifnr matnr kbetr
into corresponding fields of table t_data
from zmtp
where lifnr = p_lifnr.
select single * from lfa1
where lifnr = p_lifnr.
loop at t_data
if not lt_we[] is initial.
select mblnr matnr bwart menge into table lt_menge
from mseg
for all entries in lt_we
where mblnr = lt_we-mblnr
and matnr = t_data-matnr
and werks = p_werks
and bwart in ('101', '102').
loop at lt_menge.
if lt_menge-bwart = '102'.
lt_menge-menge = - lt_menge-menge.
endif.
t_data-menge =t_data-menge + lt_menge-menge.
endloop.
modify t_data.
endif.
if not lt_wo[] is initial.
select mblnr into table lt_121
from mseg
for all entries in lt_wo
where mblnr = lt_wo-mblnr
and matnr = t_data-matnr
and werks = p_werks
and bwart = '121'.
if not lt_121[] is initial.
select mblnr matnr bwart menge into table lt_menge
from mseg
for all entries in lt_121
where mblnr = lt_121-mblnr
and bwart in ('543', '544').
loop at lt_menge.
if lt_menge-bwart = '544'.
lt_menge-menge = - lt_menge-menge.
endif.
t_data-rsq = t_data-rsq + lt_menge-menge.
endloop.
modify t_data.
endif.
endif.
endloop.
loop at t_data.
select single stlnr into mast-stlnr
from mast
where matnr = t_data-matnr
and stlan = '1'
and werks = p_werks.
if sy-subrc = 0.
select single stlal into stko-stlal
from stko
where stlnr = mast-stlnr
and stlty = 'M'
and stlst <> '02'
and datuv <= sy-datum.
call function 'CS_BOM_EXPL_MAT_V2'
exporting
capid = 'PP01'
datuv = sy-datum
mtnrv = t_data-matnr
stlal = stko-stlal
stlan = '1'
werks = p_werks
tables
stb = lt_stb
exceptions
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
others = 9.
loop at lt_stb.
if lt_stb-menge > 0.
sk_data = t_data.
sk_data-idnrk = lt_stb-idnrk.
sk_data-bomus = lt_stb-menge.
sk_data-compu = sk_data-menge * sk_data-bomus.
sk_data-alqty = sk_data-compu * sk_data-kbetr / 100. "
if not lt_wa[] is initial.
select mblnr matnr bwart menge into table lt_menge
from mseg
for all entries in lt_wa
where mblnr = lt_wa-mblnr
and matnr = sk_data-idnrk
and werks = p_werks
and bwart in ('551', '552').
loop at lt_menge.
if lt_menge-bwart = '552'.
lt_menge-menge = - lt_menge-menge.
endif.
sk_data-rsq = sk_data-rsq + lt_menge-menge.
endloop.
endif.
sk_data-scqty = sk_data-rsq.
sk_data-chqty =sk_data-scqty - sk_data-alqty.
append sk_data.
endif.
endloop.
else.
sk_data = t_data.
append sk_data.
endif.
endloop.
sort sk_data by matnr idnrk.
endform. " get_data
07-23-2007 9:41 AM
well without making use of the code-button your code gets kinda unreadable, so i stopped after a while.
BUT until that i already found at least one small room of improvement.
you are doing 2 selects on MKPF right after one another.
why dont you just do ONE select on you MKPF with a double where clause?
like
SELECT mblnr into table lt_wo
from mkpf
where budat in s_budat
and vgart = 'WO'
or vgart = 'WE'.
just make sure when you want to loop over your old lt_wo, dont forget to do it like following:
LOOP at lt_wo where vgart = 'WO'.
07-23-2007 10:30 AM
select mblnr vgart appending table lt_we from mkpf
client specified
where mandt = sy-mandt and budat in s_budat
and ( vgart = 'WO' or vgart = 'WE' )
select lifnr matnr kbetr
into corresponding fields of table t_data
from zmtp
where lifnr = p_lifnr.
select single * from lfa1
where lifnr = p_lifnr.
loop at t_data
select mblnr matnr bwart menge into table lt_menge
from mseg
for all entries in lt_we
where mblnr = lt_we-mblnr
and matnr = t_data-matnr
and werks = p_werks
and bwart in ('101', '102')
and lt_we-vgart =' we'.
loop at lt_menge where bwart = '102'.
lt_menge-menge = lt_menge-menge * -1.
t_data-menge = t_data-menge + lt_menge-menge.
endloop.
modify t_data transporting menge.
select mblnr into table lt_121
from mseg
for all entries in lt_we
where mblnr = lt_we-mblnr
and matnr = t_data-matnr
and werks = p_werks
and bwart = '121'
and lt_we-vgart = 'WO'.
i,m stopping here
Its very hard to grasp u r code...plz tell u r requirement so that it will be easy to get u r code....specify the process logic
07-23-2007 12:23 PM
Thanks Mohammed for ur reply. I want to improve the performance only , so i want to reduce the database access. For this sake i want to change the select statements ie removing selects inside loops etc. Thanks a lot for your reply
07-23-2007 12:34 PM
07-23-2007 10:37 AM
Select statements in your code can be taken out of LOOPs. see the code below... I took out the select statements and inserted LOOPs for that...
I did these changes only for
IF NOT lt_we[] IS INITIAL
for rest of the code you can put same logic
TABLES: zmtp, mkpf, mseg, mast, lfa1.
DATA: BEGIN OF sk_data OCCURS 0,
matnr LIKE mseg-matnr, "1
idnrk LIKE stpo-idnrk, "2
kbetr LIKE zmtp-kbetr, "3
menge LIKE mseg-menge, "4
compu LIKE mseg-menge, "5
alqty LIKE mseg-menge, "6
scqty LIKE mseg-menge, "7
chqty LIKE mseg-menge, "8
lifnr LIKE lfa1-lifnr, "9
bomus LIKE mseg-menge, "bom usage
rsq LIKE mseg-menge, "real scrap qty
END OF sk_data.
DATA: t_data LIKE TABLE OF sk_data WITH HEADER LINE.
PARAMETERS: p_werks LIKE t001w-werks OBLIGATORY MEMORY ID wer,
p_lifnr LIKE lfa1-lifnr OBLIGATORY MEMORY ID lif.
SELECT-OPTIONS: s_budat FOR mkpf-budat.
START-OF-SELECTION.
PERFORM get_data.
PERFORM display.
TOP-OF-PAGE.
PERFORM top.
*---------------------------------------------------------------------*
* FORM get_data *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM get_data .
DATA: lt_stb LIKE stpox OCCURS 0 WITH HEADER LINE.
DATA: BEGIN OF lt_we OCCURS 0,
mblnr LIKE mkpf-mblnr,
vgart LIKE mkpf-vgart,
END OF lt_we.
DATA: lt_wo LIKE TABLE OF lt_we WITH HEADER LINE ,
lt_wa LIKE TABLE OF lt_we WITH HEADER LINE ,
lt_121 LIKE TABLE OF lt_we WITH HEADER LINE .
DATA: BEGIN OF lt_menge OCCURS 0,
mblnr LIKE mseg-mblnr,
matnr LIKE mseg-matnr,
bwart LIKE mseg-bwart,
menge LIKE mseg-menge,
END OF lt_menge.
RANGES : r_matnr FOR mara-matnr .
SELECT mblnr
vgart
INTO TABLE lt_we
FROM mkpf
WHERE budat IN s_budat
AND ( vgart = 'WE' OR vgart = 'WO' ).
* SELECT mblnr
* INTO TABLE lt_wo
* FROM mkpf
* WHERE budat IN s_budat
* AND vgart = 'WO'.
SELECT lifnr
matnr
kbetr
INTO CORRESPONDING FIELDS OF TABLE t_data
FROM zmtp
WHERE lifnr = p_lifnr.
LOOP AT t_data .
r_matnr-sign = 'I' .
r_matnr-option = 'EQ' .
r_matnr-low = t_data-matnr .
APPEND r_matnr .
ENDLOOP.
SELECT SINGLE *
FROM lfa1
WHERE lifnr = p_lifnr.
SELECT mblnr
matnr
bwart
menge
INTO TABLE lt_menge
FROM mseg
FOR ALL ENTRIES IN lt_we
WHERE mblnr = lt_we-mblnr
AND matnr IN r_matnr
AND werks = p_werks
AND bwart IN ('101', '102', '121').
LOOP AT t_data .
LOOP AT lt_we WHERE matnr = t_data-matnr
AND vgart = 'WE' .
* IF NOT lt_we[] IS INITIAL.
* SELECT mblnr
* matnr
* bwart
* menge
* INTO TABLE lt_menge
* FROM mseg
* FOR ALL ENTRIES IN lt_we
* WHERE mblnr = lt_we-mblnr
* AND matnr = t_data-matnr
* AND werks = p_werks
* AND bwart IN ('101', '102').
LOOP AT l_menge WHERE mblnr = lt_we-mblnr
T_DATA-MATNR
werks = p_werks .
* LOOP AT lt_menge.
IF lt_menge-bwart = '102'.
lt_menge-menge = - lt_menge-menge.
ENDIF.
t_data-menge =t_data-menge + lt_menge-menge.
ENDLOOP.
MODIFY t_data.
ENDLOOP .
* ENDIF. "IF NOT lt_we[] IS INITIAL.
IF NOT lt_wo[] IS INITIAL.
SELECT mblnr
INTO TABLE lt_121
FROM mseg
FOR ALL ENTRIES IN lt_wo
WHERE mblnr = lt_wo-mblnr
AND matnr = t_data-matnr
AND werks = p_werks
AND bwart = '121'.
IF NOT lt_121[] IS INITIAL.
SELECT mblnr
matnr
bwart
menge
INTO TABLE lt_menge
FROM mseg
FOR ALL ENTRIES IN lt_121
WHERE mblnr = lt_121-mblnr
AND bwart IN ('543', '544').
LOOP AT lt_menge.
IF lt_menge-bwart = '544'.
lt_menge-menge = - lt_menge-menge.
ENDIF.
t_data-rsq = t_data-rsq + lt_menge-menge.
ENDLOOP.
MODIFY t_data.
ENDIF. "IF NOT lt_121[] IS INITIAL
ENDIF. "IF NOT lt_wo[] IS INITIAL
ENDLOOP.
LOOP AT t_data.
SELECT SINGLE stlnr
INTO mast-stlnr
FROM mast
WHERE matnr = t_data-matnr
AND stlan = '1'
AND werks = p_werks.
IF sy-subrc = 0.
SELECT SINGLE stlal
INTO stko-stlal
FROM stko
WHERE stlnr = mast-stlnr
AND stlty = 'M'
AND stlst <> '02'
AND datuv <= sy-datum.
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01'
datuv = sy-datum
mtnrv = t_data-matnr
stlal = stko-stlal
stlan = '1'
werks = p_werks
TABLES
stb = lt_stb
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
LOOP AT lt_stb.
IF lt_stb-menge > 0.
sk_data = t_data.
sk_data-idnrk = lt_stb-idnrk.
sk_data-bomus = lt_stb-menge.
sk_data-compu = sk_data-menge * sk_data-bomus.
sk_data-alqty = sk_data-compu * sk_data-kbetr / 100. "
IF NOT lt_wa[] IS INITIAL.
SELECT mblnr matnr bwart menge INTO TABLE lt_menge
FROM mseg
FOR ALL ENTRIES IN lt_wa
WHERE mblnr = lt_wa-mblnr
AND matnr = sk_data-idnrk
AND werks = p_werks
AND bwart IN ('551', '552').
LOOP AT lt_menge.
IF lt_menge-bwart = '552'.
lt_menge-menge = - lt_menge-menge.
ENDIF.
sk_data-rsq = sk_data-rsq + lt_menge-menge.
ENDLOOP.
ENDIF.
sk_data-scqty = sk_data-rsq.
sk_data-chqty =sk_data-scqty - sk_data-alqty.
APPEND sk_data.
ENDIF.
ENDLOOP.
ELSE.
sk_data = t_data.
APPEND sk_data.
ENDIF.
ENDLOOP.
SORT sk_data BY matnr idnrk.
ENDFORM. " get_data
07-23-2007 8:32 PM
Thanks for ur time Pawan.some of the statements in the code are throughing errors please correct them. Also please tell me the use of ranges.The errors are comming at..
LOOP AT t_data .
LOOP AT lt_we WHERE matnr = t_data-matnr :" we dont have field matnr
AND vgart = 'WE' .
IF NOT lt_we[] IS INITIAL.
SELECT mblnr
matnr
bwart
menge
INTO TABLE lt_menge
FROM mseg
FOR ALL ENTRIES IN lt_we
WHERE mblnr = lt_we-mblnr
AND matnr = t_data-matnr
AND werks = p_werks
AND bwart IN ('101', '102').
LOOP AT l_menge WHERE mblnr = lt_we-mblnr
T_DATA-MATNR
werks = p_werks . "werks is not there
pls correct the code..where we have to end the loop .