‎2007 Oct 18 11:52 AM
hi,
plz can suggest to optimize the below code
LOOP AT ibkpf.
DATA v_rate LIKE bset-hwste.
MOVE ibkpf-belnr TO lt_output-belnr.
MOVE ibkpf-awkey TO lt_output-awkey.
MOVE ibkpf-budat TO lt_output-budat.
MOVE ibkpf-blart TO lt_output-blart.
IF ibkpf-blart NE 'EP'.
SELECT SINGLE kschl
INTO (bset-kschl )
FROM bset
WHERE bukrs = ibkpf-bukrs
AND belnr = ibkpf-belnr
AND gjahr = gjahr
AND ( kschl IN zlst OR
kschl IN zcst ).
CHECK sy-subrc = 0.
COMPUTE v_rate = ( bset-hwste / bset-hwbas ) * 100.
IF sy-subrc NE 0.
CLEAR v_rate.
ENDIF.
ENDIF.
SELECT SINGLE vbeln erdat knumv kunag
INTO (vbrk-vbeln,vbrk-erdat,lt_output-knumv,
lt_output-kunag)
FROM vbrk
WHERE vbeln = ibkpf-awkey
AND kunag IN s_kunnr
AND rfbsk = 'C'.
CHECK sy-subrc = 0.
IF sy-subrc <> 0.
CLEAR: lt_output-knumv,lt_output-kunag.
ELSE.
SELECT * FROM vbrp WHERE vbeln = vbrk-vbeln
AND werks = p_werks
AND erdat = vbrk-erdat
AND gsber = p_gsber
AND mvgr3 IN s_mvgr3.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING vbrp TO lt_output.
CONCATENATE lt_output-matnr lt_output-arktx INTO lt_output-fmatnr
SEPARATED BY ' - '.
APPEND lt_output.
MOVE lt_output-knumv TO ttab-knumv.
MOVE vbrk-vbeln TO ttab-vbeln .
MOVE vbrp-mvgr3 TO ttab-mvgr3.
COLLECT ttab.
CLEAR ttab.
ENDIF.
ENDSELECT.
CLEAR lt_output.
ENDIF.
ENDLOOP.
‎2007 Oct 18 2:23 PM
1. Avoid <b>select * from</b> in query, instead of it place the fields sequence whatever you required.
2. avoid <b>MOVE-CORRESPONDING vbrp TO lt_output.</b>. directly get the output from query to it_output.
3.Instead of using MOVE vbrk-vbeln TO ttab-vbeln you can use ttab-vbeln = vbrk-vbeln to improve the perfornance and we have an option to eliminate additional checkings in MOVE stmt.
‎2007 Oct 18 2:41 PM
‎2007 Oct 18 4:59 PM
Hi,
I think the most important for your code is: do not use select single during looping you internal table.
Solution:(For example)
1.Collect data into a local itab first.
loop at ibkpf.
lt_bukrs-bukrs = ibkpf-bukrs.
lt_bukrs-belnr = ibkpf-belnr.
append lt_bukrs.
endloop.
sort lt_bukrs by bukrs belnr. "Distinct itab.
delete adjacent from lt_bukrs comparing bukrs belnr.
2.
check lt_bukrs[] is not initial.
select kschl belnr ....
from bset
into table lt_bset
for all entries in lt_bukrs
WHERE bukrs = lt_bukrs-bukrs
AND belnr = lt_bukrs-belnr
AND gjahr = gjahr
AND ( kschl IN zlst OR
kschl IN zcst ).
3.Read the itab with binary search to double searching speed.
loop at ibkpf.
read table lt_bukrs with key bukrs = ibkpf-bukrs belnr = ibkpf-belnr binary search.
if sy-subrc = 0.
...
endif.
then, modify ibkpf.
endloop.