Application Development 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: 

how to reduce the loop

Former Member
0 Kudos

hi,

my code is

LOOP AT ITAB_VBAK INTO WA_VBAK.

LOOP AT ITAB_VBAP INTO WA_VBAP.

IF WA_VBAP-VBELN EQ WA_VBAK-VBELN.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

ENDIF.

ENDLOOP.

ENDLOOP.

now i don't want the two loops. I want to do this by using the single loop.

12 REPLIES 12

gopi_narendra
Active Contributor
0 Kudos

Instead you can use a join of VBAK and VBAP on VBELN, since VBAK and VBAP are header and item tables.

Ok if you follow the code below, sort is must because of binary search in the read statement.


sort itab_vbak by vbeln.
sort itab_vbap by vbeln posnr.
  LOOP AT itab_vbap INTO wa_vbap. " changed to vbap from vbak
    READ TABLE itab_vbak INTO wa_vbak WITH KEY 
                              vbeln = wa_vbap-vbeln
                              binary search.
    " instead of loop use the read statement
    IF sy-subrc = 0.
      wa_data-vkorg = wa_vbak-vkorg.
      wa_data-kunnr = wa_vbak-kunnr.
      wa_data-vbeln = wa_vbak-vbeln.
      wa_data-audat = wa_vbak-audat.
      wa_data-vdatu = wa_vbak-vdatu.
      wa_data-ernam = wa_vbak-ernam.
      wa_data-matnr = wa_vbap-matnr.
      wa_data-vkaus = wa_vbap-vkaus.
      wa_data-posnr = wa_vbap-posnr.
      APPEND wa_data TO itab_data.
    ENDIF.
    CLEAR : wa_vbak, wa_vbap, wa_data. " clear work areas
  ENDLOOP.

Regards

Gopi

Former Member
0 Kudos

Hi

do this

LOOP AT ITAB_VBAK INTO WA_VBAK.

read itab_vbap into wa_vbap with key VBELN EQ WA_VBAK-VBELN.

IF WA_VBAP-VBELN EQ WA_VBAK-VBELN.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

endloop.

reward if helpful.

thanks

vivekanand

Former Member
0 Kudos

Hi,

sort itab_vbap by vkorg.

LOOP AT ITAB_VBAK INTO WA_VBAK.

<b>read table ITAB_VBAP INTO WA_VBAP with key

VKORG = WA_VBAK-VKORG binary search.</b>

if sy-subrc eq 0.

IF WA_VBAP-VBELN EQ WA_VBAK-VBELN.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

endif.

ENDLOOP.

thanks & regards,

Venkatesh

Former Member
0 Kudos

LOOP AT ITAB_VBAK INTO WA_VBAK.

read table ITAB_VBAP with key VBELN = wa_vbak-VBELN.

if sy-subrc = 0.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

endif.

ENDLOOP.

Former Member
0 Kudos

you can do it like this -

SORT ITAB_VBAK BYV VBELN.
SORT ITAB_VBAP BYV VBELN POSNR.

LOOP AT ITAB_VBAP INTO WA_VBAP.
 READ TABLE ITAB_VBAK INTO WA_VBAK WITH KEY VBELN = WA_VBAP-VBELN
BINARY SEARCH.
CHECK SY-SUBRC EQ 0.
* Move the fields.
WA_DATA-VKORG = WA_VBAK-VKORG.
WA_DATA-KUNNR = WA_VBAK-KUNNR.
WA_DATA-VBELN = WA_VBAK-VBELN.
WA_DATA-AUDAT = WA_VBAK-AUDAT.
WA_DATA-VDATU = WA_VBAK-VDATU.
WA_DATA-ERNAM = WA_VBAK-ERNAM.
WA_DATA-MATNR = WA_VBAP-MATNR.
WA_DATA-VKAUS = WA_VBAP-VKAUS.
WA_DATA-POSNR = WA_VBAP-POSNR.
APPEND WA_DATA TO ITAB_DATA.

ENDLOOP.

-


SKC

former_member194613
Active Contributor
0 Kudos

sorry, all three versions (first 3, there are many more answers now) have the same problem, the scan the inner table completely for each entry of the outer table.

Define the inner table ITAB_VBAP as a sorted table !

The read with key or loop at where (using WA_VBAP-VBELN = WA_VBAK-VBELN ) works fine, because it can apply a binary search on the inner table!

If the inner table must be standard table, sort it and use read binary search. Don't sort the outer table, it costs and helps not at all!

Siegfried

Message was edited by:

Siegfried Boes

0 Kudos

If possible, a hash table would be even more faster then a sorted table.

varma_narayana
Active Contributor
0 Kudos

Hi

This is the best way...

sort it_vbak by vbeln.

LOOP AT ITAB_VBAP INTO WA_VBAP.

READ TABLE IT_VBAK With key vbeln = it_vbap-vbeln binary search.

IF SY-SUBRC = 0.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

clear wa_data.

endif.

ENDLOOP.

<b>reward if Helpful.</b>

Former Member
0 Kudos

Hi.

Use where condtion, if there are multiple records in ITAB_VBAP with the same WA_VBAK-VBELN.

LOOP AT ITAB_VBAK INTO WA_VBAK.

LOOP AT ITAB_VBAP INTO WA_VBAP <b>where VBELN = WA_VBAK-VBELN</b> .

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

ENDLOOP.

ENDLOOP.

Former Member
0 Kudos

HI avoid loop in loop write read condition in a loop to increase the performance

Former Member
0 Kudos

Hi Darshan,

You can achieve this by using Read statement inside the Loop.

You can write the condition in the inside loop in the Read statement .

***Reward points to answers***

Regards,

Vijay

Former Member
0 Kudos

Hi Darshana,

You can reverse the loop basically, VBAP being a line item table you might have more lines for the same VEBLN in VBAP table as compared to only one in VBAK table. All you need to do is to loop on VBAP table and just read the VBAK TABLE with the key you are comparing.. vbeln... and append to the data table.

Sort itab_vbak by vbeln.

LOOP AT ITAB_VBAP INTO WA_VBAP.

READ TABLE itab_vbak into wa_vbak with key

vbeln - wa_vbap-vbeln binary search.

IF sy-subrc EQ 0.

WA_DATA-VKORG = WA_VBAK-VKORG.

WA_DATA-KUNNR = WA_VBAK-KUNNR.

WA_DATA-VBELN = WA_VBAK-VBELN.

WA_DATA-AUDAT = WA_VBAK-AUDAT.

WA_DATA-VDATU = WA_VBAK-VDATU.

WA_DATA-ERNAM = WA_VBAK-ERNAM.

WA_DATA-MATNR = WA_VBAP-MATNR.

WA_DATA-VKAUS = WA_VBAP-VKAUS.

WA_DATA-POSNR = WA_VBAP-POSNR.

APPEND WA_DATA TO ITAB_DATA.

ENDIF.

ENDLOOP.