‎2013 Jun 18 10:24 AM
HI ,
I am using fuction module within loop
which is taking lots of time please tell me any trick how to do fast processing
my code is
LOOP AT IT_HD INTO WA_HD .
var = var + 1.
CALL FUNCTION 'BBP_PD_SC_GETDETAIL'
EXPORTING
I_GUID = WA_HD-GUID
IMPORTING
E_HEADER = E_HEADER
TABLES
E_ITEM = E_ITEM
E_ACCOUNT = E_ACCOUNT
E_PARTNER = E_PARTNER
E_STATUS = E_STATUS .
delete E_STATUS WHERE INACT = 'X'.
READ TABLE E_STATUS INTO WA_STATUS INDEX 1.
select single TXT30 from TJ02T into TXT30 WHERE ISTAT = WA_STATUS-STAT and SPRAS = 'E'.
loop at E_ITEM INTO WA_ITEM .
READ TABLE E_PARTNER INTO WA_PARTNER WITH KEY PARTNER_FCT = '00000019'.
READ TABLE IT_ORG INTO WA_ORG WITH KEY BE_PUR_GROUP = WA_ITEM-BE_PUR_GROUP
BE_PUR_ORG = WA_ITEM-BE_PUR_ORG
BE_CO_CODE = WA_ITEM-BE_CO_CODE.
IF SY-SUBRC = 0.
IF E_HEADER-POSTING_DATE IN POS_DATE.
SELECT SINGLE BE_OBJECT_ID FROM BBP_PDBEI INTO WA_SC-BE_OBJECT_ID WHERE GUID = WA_ITEM-GUID.
SELECT SINGLE NAME_ORG1 FROM BUT000 INTO WA_SC-NAME_ORG1 WHERE PARTNER_GUID = WA_PARTNER-PARTNER_NO .
ENDIF.
READ TABLE E_PARTNER INTO WA_PARTNER WITH KEY PARTNER_FCT = '00000019'.
WA_SC-ZZSOCOREQ = TXT30.
READ TABLE E_ACCOUNT INTO WA_ACCOUNT INDEX 1 .
CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
OWN_LOGICAL_SYSTEM = SYST_ID.
.
SELECT SINGLE RFC_SYS FROM ZLOGICAL_SYS INTO RFC_SYS WHERE OWN_SYS = SYST_ID.
IF SY-SUBRC = 0.
CALL FUNCTION 'Z_SRM_PO_INFO' DESTINATION RFC_SYS
EXPORTING
BE_OBJECT_ID = WA_SC-BE_OBJECT_ID
GL_CODE = WA_ACCOUNT-G_L_ACCT
COST_CTR = WA_ACCOUNT-COST_CTR
FUND = WA_ACCOUNT-FUNDs_ctr
IMPORTING
AEDAT = WA_SC-AEDAT
GL_CODE_DES = WA_SC-GL_CODE_DES
C_C_D = WA_SC-C_C_D
FUND_DES = WA_SC-FUND_DES.
.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = WA_ITEM-ORDERED_PROD
IMPORTING
OUTPUT = WA_ITEM-ORDERED_PROD
.
WA_SC-CREATED_BY = WA_HD-CREATED_BY .
WA_SC-POSTING_DATE = E_HEADER-POSTING_DATE .
WA_SC-BE_PUR_GROUP = WA_ITEM-BE_PUR_GROUP .
WA_SC-BE_PUR_ORG = WA_ITEM-BE_PUR_ORG .
WA_SC-BJECT_ID = E_HEADER-OBJECT_ID .
WA_SC-DESCRIPTION = E_HEADER-DESCRIPTION.
WA_SC-ORDERED_PROD = WA_ITEM-ORDERED_PROD.
WA_SC-DESCRIPTION1 = WA_ITEM-DESCRIPTION.
WA_SC-QUANTITY = WA_ITEM-QUANTITY .
WA_SC-CTR_HDR_NUMBER = WA_ITEM-CTR_HDR_NUMBER .
WA_SC-CTR_ITEM_NUMBER = WA_ITEM-CTR_ITEM_NUMBER .
WA_SC-CURRENCY = WA_ITEM-CURRENCY .
WA_SC-GROSS_PRICE = WA_ITEM-PRICE * WA_ITEM-QUANTITY.
WA_SC-ACC_CAT = WA_ACCOUNT-ACC_CAT.
WA_SC-COST_CTR = WA_ACCOUNT-COST_CTR.
WA_SC-ORDER_NO = WA_ACCOUNT-ORDER_NO.
WA_SC-NETWORK = WA_ACCOUNT-NETWORK.
WA_SC-ACTIVITY = WA_ACCOUNT-ACTIVITY.
WA_SC-FUND = WA_ACCOUNT-FUNDs_ctr.
WA_SC-ZZPRODUCT = WA_ACCOUNT-ZZPRODUCT.
WA_SC-GL_CODE = WA_ACCOUNT-G_L_ACCT .
IF G_L_ACCT IS NOT INITIAL AND COST_CTR IS NOT INITIAL .
READ TABLE E_ACCOUNT INTO WA_ACCOUNT INDEX 1.
IF WA_ACCOUNT-G_L_ACCT = G_L_ACCT AND WA_ACCOUNT-COST_CTR = COST_CTR.
APPEND WA_SC TO IT_SC .
ENDIF .
ENDIF .
IF G_L_ACCT IS NOT INITIAL AND COST_CTR IS INITIAL .
READ TABLE E_ACCOUNT INTO WA_ACCOUNT INDEX 1.
IF WA_ACCOUNT-G_L_ACCT = G_L_ACCT .
APPEND WA_SC TO IT_SC .
ENDIF .
ENDIF .
IF G_L_ACCT IS INITIAL AND COST_CTR IS NOT INITIAL .
READ TABLE E_ACCOUNT INTO WA_ACCOUNT INDEX 1.
IF WA_ACCOUNT-COST_CTR = COST_CTR.
APPEND WA_SC TO IT_SC .
ENDIF .
ENDIF .
IF G_L_ACCT IS INITIAL AND COST_CTR IS INITIAL .
APPEND WA_SC TO IT_SC .
ENDIF .
ENDIF .
ENDIF .
ENDLOOP .
ENDLOOP .
‎2013 Jun 18 12:30 PM
First find out what is really causing the delay by doing an ABAP trace via ST12.
You have several function calls, even remote, READs and SELECTs inside the loop, so anything could be the root cause here.
Thomas
‎2013 Jun 18 12:43 PM
Hi Ravi
Are you sure that FM is taking too long ?
I think loop inside loop is creating that issue .
n = 1.
read table index n .
n = n + 1.
try this rather than loop inside loop
regards
vaibhav
‎2013 Jun 18 12:52 PM
‎2013 Jun 18 1:08 PM
Hi Ravi kumar,
As per my observations of your code,
Reasons for large response time:
1) Loop inside loop
2) Read statements.
My suggestions:
1) Instead of using the first loop (LOOP AT IT_HD INTO WA_HD)
Make use of:
describe table it_hd.
itab_cnt = sy-tfill "No .of records in it_hd
cnt = 1.
while cnt <= itab_cnt.
read table it_hd index cnt
.
endwhile.
THIS WILL ELIMINATE THE SYSTEM'S LOAD TO TRACK INDEX OF TWO INTERNAL TABLES
2) Wherever READ is used, sort the internal tables and read them using binary search.
3) Following codes can be put outside the loop as they are static (no dependency on e_item)
(a)READ TABLE E_PARTNER INTO WA_PARTNER WITH KEY PARTNER_FCT = '00000019'.
(b) CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET'
IMPORTING
OWN_LOGICAL_SYSTEM = SYST_ID etc.
4) You can make use of FIELD-SYMBOLS for much faster access of the internal table (e_item)