2008 May 08 2:31 AM
Hi SDN's
Pls help me to improve the performance of the following code
form get_data .
SELECT budat HKONT aufnr sgtxt blart dmbtr waers
INTO TABLE it_detail
FROM bsis
WHERE bukrs = p_bukrs
AND blart IN s_blart
AND budat IN s_budat
AND HKONT in S_HKONT
AND aufnr in S_aufnr
AND werks = p_werks.
SORT it_detail.
IF p_waers IS NOT INITIAL.
LOOP AT it_detail.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
EXPORTING
date = p_xdate
foreign_currency = p_waers
local_amount = it_detail-dmbtr
local_currency = it_detail-waers
type_of_rate = p_kurst
IMPORTING
foreign_amount = it_detail-dmbtr
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
OTHERS = 4.
IF sy-subrc = 0.
CLEAR it_detail-waers.
it_detail-waers = p_waers.
MODIFY it_detail. " transporting dmbtr.
ENDIF.
ENDLOOP.
ENDIF.
endform. " get_data
&----
*& Form get_sum
&----
text
----
--> p1 text
<-- p2 text
----
form get_cost .
LOOP AT it_detail.
it_sum-budat = it_detail-budat.
it_sum-hkont = it_detail-hkont.
it_sum-aufnr = it_detail-aufnr.
it_sum-blart = it_detail-blart.
it_sum-sgtxt = it_detail-sgtxt.
IF it_detail-blart = 'GI' .
it_sum-raw = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) NE 'S' . .
it_sum-external = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) = 'S' .
it_sum-standard = it_detail-dmbtr.
ELSEIF it_detail-blart = 'SA' AND it_detail-sgtxt(2) = 'DR' .
it_sum-machine = it_detail-dmbtr.
ELSE.
it_sum-others = it_detail-dmbtr.
ENDIF.
APPEND it_sum.
CLEAR it_sum.
ENDLOOP.
Calculate Line item total for Summary Option
LOOP AT it_sum.
it_sum-total = it_sum-raw + it_sum-external + it_sum-standard + it_sum-machine + it_sum-others.
MODIFY it_sum INDEX sy-tabix TRANSPORTING total.
CLEAR it_sum.
ENDLOOP.
ENDFORM. " get_cost
2008 May 08 7:54 AM
Hi Kumar try this out...
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data .
SELECT hkont budat waers blart dmbtr sgtxt aufnr
INTO TABLE it_detail
FROM bsis
WHERE bukrs = p_bukrs AND hkont IN s_hkont AND
budat IN s_budat AND blart IN s_blart AND
aufnr IN s_aufnr AND werks = p_werks.
SORT it_detail.
CHECK p_waers IS NOT INITIAL.
LOOP AT it_detail.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
EXPORTING
date = p_xdate
foreign_currency = p_waers
local_amount = it_detail-dmbtr
local_currency = it_detail-waers
type_of_rate = p_kurst
IMPORTING
foreign_amount = it_detail-dmbtr
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
OTHERS = 4.
IF sy-subrc = 0.
CLEAR it_detail-waers.
it_detail-waers = p_waers.
MODIFY it_detail. " transporting dmbtr.
ENDIF.
MOVE-CORRESPONDING it_detail TO it_sum.
IF it_detail-blart = 'GI' .
it_sum-raw = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) NE 'S' .
it_sum-external = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) = 'S' .
it_sum-standard = it_detail-dmbtr.
ELSEIF it_detail-blart = 'SA' AND it_detail-sgtxt(2) = 'DR' .
it_sum-machine = it_detail-dmbtr.
ELSE.
it_sum-others = it_detail-dmbtr.
ENDIF.
it_sum-total = it_sum-raw + it_sum-external + it_sum-standard +
it_sum-machine + it_sum-others.
APPEND it_sum.
CLEAR : it_sum, it_detail.
ENDLOOP.
ENDFORM. " get_data
Hi SDN's
Pls help me to improve the performance of the following code
form get_data .
SELECT budat HKONT aufnr sgtxt blart dmbtr waers
INTO TABLE it_detail
FROM bsis
WHERE bukrs = p_bukrs
AND blart IN s_blart
AND budat IN s_budat
AND HKONT in S_HKONT
AND aufnr in S_aufnr
AND werks = p_werks.
SORT it_detail.
IF p_waers IS NOT INITIAL.
LOOP AT it_detail.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
EXPORTING
date = p_xdate
foreign_currency = p_waers
local_amount = it_detail-dmbtr
local_currency = it_detail-waers
type_of_rate = p_kurst
IMPORTING
foreign_amount = it_detail-dmbtr
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
OTHERS = 4.
IF sy-subrc = 0.
CLEAR it_detail-waers.
it_detail-waers = p_waers.
MODIFY it_detail. " transporting dmbtr.
ENDIF.
ENDLOOP.
ENDIF.
endform. " get_data
&----
*& Form get_sum
&----
text
----
--> p1 text
<-- p2 text
----
form get_cost .
LOOP AT it_detail.
it_sum-budat = it_detail-budat.
it_sum-hkont = it_detail-hkont.
it_sum-aufnr = it_detail-aufnr.
it_sum-blart = it_detail-blart.
it_sum-sgtxt = it_detail-sgtxt.
IF it_detail-blart = 'GI' .
it_sum-raw = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) NE 'S' . .
it_sum-external = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) = 'S' .
it_sum-standard = it_detail-dmbtr.
ELSEIF it_detail-blart = 'SA' AND it_detail-sgtxt(2) = 'DR' .
it_sum-machine = it_detail-dmbtr.
ELSE.
it_sum-others = it_detail-dmbtr.
ENDIF.
APPEND it_sum.
CLEAR it_sum.
ENDLOOP.
Calculate Line item total for Summary Option
LOOP AT it_sum.
it_sum-total = it_sum-raw + it_sum-external + it_sum-standard + it_sum-machine + it_sum-others.
MODIFY it_sum INDEX sy-tabix TRANSPORTING total.
CLEAR it_sum.
ENDLOOP.
ENDFORM. " get_cost
2008 May 08 3:27 AM
2008 May 08 3:37 AM
Hi Kumar,
Please try to give the fields in order in where condition and also when u are selecting.
SELECT HKONT budat waers blart dmbtr sgtxt aufnr
INTO TABLE it_detail
FROM bsis
WHERE bukrs = p_bukrs
AND HKONT in S_HKONT
AND budat IN s_budat
AND blart IN s_blart
AND aufnr in S_aufnr
AND werks = p_werks.Best regards,
raam
2008 May 08 3:38 AM
Hi,
1) First of all try to use as many keys for selecting the BSIS table in the correct order.
2) Sort it_detail with a particular field. If possible declare the internal table as binary sort.
3) Use a structure for it_details.
4) Instead of passing
it_sum-budat = it_detail-budat.
it_sum-hkont = it_detail-hkont.
it_sum-aufnr = it_detail-aufnr.
it_sum-blart = it_detail-blart.
it_sum-sgtxt = it_detail-sgtxt.
use move-corresponding it_detail to it_sum.
5) Use read table as much as you can.
Reward points if this were useful.
Rgds,
Abhishek
2008 May 08 4:13 AM
Hi Abi
Can u pls tell me how to do below one
3) Use a structure for it_details.
5) Use read table as much as you can.
2008 May 08 4:47 AM
Hi Kumar,
If u are modifying all records in the internal table then u need to use loop statement.
Read statement fetches/reads only one record. so u can't modify all the records with the read statement. again u need to keep the read ststement in some looping condition to modify all records.
according to ur requirment loop statement is required.
But u are using the function module to convert currency. It may be the problem u are facing.
Best regards,
raam
2008 May 08 5:46 AM
2008 May 08 4:43 AM
Hi
You have issue in the loop statement wherein you are using the function module inside. Its better use the table tcurf wherein the same currency convertion data is available. Either use for all entries or else use at the end of writing so that u can save more runtime.
Hope it can resolve your problem.
Thiru
2008 May 08 7:27 AM
Hi Kumar,
write ur select statement as follows,
select bukrs hkont budat waers blart dmbtr sgtxt aufnr
from bsis
into table i_details
where bukrs = p_bukrs
AND HKONT in S_HKONT
AND budat in s_budate
AND blart IN s_blart
AND aufnr in S_aufnr
AND werks = p_werks.
and ur i_detail structure should in the same order as u selected in the select querry.
if database table contains huge entries then select statement will give u performence issue.
so if the above select is also giving performence issue,
try to write select querry as follows
select * from bsis into i_detail.
i_detail here is type table of bsis.
and one more is........
loop at i_details.
endloop.
second time also u have used it for getting data into i_sum.
here u can get this data in the first loop it self.
i hope it will work,
Regards,
kk.
Edited by: kusuma kurapati on May 8, 2008 8:29 AM
Edited by: kusuma kurapati on May 8, 2008 8:33 AM
2008 May 08 7:54 AM
Hi Kumar try this out...
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_data .
SELECT hkont budat waers blart dmbtr sgtxt aufnr
INTO TABLE it_detail
FROM bsis
WHERE bukrs = p_bukrs AND hkont IN s_hkont AND
budat IN s_budat AND blart IN s_blart AND
aufnr IN s_aufnr AND werks = p_werks.
SORT it_detail.
CHECK p_waers IS NOT INITIAL.
LOOP AT it_detail.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
EXPORTING
date = p_xdate
foreign_currency = p_waers
local_amount = it_detail-dmbtr
local_currency = it_detail-waers
type_of_rate = p_kurst
IMPORTING
foreign_amount = it_detail-dmbtr
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
OTHERS = 4.
IF sy-subrc = 0.
CLEAR it_detail-waers.
it_detail-waers = p_waers.
MODIFY it_detail. " transporting dmbtr.
ENDIF.
MOVE-CORRESPONDING it_detail TO it_sum.
IF it_detail-blart = 'GI' .
it_sum-raw = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) NE 'S' .
it_sum-external = it_detail-dmbtr.
ELSEIF it_detail-blart = 'GG' AND it_detail-sgtxt(1) = 'S' .
it_sum-standard = it_detail-dmbtr.
ELSEIF it_detail-blart = 'SA' AND it_detail-sgtxt(2) = 'DR' .
it_sum-machine = it_detail-dmbtr.
ELSE.
it_sum-others = it_detail-dmbtr.
ENDIF.
it_sum-total = it_sum-raw + it_sum-external + it_sum-standard +
it_sum-machine + it_sum-others.
APPEND it_sum.
CLEAR : it_sum, it_detail.
ENDLOOP.
ENDFORM. " get_data
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |