Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

function module within loop

ravi_kumar221
Participant
0 Likes
637

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 .

4 REPLIES 4
Read only

ThomasZloch
Active Contributor
0 Likes
598

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

Read only

Former Member
0 Likes
598

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

Read only

0 Likes
598

it is compulsion to use loop withing loop

Read only

Arun_Prabhu_K
Active Contributor
0 Likes
598

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)