09-06-2007 8:17 AM
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.
09-06-2007 8:19 AM
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
09-06-2007 8:22 AM
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
09-06-2007 8:22 AM
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
09-06-2007 8:23 AM
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.
09-06-2007 8:23 AM
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
09-06-2007 8:26 AM
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
09-06-2007 8:29 AM
If possible, a hash table would be even more faster then a sorted table.
09-06-2007 8:28 AM
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>
09-06-2007 8:31 AM
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.
09-06-2007 8:39 AM
HI avoid loop in loop write read condition in a loop to increase the performance
09-06-2007 9:38 AM
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
09-06-2007 11:55 AM
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.