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

how to avoid nested loop

Former Member
0 Likes
1,983

hi,

data :begin of itab3 occurs 0,

matnr type matnr,

werks type werks,

lgort type lgort_g,

qty type menge_d,

end of itab3.

loop at itab_mard.

loop at itab_mchb where matnr = itab_mard-matnr and

werks = itab_mard-werks and

lgort = itab_mard-lgort.

lv_qty = lv_qty + itab_mchb-qty.

endloop.

itab3-matnr = itab_mard-matnr.

itab3-werks = itab_mard-werks.

itab3-lgort = itab_mard-lgort_g.

itab3-qty = lv_qty.

append itab3.

clear lv_qty.

endloop.

In the above code how can avoid nested loop.

10 REPLIES 10
Read only

Former Member
0 Likes
1,008

Use for all entries

Read only

Former Member
0 Likes
1,008

data :begin of itab3 occurs 0,

matnr type matnr,

werks type werks,

lgort type lgort_g,

qty type menge_d,

end of itab3.

loop at itab_mard.

For all entries in itab_mchb where matnr = itab_mard-matnr and

werks = itab_mard-werks and

lgort = itab_mard-lgort.

lv_qty = lv_qty + itab_mchb-qty.

itab3-matnr = itab_mard-matnr.

itab3-werks = itab_mard-werks.

itab3-lgort = itab_mard-lgort_g.

itab3-qty = lv_qty.

append itab3.

clear lv_qty.

endloop.

Regards,

Jagadish

Read only

Former Member
0 Likes
1,008

Hi Ramya,

you can use for all entries as our friend said but be carefull while using it

either in the select clause you should have complete key or else in where clause you should have complete key or else you will get some unexpected results..

if u have still quiries u can contact me

for more details see my business card..

Regards

Sunil Kumar Mutyala....

Read only

Former Member
0 Likes
1,008

Hi,

sort itab_mard by matnr.

loop at itab_mard.

move-corresponding itab_mard to itab3.

collect itab3.

endloop.

since menge is the only quantity filed it will be added ...

regards,

lavanya

Read only

former_member435013
Active Participant
0 Likes
1,008

Hi Ramya,

try this:

DATA:

BEGIN OF key_mard,

matnr LIKE mard-matnr,

werks LIKE mard-werks,

lgort LIKE mard-lgort,

END OF key_mard,

BEGIN OF key_mchb,

matnr LIKE mchb-matnr,

werks LIKE mchb-werks,

lgort LIKE mchb-lgort,

END OF key_mchb,

ind TYPE i.

SORT itab_mard BY matnr werks lgort.

SORT itab_mchb BY matnr werks lgort.

CLEAR itab_mard.

LOOP AT itab_mchb.

MOVE-CORRESPONDING itab_mchb TO key_mchb.

MOVE-CORRESPONDING itab_mard TO key_mard.

IF key_mard < key_mchb.

IF NOT key_mard IS INITIAL.

itab3-matnr = itab_mard-matnr.

itab3-werks = itab_mard-werks.

itab3-lgort = itab_mard-lgort_g.

itab3-qty = lv_qty.

append itab3.

clear lv_qty.

ENDIF.

ind = ind + 1.

READ TABLE itab_mard INDEX ind.

CONTINUE.

ENDIF.

lv_qty = lv_qty + itab_mchb-qty.

ENDLOOP.

IF NOT key_mard IS INITIAL.

itab3-matnr = itab_mard-matnr.

itab3-werks = itab_mard-werks.

itab3-lgort = itab_mard-lgort_g.

itab3-qty = lv_qty.

append itab3.

ENDIF.

regards

Walter Habich

Edited by: Walter Habich on May 27, 2008 1:34 PM

Read only

Former Member
0 Likes
1,008

Hi Ramya,

If u have Nested loops then use PARALLEL CURSOR method. This is more efficient method.

Please check this link for Parallel Cursor Method.

http://www.saptechnical.com/Tutorials/ABAP/ParallelCursor.htm

Best regards,

raam

Read only

RaymondGiuseppi
Active Contributor
0 Likes
1,008

Try something like

SORT  itab_mchb BY matnr werks lgort.
SORT  itab_mard BY matnr werks lgort.
LOOP AT itab_mchb.
  AT NEW lgort.
    CLEAR itab3.
    READ TABLE itab_mard
      WITH KEY matnr = itab_mchb-matnr
               werks = itab_mchb-werks
               lgort = itab_mchb-lgort
      BINARY SEARCH.
    itab3-matnr = itab_mard-matnr.
    itab3-werks = itab_mard-werks.
    itab3-lgort = itab_mard-lgort.
  ENDAT.
  ADD itab_mchb-qty TO itab3-qty.
  AT END OF lgort.
    APPEND itab3.
  ENDAT.
ENDLOOP.

Regards

Read only

megha_h
Participant
0 Likes
1,008

Hi Ramya,

You can use this -

create an internal table lt_itabqty and lt_totqty with struct

matnr.

werks.

lgort

qty

move itab_mard[] to lt_itabqty[]. (if matnr werks lgort qty are the 1st 4 fields) else you'll have to use move-corresponding.

loop at lt_itabqty.

collect lt_itabqty into lt_totqty.

endloop.

-


loop at itab_mard.

read table lt_itabqty with key matnr = itab_mard-matnr

werks = itab_mard-werks

lgort = itab_mard-lgort.

itab3-matnr = itab_mard-matnr.

itab3-werks = itab_mard-werks.

itab3-lgort = itab_mard-lgort_g.

itab3-qty = lt_itabqty-qty.

append itab3.

clear lv_qty.

endloop.

-


This way you can eliminate 1 loop completely.

Reward points if found useful

Regards

Megha

Read only

Former Member
0 Likes
1,008

Hi,

You can use parallel cursor method.

Conventional Code for nested loops

Conventional Method

-


loop at lt_vbpa into wa_vbpa.

loop at lt_kna1 into wa_kna1 where kunnr = wa_vbpa-kunnr.

            • Your Actual logic within inner loop ******

endloop.

endloop.

Code sample: Parallel Cursor method

Preferred Method

sort: lt_vbpa by kunnr, "Sorting by key is very important

lt_kna1 by kunnr. "Same key which is used for where condition is used here

loop at lt_vbpa into wa_vbpa.

read lt_kna1 into wa_kna1 " This sets the sy-tabix

with key kunnr = wa_vbpa-kunnr

binary search.

if sy-subrc = 0. "Does not enter the inner loop

v_kna1_index = sy-tabix.

loop at lt_kna1 into wa_kna1 from v_kna1_index. "Avoiding Where clause

if wa_kna1-kunnr <> wa_vbpa-kunnr. "This checks whether to exit out of loop

exit.

endif.

            • Your Actual logic within inner loop ******

endloop. "KNA1 Loop

endif.

endloop. " VBPA Loop

Read only

Former Member
0 Likes
1,008

Conventional Code for nested loops

Conventional Method

loop at lt_vbpa into wa_vbpa.

loop at lt_kna1 into wa_kna1 where kunnr = wa_vbpa-kunnr.

            • Your Actual logic within inner loop ******

endloop.

endloop.

Code sample: Parallel Cursor method

Preferred Method

sort: lt_vbpa by kunnr, "Sorting by key is very important

lt_kna1 by kunnr. "Same key which is used for where condition is used here

loop at lt_vbpa into wa_vbpa.

read lt_kna1 into wa_kna1 " This sets the sy-tabix

with key kunnr = wa_vbpa-kunnr

binary search.

if sy-subrc = 0. "Does not enter the inner loop

v_kna1_index = sy-tabix.

loop at lt_kna1 into wa_kna1 from v_kna1_index. "Avoiding Where clause

if wa_kna1-kunnr <> wa_vbpa-kunnr. "This checks whether to exit out of loop

exit.

endif.

            • Your Actual logic within inner loop ******

endloop. "KNA1 Loop

endif.

endloop. " VBPA Loop