Skip to Content

Endless Loop

Hi I'm trying to output a routing report.

It all goes well until I process my internal tables to an alv.The code is getting stuck in a loop and I can't work out why.

Problem code below. Any ideas? Thanks in advance.

loop at gt_routing_hdr into ls_routing_hdr.

       clear ls_display_op.

       move-corresponding ls_routing_hdr to ls_display_op.

       loop at gt_routing_item into ls_routing_item where plnnr = ls_routing_hdr-plnnr.

*                                                     and plnal = ls_routing_hdr-plnal.

         move-corresponding ls_routing_item to ls_display_op.

* Get BOM information ignoring alternative BOMs

         read table gt_mast into ls_mast with key matnr = ls_display_op-matnr.

         if sy-subrc = 0.

           ls_display_op-stlnr = ls_mast-stlnr.

           ls_display_op-bmeng = ls_mast-bmeng.

           ls_display_op-bmein = ls_mast-bmein.

         endif.

* Get Production version data

         read table gt_mkal into ls_mkal with key matnr = ls_display_op-matnr

                                                  werks = ls_display_op-werks

                                                  plnnr = ls_display_op-plnnr

                                                  alnal = ls_display_op-plnal.

         if sy-subrc = 0.

           ls_display_op-stlal = ls_mkal-stlal.

           ls_display_op-verid = ls_mkal-verid.

           ls_display_op-mdv01 = ls_mkal-mdv01.

         endif.

* Get the costing lot size and planned future prices

         read table gt_marc into ls_marc

         with key matnr = ls_display_op-matnr

                  werks = ls_display_op-werks.

         ls_display_op-mtart = ls_marc-mtart.

         ls_display_op-losgr = ls_marc-losgr.

         ls_display_op-zplp1 = ls_marc-zplp1.

         ls_display_op-zplp2 = ls_marc-zplp2.

         ls_display_op-zkprs = ls_marc-zkprs.

         append ls_display_op to gt_display_op.

       endloop.

     endloop.

     sort gt_display_op by matnr plnnr plnal plnkn.

Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

11 Answers

  • avatar image
    Former Member
    Jan 08, 2015 at 10:07 AM

    Hi Benjamin,


    1. Use Parallel cursor.

    2. Before writing LOOP and READ statement SORT the TWO INTERNAL TABLES with KEY and use BINARY SEARCH.

    3. Use SY-SUBRC check after LOOP & READ statement.

             

    4. Replace the  Statetement as below.   

      loop at gt_routing_item into ls_routing_item where plnnr =ls_display_op-plnnr.


    5. Clear the workarea after the Loop.

    Thanks & Regards,

    Seshadri.

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:14 AM

    Hi Benjamin,

    First you loop your item table

       loop at gt_routing_item into ls_routing_item where plnnr = ls_routing_hdr-plnnr.

    *                                                     and plnal = ls_routing_hdr-plnal.


    Inside this loop use the READ statement to get the header details

    Read table git_header into gwa_header with key   (Your condition)



    Endloop.




    With Regards

    Arun VS

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:19 AM

    Hi Benjamin,

    You should avoid loop inside loop. In this case, you can easily do so.

    Loop at item table, gt_routing_item, first and then, inside the loop you can read gt_routing_hdr table passing plnnr and plnal value from item table.

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:21 AM

    Hi,

    Please take care of below points:

    1. Loop through the item table.

    2. Read the header table followed by other tables as did by you in code.

    3. Table which are being READ should be sorted on the KEYS and in each READ statement put a BINARY SEARCH. It increases the performance.

    4. Instead of using MOVE CORRESPONDING FIELDS pass the value of each field as:

    ls_display_op-field1 = ls_routing_item-field1.

    ls_display_op-field2 = ls_routing_item-field2.

    Regards,

    Aashika

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:26 AM

    Hi Benjamin,

    You have to apply parallel cursor method here as you are using nested loop. Try below code and let me know if it works.

    DATA: lv_index type sy-tabix.

      SORT gt_routing_hdr by plnnr.

      SORT gt_routing_item by plnnr.

      loop at gt_routing_hdr into ls_routing_hdr.

           clear ls_display_op.

           move-corresponding ls_routing_hdr to ls_display_op.

           clear lv_index.

           read table gt_routing_item into ls_routing_item with key plnnr = ls_routing_hdr-plnnr BINARY SEARCH.

           if sy-subrc eq 0.

             lv_index = sy-tabix.

           endif. 

           loop at gt_routing_item into ls_routing_item from lv_index. "where plnnr = ls_routing_hdr-plnnr.

    *                                                     and plnal = ls_routing_hdr-plnal.

             move-corresponding ls_routing_item to ls_display_op.

    * Get BOM information ignoring alternative BOMs

             read table gt_mast into ls_mast with key matnr = ls_display_op-matnr.

             if sy-subrc = 0.

               ls_display_op-stlnr = ls_mast-stlnr.

               ls_display_op-bmeng = ls_mast-bmeng.

               ls_display_op-bmein = ls_mast-bmein.

             endif.

    * Get Production version data

             read table gt_mkal into ls_mkal with key matnr = ls_display_op-matnr

                                                      werks = ls_display_op-werks

                                                      plnnr = ls_display_op-plnnr

                                                      alnal = ls_display_op-plnal.

             if sy-subrc = 0.

               ls_display_op-stlal = ls_mkal-stlal.

               ls_display_op-verid = ls_mkal-verid.

               ls_display_op-mdv01 = ls_mkal-mdv01.

             endif.

    * Get the costing lot size and planned future prices

             read table gt_marc into ls_marc

             with key matnr = ls_display_op-matnr

                      werks = ls_display_op-werks.

             ls_display_op-mtart = ls_marc-mtart.

             ls_display_op-losgr = ls_marc-losgr.

             ls_display_op-zplp1 = ls_marc-zplp1.

             ls_display_op-zplp2 = ls_marc-zplp2.

             ls_display_op-zkprs = ls_marc-zkprs.

             append ls_display_op to gt_display_op.

           endloop.

         endloop.

         sort gt_display_op by matnr plnnr plnal plnkn.

    Add comment
    10|10000 characters needed characters exceeded

  • Jan 08, 2015 at 10:31 AM

    Hi Benjamin,

    Kindly do the sorting in both the internal tables before doing looping in ascending order, also use the binary search for read statements, when you use binary search on read statement must sort that internal table, Also, chech sy-subrc eq 0 after read statement.

    I think lot of data records are in internal tables, hence use the parallel cursor technique for looping.

    Many Thanks / Himanshu Gupta

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:32 AM

    HI Benjamin,

    I guess the endless loop is due to the recursive of BOM for materials.You are trying to read the MAST table with a MATNR field which will be getting updated to the looping table. Instead of reading the table MAST repeatedly and appending the same data to the table you can have one buffer table which stores all the materials which are returned and before reading the MAST table table read the buffer table if the material is present in buffer then you can skip the logic of appending the MAST table to the internal table and if buffer table does not have the material then you can append the material to the internal table from MAST table.

    Regards,

    Chakradhar.

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Jan 08, 2015 at 10:36 AM

    Hi Benjamin

    loop at gt_routing_hdr into ls_routing_hdr.

           move-corresponding ls_routing_hdr to ls_display_op.

    Read Table gt_routing_item into ls_routing_item with key plnnr = ls_routing_hdr-plnnr.

    if sy-subrc = 0.

    move-corresponding ls_routing_item to ls_display_op

    ENDIF.

    * Get BOM information ignoring alternative BOMs

             read table gt_mast into ls_mast with key matnr = ls_display_op-matnr.

             if sy-subrc = 0.

               ls_display_op-stlnr = ls_mast-stlnr.

               ls_display_op-bmeng = ls_mast-bmeng.

               ls_display_op-bmein = ls_mast-bmein.

             endif.

    * Get Production version data

             read table gt_mkal into ls_mkal with key matnr = ls_display_op-matnr

                                                      werks = ls_display_op-werks

                                                      plnnr = ls_display_op-plnnr

                                                      alnal = ls_display_op-plnal.

             if sy-subrc = 0.

               ls_display_op-stlal = ls_mkal-stlal.

               ls_display_op-verid = ls_mkal-verid.

               ls_display_op-mdv01 = ls_mkal-mdv01.

             endif.

    * Get the costing lot size and planned future prices

             read table gt_marc into ls_marc

             with key matnr = ls_display_op-matnr

                      werks = ls_display_op-werks.

             ls_display_op-mtart = ls_marc-mtart.

             ls_display_op-losgr = ls_marc-losgr.

             ls_display_op-zplp1 = ls_marc-zplp1.

             ls_display_op-zplp2 = ls_marc-zplp2.

             ls_display_op-zkprs = ls_marc-zkprs.

             append ls_display_op to gt_display_op.

    clear : ls_routing_hdr,ls_routing_item,ls_mast,ls_marc,ls_display_op

         endloop.

         sort gt_display_op by matnr plnnr plnal plnkn.

    Thanks

    Vamsi

    Add comment
    10|10000 characters needed characters exceeded

  • Jan 08, 2015 at 10:49 AM

    Hi Benjamin,

    Based on your code, it is clear that it is not going in endless loop.

    It might be taking more time due to huge data.

    As suggested by everyone, you need to improve the code performance by:

    1) Looping at Item data and then read header data

    2) Use of Binary Search in Read. Make sure that a table is sorted in ASCENDING order on same keys as Binary search on that table.

    Warm Regards,

    Shyam Agrawal

    Add comment
    10|10000 characters needed characters exceeded

  • Jan 08, 2015 at 11:00 AM

    Hi,

    Try.

    Replace work area by field symbols.

    Loop through item table.

    Before using Read statement sort the internal by key, add BINARY SEARCH.

    Hope it helpful.

    Regards,

    Venkat.

    Add comment
    10|10000 characters needed characters exceeded