2008 Mar 17 7:34 AM
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
2008 Mar 17 7:42 AM
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.
2008 Mar 17 8:10 AM
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
2008 Mar 17 8:14 AM
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
2008 Mar 17 8:18 AM
stop. completely terminates...
i need the cursor to move to the first loop in start-of-selection..
2008 Mar 17 8:27 AM
yes it comes out of second loop statement and comes to first loop
2008 Mar 17 7:47 AM
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.
2008 Mar 17 8:26 AM
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