‎2007 Oct 01 7:41 AM
Hi Experts
I am using nested loops
but as it is not good practice
please send me alternative for this......
LOOP AT IT_VBAK INTO WA_VBAK.
READ TABLE IT_VBAP INTO WA_VBAP WITH KEY VBELN = WA_VBAK-VBELN.
READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR = WA_VBAK-KUNNR.
SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
LOOP AT IT_VBAP INTO WA_VBAP .
READ TABLE IT_VBKD INTO WA_VBKD WITH KEY VBELN = WA_VBAP-VBELN POSNR =
WA_VBAP-POSNR.
READ TABLE IT_VEDA INTO WA_VEDA WITH KEY VBELN = WA_VEDA-VBELN.
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
ENDLOOP.
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
APPEND WA_DISPLAY TO IT_DISPLAY
‎2007 Oct 01 7:45 AM
For Line item data, you should use Loop inside Loop.
Few changes were required in your code. Changes are marked in Bold.
<b>SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
SORT IT_VBAP BY VBELN.
SORT IT_KNA1 by KUNNR.</b>
LOOP AT IT_VBAK INTO WA_VBAK.
READ TABLE IT_VBAP INTO WA_VBAP WITH KEY VBELN = WA_VBAK-VBELN <b>BINARY SEARCH</b>.
READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR = WA_VBAK-KUNNR <b>BINARY SEARCH</b>.
<i><b>* SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .</b></i>
LOOP AT IT_VBAP INTO WA_VBAP <b>WHERE VBELN = WA_VBAK-VEBLN</b> .
READ TABLE IT_VBKD INTO WA_VBKD WITH KEY VBELN = WA_VBAP-VBELN POSNR =
WA_VBAP-POSNR <b>BINARY SEARCH</b>.
READ TABLE IT_VEDA INTO WA_VEDA WITH KEY VBELN = WA_VEDA-VBELN <b>BINARY SEARCH.</b>
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
ENDLOOP.
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
APPEND WA_DISPLAY TO IT_DISPLAY
‎2007 Oct 01 8:08 AM
‎2007 Oct 01 8:14 AM
‎2007 Oct 01 7:47 AM
Hi Ameet,
I think your logic is not correct. VBAP is item structure so you need to use LOOP here but you are not handling it correctly in the output table.
LOOP AT IT_VBAK INTO WA_VBAK.
READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR = WA_VBAK-KUNNR.
SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
LOOP AT IT_VBAP INTO WA_VBAP .
READ TABLE IT_VBKD INTO WA_VBKD WITH KEY VBELN = WA_VBAP-VBELN POSNR =
WA_VBAP-POSNR.
READ TABLE IT_VEDA INTO WA_VEDA WITH KEY VBELN = WA_VEDA-VBELN.
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
APPEND WA_DISPLAY TO IT_DISPLAY
ENDLOOP.
ENDLOOP.
Regards,
Atish
‎2007 Oct 01 7:54 AM
‎2007 Oct 01 8:02 AM
hi Ameet..
Check this code.. It should work for u..
**Since the internal tables are sorted we can use BINARY SEARCH to improve the **performance
SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
SORT IT_VBAK BY VBELN.
SORT IT_VBAP BY VBELN.
SORT IT_KNA1 BY KUNNR.
LOOP AT IT_VBAP INTO WA_VBAP .
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
READ TABLE IT_VBAK INTO WA_VBAK
WITH KEY VBELN = WA_VBAK-VBELN
BINARY SEARCH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR = WA_VBAK-KUNNR.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
ENDIF.
ENDIF.
READ TABLE IT_VBKD INTO WA_VBKD
WITH KEY VBELN = WA_VBAP-VBELN POSNR = WA_VBAP-POSNR
BINARY SEACH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
ENDIF.
READ TABLE IT_VEDA INTO WA_VEDA
WITH KEY VBELN = WA_VEDA-VBELN
BINARY SEARCH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
ENDIF.
APPEND WA_DISPLAY TO IT_DISPLAY
ENDLOOP.
<b>Reward if Helpful.</b>
‎2007 Oct 01 8:04 AM
Hi Ameet,
Use parallel cursor method for this. It will be best in terms of performance. As per performance point of view it is not good to sort the tables inside the loop.
One more thing is VBAP is an item table and may contain many records for single VBELN in VBAK. so, we have to loop on that table.
Try using the below code.
Data : lw_index type sy-tabix.
SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
SORT IT_VBAP BY VBELN.
SORT IT_VBAK BY VBELN.
SORT IT_KNA1 by KUNNR.
lw_index = 1.
LOOP AT IT_VBAK INTO WA_VBAK.
READ TABLE IT_KNA1 INTO WA_KNA1 WITH KEY KUNNR = WA_VBAK-KUNNR.
LOOP AT IT_VBAP INTO WA_VBAP from index lw_index.
If wa_vbap-vbeln GT wa_vbak-vbeln.
lw_index = sy-tabix.
exit.
elseif wa_vbap-vbeln EQ wa_vbak-vbeln.
READ TABLE IT_VBKD INTO WA_VBKD WITH KEY VBELN = WA_VBAP-VBELN POSNR =
WA_VBAP-POSNR binary search.
READ TABLE IT_VEDA INTO WA_VEDA WITH KEY VBELN = WA_VEDA-VBELN binary search.
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
endif.
ENDLOOP.
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
APPEND WA_DISPLAY TO IT_DISPLAY
ENDLOOP.
Hope this will help you.
‎2007 Oct 01 8:27 AM
Hi Ameet,
As you have not posted the thread as a question I think you cant reward points for this thread.
I hope your problem is resolved.
In future post threads as questions.
‎2007 Oct 01 8:04 AM
Hi Ameet ..
Some corrections from my Prev post.
Try this:
hi Ameet..
Check this code.. It should work for u..
**Since the internal tables are sorted we can use BINARY SEARCH to improve the **performance
SORT IT_VBKD BY VBELN POSNR.
SORT IT_VEDA BY VBELN .
SORT IT_VBAK BY VBELN.
SORT IT_VBAP BY VBELN.
SORT IT_KNA1 BY KUNNR.
LOOP AT IT_VBAP INTO WA_VBAP .
MOVE-CORRESPONDING WA_VBAP TO WA_DISPLAY.
READ TABLE IT_VBAK INTO WA_VBAK
<b>WITH KEY VBELN = WA_VBAP-VBELN</b>
BINARY SEARCH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VBAK TO WA_DISPLAY.
READ TABLE IT_KNA1 INTO WA_KNA1
WITH KEY KUNNR = WA_VBAK-KUNNR.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_KNA1 TO WA_DISPLAY.
ENDIF.
ENDIF.
READ TABLE IT_VBKD INTO WA_VBKD
WITH KEY VBELN = WA_VBAP-VBELN POSNR = WA_VBAP-POSNR
BINARY SEACH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VBKD TO WA_DISPLAY.
ENDIF.
READ TABLE IT_VEDA INTO WA_VEDA
<b>WITH KEY VBELN = WA_vbap-VBELN</b>
BINARY SEARCH.
IF SY-SUBRC = 0.
MOVE-CORRESPONDING WA_VEDA TO WA_DISPLAY.
ENDIF.
APPEND WA_DISPLAY TO IT_DISPLAY
ENDLOOP.