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: 

exit from recursion loop.

kesavadas_thekkillath
Active Contributor
0 Kudos
451

I have marked the code part in bold....

When the exit command is satisfied...still it simply loops in the same loop for the number of entries in the stack table..

i want the cursor on the first loop immediately after the exit statament in in subroutine.

The program is correct...but how to achieve this...

when exit found it must get completely out of the form..

REPORT  zpp475_inverse_bom_explosion NO STANDARD PAGE HEADING MESSAGE-ID
zpp.


TABLES:marc,
       makt,
       t179t,
       mara,
       stas.
DATA:stpov1 TYPE stpov.

DATA:BEGIN OF t_store,
matnr TYPE stpov-matnr,   "HALB Part
vwalt(2) TYPE c,          "Alternative BOM
pmatnr TYPE stpov-matnr,  "FERT Part
maktx TYPE stpov-ojtxb,   "Material Texts
maktx1 TYPE stpov-ojtxb,
menge TYPE p DECIMALS 0,  "Required Qty
vtext TYPE t179t-vtext,   "FERT Model
END OF t_store.

DATA:BEGIN OF t_stack,
vwalt(2) TYPE c,
matnr TYPE marc-matnr,
menge TYPE stpov-menge,
exploded TYPE c,
END OF t_stack.

DATA:store   LIKE STANDARD TABLE OF t_store INITIAL SIZE 0,
     stack   LIKE STANDARD TABLE OF t_stack INITIAL SIZE 0,
     list    LIKE STANDARD TABLE OF stpov1  INITIAL SIZE 0,
     equicat TYPE STANDARD TABLE OF cscequi INITIAL SIZE 0,
     kndcat  TYPE STANDARD TABLE OF cscknd  INITIAL SIZE 0,
     matcat  TYPE STANDARD TABLE OF cscmat  INITIAL SIZE 0,
     stdcat  TYPE STANDARD TABLE OF cscstd  INITIAL SIZE 0,
     tplcat  TYPE STANDARD TABLE OF csctpl  INITIAL SIZE 0.

DATA:partno TYPE marc-matnr.
DATA:validity_date TYPE sy-datum.
DATA:language TYPE sy-langu.
DATA:line_index TYPE sy-tabix.
DATA:total_entries TYPE sy-tfill.
DATA:report_name TYPE sy-repid.
DATA:exploded_flag(1) TYPE c VALUE 'X'.         "For Explosion Flag
DATA:initial_menge(1) TYPE p DECIMALS 0 VALUE 1."For Initial Push
DATA:alternative_bom(2) TYPE c VALUE '01'.      "For Initial Push
DATA:true(1) TYPE c.                            "True Check = 'X'

TYPE-POOLS:slis.
DATA:wk_layout TYPE slis_layout_alv,
alvfld TYPE slis_fieldcat_alv,
fieldcat TYPE STANDARD TABLE OF slis_fieldcat_alv INITIAL SIZE 0,
i_sort TYPE slis_t_sortinfo_alv,
w_sort LIKE LINE OF i_sort.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001 NO
INTERVALS.
SELECT-OPTIONS:so_matnr FOR marc-matnr NO INTERVALS OBLIGATORY.
PARAMETERS:p_werks TYPE marc-werks OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  validity_date = sy-datum.
  language = sy-langu.
  report_name = sy-repid.
  true = exploded_flag.

AT SELECTION-SCREEN.
  PERFORM validate_entries.

START-OF-SELECTION.
  LOOP AT so_matnr.
    PERFORM init_values.
*Initial push to stack
    MOVE so_matnr-low TO t_stack-matnr.
    t_stack-menge =  initial_menge.
    MOVE alternative_bom TO t_stack-vwalt.
    MOVE exploded_flag TO t_stack-exploded.
    APPEND t_stack TO stack.
    MOVE so_matnr-low TO partno.
*Process with initially pushed values
    LOOP AT stack INTO t_stack.
      IF stack[] IS INITIAL.
        EXIT.
      ENDIF.
      PERFORM get_upper_level USING t_stack-matnr
                                    partno
                                    t_stack-menge
                                    t_stack-vwalt.
    ENDLOOP.
  ENDLOOP.
  CHECK store[] IS NOT INITIAL.
  PERFORM get_child_texts.
  SORT store[] BY vwalt matnr ASCENDING.
  PERFORM assign_layout_values.
  REFRESH i_sort[].
  REFRESH fieldcat[].
  PERFORM fieldcat_build USING :'VWALT'  text-006 '1',
                                'MATNR'  text-002 '2',
                                'MAKTX'  text-003 '3',
                                'PMATNR' text-004 '4',
                                'MENGE'  text-005 '5',
                                'MAKTX1' text-008 '6',
                                'VTEXT'  text-007 '7'.
  PERFORM display_result.
*&---------------------------------------------------------------------*
*&      Form  GET_UPPER_LEVEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SO_MATNR_LOW  text
*----------------------------------------------------------------------*
FORM get_upper_level  USING    p_so_matnr_low TYPE any
                               p_partno TYPE marc-matnr
                               p_menge TYPE stpov-menge
                               p_vwalt TYPE c.

*GET THE NEXT UPPER LEVEL FOR THE PART

  CALL FUNCTION 'CS_WHERE_USED_MAT'
    EXPORTING
      datub                      = validity_date
      datuv                      = validity_date
      matnr                      = p_so_matnr_low
      werks                      = p_werks
    TABLES
      wultb                      = list[]
      equicat                    = equicat[]
      kndcat                     = kndcat[]
      matcat                     = matcat[]
      stdcat                     = stdcat[]
      tplcat                     = tplcat[]
    EXCEPTIONS
      call_invalid               = 1
      material_not_found         = 2
      no_where_used_rec_found    = 3
      no_where_used_rec_selected = 4
      no_where_used_rec_valid    = 5
      OTHERS                     = 6.

  IF ( sy-subrc NE 0 ).
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  DESCRIBE TABLE list[] LINES total_entries.
  IF ( total_entries EQ 0 ).
*THERE IS NO NODE AFTER THE NODES SO ASSIGN IT AS EXPLODED
    MOVE exploded_flag TO t_stack-exploded.
    MODIFY stack[] FROM t_stack TRANSPORTING exploded.
  ELSE.
    total_entries = 0.
*CHECK THE PROCUREMENT TYPE FOR THE FETCHED PARTS..IF 'F' DELETE
**Procurement check Commented by Kesav -11.03.08
**If check needed remove the comment
*    LOOP AT list[] INTO stpov1.
*      line_index = sy-tabix.
*      SELECT beskz INTO (marc-beskz) FROM marc
*        WHERE matnr EQ stpov1-matnr
*        AND beskz EQ 'F'
*        AND lvorm EQ space.
*        EXIT.
*      ENDSELECT.
*      CHECK sy-subrc EQ 0.
*      DELETE list INDEX line_index.
*    ENDLOOP.
    line_index = 0.
*SUMFG check included "13.03.08
*WHERE EVER THE ALTERNATIVE BOM INDICATOR IS SPACE CHANGE IT AS '01'.
    LOOP AT list[] INTO stpov1 WHERE ( sumfg = ' ' OR sumfg = 'x' ).
      line_index = sy-tabix.
*Deletion check included "13.03.08
*Check the deletion indicator is true or false for a node
      SELECT lkenz INTO (stas-lkenz) FROM stas
      WHERE ( stlnr = stpov1-stlnr ) AND
            ( stlkn = stpov1-stlkn ) AND
            ( lkenz = true ).
        EXIT.
      ENDSELECT.
*If the part id active then process
      IF ( sy-subrc NE 0 ).
        CHECK ( stpov1-vwalt = space ).
        MOVE p_vwalt TO stpov1-vwalt.
        MODIFY list[] INDEX line_index FROM stpov1 TRANSPORTING vwalt.
      ELSE.
*delete that node from the internal table
        DELETE list[] INDEX line_index.
      ENDIF.
    ENDLOOP.
    line_index = 0.
*Compute the qty..Initially the stack holds menge as 1 & changes later
    LOOP AT list[] INTO stpov1 WHERE ( idnrk = p_so_matnr_low )
                               AND   ( sumfg = ' ' OR sumfg = 'x' ).
      line_index = sy-tabix.
      stpov1-menge = p_menge * stpov1-menge.
      MODIFY list[] INDEX line_index FROM stpov1 TRANSPORTING menge.
    ENDLOOP.
    line_index = 0.
*change the status of the part as exploded
    MOVE exploded_flag TO t_stack-exploded.
    MODIFY stack[] FROM t_stack TRANSPORTING exploded.
*Explode the fetched parts..If FERT move to final itab
*If HALB then move to stack for further explosion
*Mean while compute the menge
    LOOP AT list[] INTO stpov1 WHERE ( sumfg = ' ' ) OR ( sumfg = 'x' ).
      SELECT prdha INTO (mara-prdha) FROM mara
        WHERE ( matnr EQ stpov1-matnr ) AND
              ( mtart EQ 'FERT' ) AND
              ( lvorm EQ space ).
        EXIT.
      ENDSELECT.
      IF ( sy-subrc EQ 0 ).
        MOVE p_partno TO t_store-matnr.
        MOVE stpov1-matnr TO t_store-pmatnr.
        MOVE stpov1-ojtxb TO t_store-maktx1.
        t_store-menge = stpov1-menge.
        MOVE stpov1-vwalt TO t_store-vwalt.  "Alternative BOM
        SELECT vtext INTO (t179t-vtext) FROM t179t
         WHERE ( prodh EQ mara-prdha ) AND
               ( spras EQ language ).
          EXIT.
        ENDSELECT.
        IF ( sy-subrc EQ 0 ).
          MOVE t179t-vtext TO t_store-vtext.
        ELSE.
          CLEAR t179t-vtext.
        ENDIF.
*collection Key is based on VWALT( ALTERNATIVE BOM INDICATOR )
        COLLECT t_store INTO store[].
        CLEAR t_store.
      ELSE.
*Next level push to the stack
        CLEAR mara-prdha.
        MOVE stpov1-vwalt TO t_stack-vwalt.  "ALternative BOM
        MOVE space TO t_stack-exploded.
        MOVE stpov1-matnr TO t_stack-matnr.
        t_stack-menge = stpov1-menge.
*Avoided append statement and used collect "Kesav-11.03.08
*Because the same material was found twice in the same level.so to sum
*up menge collect is used
*        APPEND t_stack TO stack[].
        COLLECT t_stack INTO stack[].
        CLEAR t_stack.
      ENDIF.
    ENDLOOP.
    REFRESH list[].
*Recursive process using stack values
  *bold*  LOOP AT stack[] INTO t_stack WHERE ( exploded EQ space ).
      PERFORM get_upper_level USING t_stack-matnr
                                    p_partno
                                    t_stack-menge
                                    t_stack-vwalt.
    ENDLOOP.

   IF ( sy-subrc NE 0 ).
      REFRESH stack[].
     CLEAR t_stack.
     EXIT.
   ENDIF.
*bold*
  ENDIF.
ENDFORM.                    " GET_UPPER_LEVEL
*&---------------------------------------------------------------------*
*&      Form  GET_CHILD_TEXTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_child_texts .
  SORT store BY matnr ASCENDING.
  LOOP AT store INTO t_store.
    line_index = sy-tabix.
    AT NEW matnr.
      SELECT maktx INTO (makt-maktx) FROM makt
       WHERE ( matnr = t_store-matnr ) AND
             ( spras = language ).
        EXIT.
      ENDSELECT.
      CHECK ( sy-subrc EQ 0 ).
      READ TABLE store INTO t_store INDEX line_index.
      IF ( sy-subrc EQ 0 ).
        MOVE makt-maktx TO t_store-maktx.
        MODIFY store FROM t_store TRANSPORTING maktx
                     WHERE ( matnr = t_store-matnr ).
        CLEAR makt.
      ENDIF.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " GET_CHILD_TEXTS
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_RESULT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_result .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = report_name
      is_layout          = wk_layout
      it_fieldcat        = fieldcat[]
      it_sort            = i_sort[]
    TABLES
      t_outtab           = store[].
ENDFORM.                    " DISPLAY_RESULT
*&---------------------------------------------------------------------*
*&      Form  FIELDCAT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0237   text
*      -->P_0238   text
*----------------------------------------------------------------------*
FORM fieldcat_build  USING    value(p_0237) TYPE any
                              value(p_0238) TYPE any
                              fieldpos TYPE any.
  alvfld-fieldname = p_0237.
  alvfld-seltext_m = p_0238.
  alvfld-col_pos = fieldpos.
  CASE p_0237.
    WHEN 'VWALT'.
      alvfld-no_zero = true.
    WHEN 'MATNR'.
      w_sort-spos      = fieldpos.
      w_sort-fieldname = p_0237.
      w_sort-up        = true.
      w_sort-subtot      = true.
      APPEND w_sort TO i_sort.
      CLEAR w_sort.
    WHEN 'MAKTX'.
      w_sort-spos      = fieldpos.
      w_sort-fieldname = p_0237.
      w_sort-down        = true.
      APPEND w_sort TO i_sort.
      CLEAR w_sort.
    WHEN 'MENGE'.
      alvfld-emphasize = 'C310'.
  ENDCASE.
  APPEND alvfld TO fieldcat.
  CLEAR alvfld.
ENDFORM.                    " FIELDCAT_BUILD
*&---------------------------------------------------------------------*
*&      Form  INIT_VALUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_values .
  CLEAR line_index.
  CLEAR total_entries.
  CLEAR stpov1.
  CLEAR t_stack.
  CLEAR t_store.
  CLEAR partno.
  REFRESH stack[].
  REFRESH equicat[].
  REFRESH kndcat[].
  REFRESH matcat[].
  REFRESH stdcat[].
  REFRESH tplcat[].
  REFRESH list[].
ENDFORM.                    " INIT_VALUES
*&---------------------------------------------------------------------*
*&      Form  ASSIGN_LAYOUT_VALUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM assign_layout_values .
  wk_layout-colwidth_optimize = true.
  wk_layout-zebra = true.
  wk_layout-no_vline = true.
  wk_layout-no_hline = true.
  CONCATENATE 'INVERSE BILL OF MATERIAL MATRIX EXPLOSION' '-' p_werks
  INTO wk_layout-window_titlebar SEPARATED BY space.
ENDFORM.                    " ASSIGN_LAYOUT_VALUES
*&---------------------------------------------------------------------*
*&      Form  VALIDATE_ENTRIES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM validate_entries .
  DESCRIBE TABLE so_matnr[] LINES total_entries.
  DO total_entries TIMES.
    line_index = sy-index.
    READ TABLE so_matnr INDEX line_index.
    CHECK ( sy-subrc EQ 0 ).
    MOVE so_matnr-low TO partno.
    SELECT mara~matnr INTO (mara-matnr)
        FROM mara INNER JOIN marc ON ( mara~matnr = marc~matnr )
        WHERE ( mara~matnr EQ partno ) AND
              ( mara~mtart EQ 'HALB' ) AND
              ( mara~lvorm EQ space )  AND
              ( marc~werks EQ p_werks ) AND
              ( marc~lvorm EQ space ).
      EXIT.
    ENDSELECT.
    CHECK ( sy-subrc NE 0 ).
    MESSAGE e983(zpp) WITH partno.
    EXIT.
  ENDDO.
ENDFORM.                    " VALIDATE_ENTRIES

7 REPLIES 7

Former Member
0 Kudos
279

Hi,

here the logic is wrong.

LOOP AT stack INTO t_stack.

IF stack[] IS INITIAL.

EXIT.

ENDIF.

PERFORM get_upper_level USING t_stack-matnr

partno

t_stack-menge

t_stack-vwalt.

ENDLOOP.

control will go inside the loop when the internal table stack is not initial.then immediately after entering into the loop u r exiting when the internal table stack is empty.so,no need of these statements.

rgds,

bharat.

0 Kudos
279

Oh..sorry that was included by me simply...earlier it didnt have that..

I have marked the exit statement to be executed....


REPORT  zpp475_inverse_bom_explosion NO STANDARD PAGE HEADING MESSAGE-ID
zpp.
 
 
TABLES:marc,
       makt,
       t179t,
       mara,
       stas.
DATA:stpov1 TYPE stpov.
 
DATA:BEGIN OF t_store,
matnr TYPE stpov-matnr,   "HALB Part
vwalt(2) TYPE c,          "Alternative BOM
pmatnr TYPE stpov-matnr,  "FERT Part
maktx TYPE stpov-ojtxb,   "Material Texts
maktx1 TYPE stpov-ojtxb,
menge TYPE p DECIMALS 0,  "Required Qty
vtext TYPE t179t-vtext,   "FERT Model
END OF t_store.
 
DATA:BEGIN OF t_stack,
vwalt(2) TYPE c,
matnr TYPE marc-matnr,
menge TYPE stpov-menge,
exploded TYPE c,
END OF t_stack.
 
DATA:store   LIKE STANDARD TABLE OF t_store INITIAL SIZE 0,
     stack   LIKE STANDARD TABLE OF t_stack INITIAL SIZE 0,
     list    LIKE STANDARD TABLE OF stpov1  INITIAL SIZE 0,
     equicat TYPE STANDARD TABLE OF cscequi INITIAL SIZE 0,
     kndcat  TYPE STANDARD TABLE OF cscknd  INITIAL SIZE 0,
     matcat  TYPE STANDARD TABLE OF cscmat  INITIAL SIZE 0,
     stdcat  TYPE STANDARD TABLE OF cscstd  INITIAL SIZE 0,
     tplcat  TYPE STANDARD TABLE OF csctpl  INITIAL SIZE 0.
 
DATA:partno TYPE marc-matnr.
DATA:validity_date TYPE sy-datum.
DATA:language TYPE sy-langu.
DATA:line_index TYPE sy-tabix.
DATA:total_entries TYPE sy-tfill.
DATA:report_name TYPE sy-repid.
DATA:exploded_flag(1) TYPE c VALUE 'X'.         "For Explosion Flag
DATA:initial_menge(1) TYPE p DECIMALS 0 VALUE 1."For Initial Push
DATA:alternative_bom(2) TYPE c VALUE '01'.      "For Initial Push
DATA:true(1) TYPE c.                            "True Check = 'X'
 
TYPE-POOLS:slis.
DATA:wk_layout TYPE slis_layout_alv,
alvfld TYPE slis_fieldcat_alv,
fieldcat TYPE STANDARD TABLE OF slis_fieldcat_alv INITIAL SIZE 0,
i_sort TYPE slis_t_sortinfo_alv,
w_sort LIKE LINE OF i_sort.
 
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001 NO
INTERVALS.
SELECT-OPTIONS:so_matnr FOR marc-matnr NO INTERVALS OBLIGATORY.
PARAMETERS:p_werks TYPE marc-werks OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
 
INITIALIZATION.
  validity_date = sy-datum.
  language = sy-langu.
  report_name = sy-repid.
  true = exploded_flag.
 
AT SELECTION-SCREEN.
  PERFORM validate_entries.
 
START-OF-SELECTION.
  LOOP AT so_matnr.
    PERFORM init_values.
*Initial push to stack
    MOVE so_matnr-low TO t_stack-matnr.
    t_stack-menge =  initial_menge.
    MOVE alternative_bom TO t_stack-vwalt.
    MOVE exploded_flag TO t_stack-exploded.
    APPEND t_stack TO stack.
    MOVE so_matnr-low TO partno.
*Process with initially pushed values
    LOOP AT stack INTO t_stack.
      IF stack[] IS INITIAL.
        EXIT.
      ENDIF.
      PERFORM get_upper_level USING t_stack-matnr
                                    partno
                                    t_stack-menge
                                    t_stack-vwalt.
    ENDLOOP.
  ENDLOOP.
  CHECK store[] IS NOT INITIAL.
  PERFORM get_child_texts.
  SORT store[] BY vwalt matnr ASCENDING.
  PERFORM assign_layout_values.
  REFRESH i_sort[].
  REFRESH fieldcat[].
  PERFORM fieldcat_build USING :'VWALT'  text-006 '1',
                                'MATNR'  text-002 '2',
                                'MAKTX'  text-003 '3',
                                'PMATNR' text-004 '4',
                                'MENGE'  text-005 '5',
                                'MAKTX1' text-008 '6',
                                'VTEXT'  text-007 '7'.
  PERFORM display_result.
*&---------------------------------------------------------------------*
*&      Form  GET_UPPER_LEVEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SO_MATNR_LOW  text
*----------------------------------------------------------------------*
FORM get_upper_level  USING    p_so_matnr_low TYPE any
                               p_partno TYPE marc-matnr
                               p_menge TYPE stpov-menge
                               p_vwalt TYPE c.
 
*GET THE NEXT UPPER LEVEL FOR THE PART
 
  CALL FUNCTION 'CS_WHERE_USED_MAT'
    EXPORTING
      datub                      = validity_date
      datuv                      = validity_date
      matnr                      = p_so_matnr_low
      werks                      = p_werks
    TABLES
      wultb                      = list[]
      equicat                    = equicat[]
      kndcat                     = kndcat[]
      matcat                     = matcat[]
      stdcat                     = stdcat[]
      tplcat                     = tplcat[]
    EXCEPTIONS
      call_invalid               = 1
      material_not_found         = 2
      no_where_used_rec_found    = 3
      no_where_used_rec_selected = 4
      no_where_used_rec_valid    = 5
      OTHERS                     = 6.
 
  IF ( sy-subrc NE 0 ).
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
 
  DESCRIBE TABLE list[] LINES total_entries.
  IF ( total_entries EQ 0 ).
*THERE IS NO NODE AFTER THE NODES SO ASSIGN IT AS EXPLODED
    MOVE exploded_flag TO t_stack-exploded.
    MODIFY stack[] FROM t_stack TRANSPORTING exploded.
  ELSE.
    total_entries = 0.
*CHECK THE PROCUREMENT TYPE FOR THE FETCHED PARTS..IF 'F' DELETE
**Procurement check Commented by Kesav -11.03.08
**If check needed remove the comment
*    LOOP AT list[] INTO stpov1.
*      line_index = sy-tabix.
*      SELECT beskz INTO (marc-beskz) FROM marc
*        WHERE matnr EQ stpov1-matnr
*        AND beskz EQ 'F'
*        AND lvorm EQ space.
*        EXIT.
*      ENDSELECT.
*      CHECK sy-subrc EQ 0.
*      DELETE list INDEX line_index.
*    ENDLOOP.
    line_index = 0.
*SUMFG check included "13.03.08
*WHERE EVER THE ALTERNATIVE BOM INDICATOR IS SPACE CHANGE IT AS '01'.
    LOOP AT list[] INTO stpov1 WHERE ( sumfg = ' ' OR sumfg = 'x' ).
      line_index = sy-tabix.
*Deletion check included "13.03.08
*Check the deletion indicator is true or false for a node
      SELECT lkenz INTO (stas-lkenz) FROM stas
      WHERE ( stlnr = stpov1-stlnr ) AND
            ( stlkn = stpov1-stlkn ) AND
            ( lkenz = true ).
        EXIT.
      ENDSELECT.
*If the part id active then process
      IF ( sy-subrc NE 0 ).
        CHECK ( stpov1-vwalt = space ).
        MOVE p_vwalt TO stpov1-vwalt.
        MODIFY list[] INDEX line_index FROM stpov1 TRANSPORTING vwalt.
      ELSE.
*delete that node from the internal table
        DELETE list[] INDEX line_index.
      ENDIF.
    ENDLOOP.
    line_index = 0.
*Compute the qty..Initially the stack holds menge as 1 & changes later
    LOOP AT list[] INTO stpov1 WHERE ( idnrk = p_so_matnr_low )
                               AND   ( sumfg = ' ' OR sumfg = 'x' ).
      line_index = sy-tabix.
      stpov1-menge = p_menge * stpov1-menge.
      MODIFY list[] INDEX line_index FROM stpov1 TRANSPORTING menge.
    ENDLOOP.
    line_index = 0.
*change the status of the part as exploded
    MOVE exploded_flag TO t_stack-exploded.
    MODIFY stack[] FROM t_stack TRANSPORTING exploded.
*Explode the fetched parts..If FERT move to final itab
*If HALB then move to stack for further explosion
*Mean while compute the menge
    LOOP AT list[] INTO stpov1 WHERE ( sumfg = ' ' ) OR ( sumfg = 'x' ).
      SELECT prdha INTO (mara-prdha) FROM mara
        WHERE ( matnr EQ stpov1-matnr ) AND
              ( mtart EQ 'FERT' ) AND
              ( lvorm EQ space ).
        EXIT.
      ENDSELECT.
      IF ( sy-subrc EQ 0 ).
        MOVE p_partno TO t_store-matnr.
        MOVE stpov1-matnr TO t_store-pmatnr.
        MOVE stpov1-ojtxb TO t_store-maktx1.
        t_store-menge = stpov1-menge.
        MOVE stpov1-vwalt TO t_store-vwalt.  "Alternative BOM
        SELECT vtext INTO (t179t-vtext) FROM t179t
         WHERE ( prodh EQ mara-prdha ) AND
               ( spras EQ language ).
          EXIT.
        ENDSELECT.
        IF ( sy-subrc EQ 0 ).
          MOVE t179t-vtext TO t_store-vtext.
        ELSE.
          CLEAR t179t-vtext.
        ENDIF.
*collection Key is based on VWALT( ALTERNATIVE BOM INDICATOR )
        COLLECT t_store INTO store[].
        CLEAR t_store.
      ELSE.
*Next level push to the stack
        CLEAR mara-prdha.
        MOVE stpov1-vwalt TO t_stack-vwalt.  "ALternative BOM
        MOVE space TO t_stack-exploded.
        MOVE stpov1-matnr TO t_stack-matnr.
        t_stack-menge = stpov1-menge.
*Avoided append statement and used collect "Kesav-11.03.08
*Because the same material was found twice in the same level.so to sum
*up menge collect is used
*        APPEND t_stack TO stack[].
        COLLECT t_stack INTO stack[].
        CLEAR t_stack.
      ENDIF.
    ENDLOOP.
    REFRESH list[].
*Recursive process using stack values
  *bold*  LOOP AT stack[] INTO t_stack WHERE ( exploded EQ space ).
      PERFORM get_upper_level USING t_stack-matnr
                                    p_partno
                                    t_stack-menge
                                    t_stack-vwalt.
    ENDLOOP.
**************************************************************************** 
{quote}  IF ( sy-subrc NE 0 ).
      REFRESH stack[].
     CLEAR t_stack.
     EXIT.
   ENDIF.
{quote}
****************************************************************************
*bold*
  ENDIF.
ENDFORM.                    " GET_UPPER_LEVEL
*&---------------------------------------------------------------------*
*&      Form  GET_CHILD_TEXTS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_child_texts .
  SORT store BY matnr ASCENDING.
  LOOP AT store INTO t_store.
    line_index = sy-tabix.
    AT NEW matnr.
      SELECT maktx INTO (makt-maktx) FROM makt
       WHERE ( matnr = t_store-matnr ) AND
             ( spras = language ).
        EXIT.
      ENDSELECT.
      CHECK ( sy-subrc EQ 0 ).
      READ TABLE store INTO t_store INDEX line_index.
      IF ( sy-subrc EQ 0 ).
        MOVE makt-maktx TO t_store-maktx.
        MODIFY store FROM t_store TRANSPORTING maktx
                     WHERE ( matnr = t_store-matnr ).
        CLEAR makt.
      ENDIF.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " GET_CHILD_TEXTS
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_RESULT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM display_result .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = report_name
      is_layout          = wk_layout
      it_fieldcat        = fieldcat[]
      it_sort            = i_sort[]
    TABLES
      t_outtab           = store[].
ENDFORM.                    " DISPLAY_RESULT
*&---------------------------------------------------------------------*
*&      Form  FIELDCAT_BUILD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0237   text
*      -->P_0238   text
*----------------------------------------------------------------------*
FORM fieldcat_build  USING    value(p_0237) TYPE any
                              value(p_0238) TYPE any
                              fieldpos TYPE any.
  alvfld-fieldname = p_0237.
  alvfld-seltext_m = p_0238.
  alvfld-col_pos = fieldpos.
  CASE p_0237.
    WHEN 'VWALT'.
      alvfld-no_zero = true.
    WHEN 'MATNR'.
      w_sort-spos      = fieldpos.
      w_sort-fieldname = p_0237.
      w_sort-up        = true.
      w_sort-subtot      = true.
      APPEND w_sort TO i_sort.
      CLEAR w_sort.
    WHEN 'MAKTX'.
      w_sort-spos      = fieldpos.
      w_sort-fieldname = p_0237.
      w_sort-down        = true.
      APPEND w_sort TO i_sort.
      CLEAR w_sort.
    WHEN 'MENGE'.
      alvfld-emphasize = 'C310'.
  ENDCASE.
  APPEND alvfld TO fieldcat.
  CLEAR alvfld.
ENDFORM.                    " FIELDCAT_BUILD
*&---------------------------------------------------------------------*
*&      Form  INIT_VALUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM init_values .
  CLEAR line_index.
  CLEAR total_entries.
  CLEAR stpov1.
  CLEAR t_stack.
  CLEAR t_store.
  CLEAR partno.
  REFRESH stack[].
  REFRESH equicat[].
  REFRESH kndcat[].
  REFRESH matcat[].
  REFRESH stdcat[].
  REFRESH tplcat[].
  REFRESH list[].
ENDFORM.                    " INIT_VALUES
*&---------------------------------------------------------------------*
*&      Form  ASSIGN_LAYOUT_VALUES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM assign_layout_values .
  wk_layout-colwidth_optimize = true.
  wk_layout-zebra = true.
  wk_layout-no_vline = true.
  wk_layout-no_hline = true.
  CONCATENATE 'INVERSE BILL OF MATERIAL MATRIX EXPLOSION' '-' p_werks
  INTO wk_layout-window_titlebar SEPARATED BY space.
ENDFORM.                    " ASSIGN_LAYOUT_VALUES
*&---------------------------------------------------------------------*
*&      Form  VALIDATE_ENTRIES
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM validate_entries .
  DESCRIBE TABLE so_matnr[] LINES total_entries.
  DO total_entries TIMES.
    line_index = sy-index.
    READ TABLE so_matnr INDEX line_index.
    CHECK ( sy-subrc EQ 0 ).
    MOVE so_matnr-low TO partno.
    SELECT mara~matnr INTO (mara-matnr)
        FROM mara INNER JOIN marc ON ( mara~matnr = marc~matnr )
        WHERE ( mara~matnr EQ partno ) AND
              ( mara~mtart EQ 'HALB' ) AND
              ( mara~lvorm EQ space )  AND
              ( marc~werks EQ p_werks ) AND
              ( marc~lvorm EQ space ).
      EXIT.
    ENDSELECT.
    CHECK ( sy-subrc NE 0 ).
    MESSAGE e983(zpp) WITH partno.
    EXIT.
  ENDDO.
ENDFORM.                    " VALIDATE_ENTRIES

0 Kudos
279

Hi,

Instead of exit use stop to come outside loop.

stop takes u out of the loop where as exit stops current one but processes from next one

Regards

0 Kudos
279

stop. completely terminates...

i need the cursor to move to the first loop in start-of-selection..

0 Kudos
279

yes it comes out of second loop statement and comes to first loop

Former Member
0 Kudos
279

hi,

u r writing exit statements in the select statement like this.

loop..

select ...

exit.

endselect.

endloop.

in this case it will exit only from the select statement.if u want to go out of the loop also write like this.

loop..

select single...

if sy-subrc = 0.

exit.

endif.

endloop.

rgds,

bharat.

JozsefSzikszai
Active Contributor
0 Kudos
279

hi Keshu,

I think you have to create a variable (type i) and set it to 1, when you want to exit, than in each LOOP step and subroutine, you have to check the variable (CHECK variable EQ 0), than it will take you back to the original LOOP (where you have to initialize its value)

hope this helps

ec