10-30-2007 1:22 PM
Hi,
----
FORM fetch_condition_records .
REFRESH : t_final , t_vbak1 , t_konv .
SELECT vbeln
auart
vkorg
vtweg
spart
vkbur
knumv
FROM vbak
INTO TABLE t_vbak1
WHERE vbeln EQ w_vbeln.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRT'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGLD'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRR'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT1'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT2'.
APPEND r_kschl.
SELECT knumv
stunr
zaehk
kschl
kvarc
kbetr
krech
varcond
FROM konv
INTO TABLE t_konv
FOR ALL ENTRIES IN t_vbak1
WHERE knumv EQ t_vbak1-knumv AND
kschl IN r_kschl.
SORT t_konv .
LOOP AT t_vbak1 INTO wa_vbak1.
LOOP AT t_konv INTO wa_konv
WHERE knumv = wa_vbak1-knumv.
IF sy-subrc EQ 0 .
wa_final-vbeln = wa_vbak1-vbeln .
wa_final-auart = wa_vbak1-auart .
wa_final-vkorg = wa_vbak1-vkorg .
wa_final-vtweg = wa_vbak1-vtweg .
wa_final-spart = wa_vbak1-spart .
wa_final-vkbur = wa_vbak1-vkbur .
wa_final-stunr = wa_konv-stunr .
wa_final-zaehk = wa_konv-zaehk .
wa_final-kschl = wa_konv-kschl .
wa_final-kvarc = wa_konv-kvarc .
wa_final-kbetr = wa_konv-kbetr.
wa_final-krech = wa_final-krech.
wa_final-varcond = wa_konv-varcond.
IF wa_final-varcond IS NOT INITIAL.
APPEND wa_final TO t_final .
ENDIF.
CLEAR : wa_final , wa_konv,r_kschl.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
is there any other alternative to this code.
this code makes performance issue.
thanks in advance.
10-30-2007 1:59 PM
1. Avoid nested loops.
2. check t_vbak1 is not initial before using for all entries.
do as below
SELECT vbeln
auart
vkorg
vtweg
spart
vkbur
knumv
FROM vbak
INTO TABLE t_vbak1
WHERE vbeln EQ w_vbeln.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRT'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGLD'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRR'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT1'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT2'.
APPEND r_kschl.
<b>if t_vbak1[] is not intial.</b>
SELECT knumv
stunr
zaehk
kschl
kvarc
kbetr
krech
varcond
FROM konv
INTO TABLE t_konv
FOR ALL ENTRIES IN t_vbak1
WHERE knumv EQ t_vbak1-knumv AND
kschl IN r_kschl.
<b>endif.</b>
SORT t_konv .
LOOP AT t_vbak1 INTO wa_vbak1.
<b>read table t_konv into wa_knov with key knumv = wa_vbak1-knumv.
if sy-subrc = 0.
LOOP AT t_konv INTO wa_konv from sy-tabix.
if wa_konv-knumv ne wa_vbak1-knumv.
exit.
endif.
endloop.
endif.</b>
IF sy-subrc EQ 0 .
wa_final-vbeln = wa_vbak1-vbeln .
wa_final-auart = wa_vbak1-auart .
wa_final-vkorg = wa_vbak1-vkorg .
wa_final-vtweg = wa_vbak1-vtweg .
wa_final-spart = wa_vbak1-spart .
wa_final-vkbur = wa_vbak1-vkbur .
wa_final-stunr = wa_konv-stunr .
wa_final-zaehk = wa_konv-zaehk .
wa_final-kschl = wa_konv-kschl .
wa_final-kvarc = wa_konv-kvarc .
wa_final-kbetr = wa_konv-kbetr.
wa_final-krech = wa_final-krech.
wa_final-varcond = wa_konv-varcond.
IF wa_final-varcond IS NOT INITIAL.
APPEND wa_final TO t_final .
ENDIF.
CLEAR : wa_final , wa_konv,r_kschl.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
<b>Reward Points for helpful answers</b>
Satish
10-30-2007 1:59 PM
Your SELECT is OK. The problem is with nested LOOPs. Please see:
<a href="/people/rob.burbank/blog/2006/02/07/performance-of-nested-loops">Performance of Nested Loops</a>
Rob
10-30-2007 1:59 PM
1. Avoid nested loops.
2. check t_vbak1 is not initial before using for all entries.
do as below
SELECT vbeln
auart
vkorg
vtweg
spart
vkbur
knumv
FROM vbak
INTO TABLE t_vbak1
WHERE vbeln EQ w_vbeln.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRT'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGLD'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGRR'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT1'.
APPEND r_kschl.
r_kschl-sign = c_i.
r_kschl-option = c_eq.
r_kschl-low = 'ZGT2'.
APPEND r_kschl.
<b>if t_vbak1[] is not intial.</b>
SELECT knumv
stunr
zaehk
kschl
kvarc
kbetr
krech
varcond
FROM konv
INTO TABLE t_konv
FOR ALL ENTRIES IN t_vbak1
WHERE knumv EQ t_vbak1-knumv AND
kschl IN r_kschl.
<b>endif.</b>
SORT t_konv .
LOOP AT t_vbak1 INTO wa_vbak1.
<b>read table t_konv into wa_knov with key knumv = wa_vbak1-knumv.
if sy-subrc = 0.
LOOP AT t_konv INTO wa_konv from sy-tabix.
if wa_konv-knumv ne wa_vbak1-knumv.
exit.
endif.
endloop.
endif.</b>
IF sy-subrc EQ 0 .
wa_final-vbeln = wa_vbak1-vbeln .
wa_final-auart = wa_vbak1-auart .
wa_final-vkorg = wa_vbak1-vkorg .
wa_final-vtweg = wa_vbak1-vtweg .
wa_final-spart = wa_vbak1-spart .
wa_final-vkbur = wa_vbak1-vkbur .
wa_final-stunr = wa_konv-stunr .
wa_final-zaehk = wa_konv-zaehk .
wa_final-kschl = wa_konv-kschl .
wa_final-kvarc = wa_konv-kvarc .
wa_final-kbetr = wa_konv-kbetr.
wa_final-krech = wa_final-krech.
wa_final-varcond = wa_konv-varcond.
IF wa_final-varcond IS NOT INITIAL.
APPEND wa_final TO t_final .
ENDIF.
CLEAR : wa_final , wa_konv,r_kschl.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
<b>Reward Points for helpful answers</b>
Satish