07-15-2013 7:29 AM
i) Call CS_BOM_EXPL_MAT_V2 passing CAPID = ‘PP01’, DATUV = <sy-datum>,
MEHRS = ‘X‘, MTNRV = IT_FILE–MATNR, STLAL = IT_FILE-STLAL, STLAN = ‘1’and WERKS = P_WERKS
ii) Get the appropriate fields from GT_SUB and append to IT_BOM (append IDNRK as MATNR)
2) Get the level for each Material and Serial:
a) Sort IT_BOM on ZZSERNR_LO and INDEX
b) Loop on IT_BOM and increment STUFE by 1 for all records
c) Loop on IT_BOM and assign levels as shown below:
ZZSERNR_LO MATNR STUFE LEVEL
6001 A 1 1
6001 A01 2 1.1
6001 A02 2 1.2
6001 A03 3 1.2.1
6001 A04 3 1.2.2
6001 A05 4 1.2.2.1
6001 A06 4 1.2.2.2
6001 A07 2 1.3
6001 A08 2 1.4
6001 A09 3 1.4.1
6001 A10 4 1.4.1.1
6001 A11 4 1.4.1.2
6001 A12 4 1.4.1.3
6001 A13 5 1.4.1.3.1
6001 A14 5 1.4.1.3.2
07-15-2013 6:56 PM
Hi, try this
REPORT ytest.
TYPES: BEGIN OF ty_bom,
zzsernr_lo TYPE char4,
matnr TYPE mara-matnr,
stufe TYPE stpox-stufe,
level TYPE string,
END OF ty_bom.
TYPES: BEGIN OF ty_level,
stufe TYPE stpox-stufe,
level TYPE string,
cont TYPE i,
END OF ty_level.
DATA: it_bom TYPE TABLE OF ty_bom,
it_level TYPE TABLE OF ty_level,
l_stufe TYPE stpox-stufe,
l_level TYPE string,
l_cont TYPE char10.
FIELD-SYMBOLS: <fs_bom> TYPE ty_bom,
<fs_level> TYPE ty_level.
START-OF-SELECTION.
* Fill data to build level
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A'.
<fs_bom>-stufe = 1.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A01'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A02'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A03'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A04'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A05'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A06'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A07'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A08'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A09'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A10'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A11'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A12'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A13'.
<fs_bom>-stufe = 5.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A14'.
<fs_bom>-stufe = 5.
* Sort internal table (Important)
*SORT it_bom BY zzsernr_lo index.
* Assign level
LOOP AT it_bom ASSIGNING <fs_bom>.
AT NEW zzsernr_lo. "-> New Serie
CLEAR: l_stufe, l_level, it_level.
ENDAT.
IF l_stufe IS INITIAL.
APPEND INITIAL LINE TO it_level ASSIGNING <fs_level>.
<fs_level>-stufe = <fs_bom>-stufe.
* Assign Level initial
<fs_level>-level = '1'.
<fs_level>-cont = 1.
ELSE.
IF l_stufe > <fs_bom>-stufe.
* Delete upper levels
DELETE it_level WHERE stufe > <fs_bom>-stufe.
ENDIF.
* Get previous level
l_stufe = <fs_bom>-stufe - 1.
* Get previous level
READ TABLE it_level ASSIGNING <fs_level> WITH KEY stufe = l_stufe.
IF sy-subrc = 0.
l_level = <fs_level>-level.
* Add or modify level
READ TABLE it_level ASSIGNING <fs_level> WITH KEY stufe = <fs_bom>-stufe.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO it_level ASSIGNING <fs_level>.
ENDIF.
* Assign values
<fs_level>-stufe = <fs_bom>-stufe.
<fs_level>-cont = <fs_level>-cont + 1.
l_cont = <fs_level>-cont.
CONDENSE l_cont NO-GAPS.
CONCATENATE l_level '.' l_cont INTO l_level.
<fs_level>-level = l_level.
ENDIF.
ENDIF.
* Assign current level
l_stufe = <fs_bom>-stufe.
* Assign level
<fs_bom>-level = <fs_level>-level.
* See results
WRITE: / <fs_bom>-zzsernr_lo, <fs_bom>-matnr, <fs_bom>-stufe, <fs_bom>-level.
ENDLOOP.
I hope this help you
Regards.
DCC
07-15-2013 6:56 PM
Hi, try this
REPORT ytest.
TYPES: BEGIN OF ty_bom,
zzsernr_lo TYPE char4,
matnr TYPE mara-matnr,
stufe TYPE stpox-stufe,
level TYPE string,
END OF ty_bom.
TYPES: BEGIN OF ty_level,
stufe TYPE stpox-stufe,
level TYPE string,
cont TYPE i,
END OF ty_level.
DATA: it_bom TYPE TABLE OF ty_bom,
it_level TYPE TABLE OF ty_level,
l_stufe TYPE stpox-stufe,
l_level TYPE string,
l_cont TYPE char10.
FIELD-SYMBOLS: <fs_bom> TYPE ty_bom,
<fs_level> TYPE ty_level.
START-OF-SELECTION.
* Fill data to build level
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A'.
<fs_bom>-stufe = 1.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A01'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A02'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A03'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A04'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A05'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A06'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A07'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A08'.
<fs_bom>-stufe = 2.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A09'.
<fs_bom>-stufe = 3.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A10'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A11'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A12'.
<fs_bom>-stufe = 4.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A13'.
<fs_bom>-stufe = 5.
APPEND INITIAL LINE TO it_bom ASSIGNING <fs_bom>.
<fs_bom>-zzsernr_lo = '6001'. <fs_bom>-matnr = 'A14'.
<fs_bom>-stufe = 5.
* Sort internal table (Important)
*SORT it_bom BY zzsernr_lo index.
* Assign level
LOOP AT it_bom ASSIGNING <fs_bom>.
AT NEW zzsernr_lo. "-> New Serie
CLEAR: l_stufe, l_level, it_level.
ENDAT.
IF l_stufe IS INITIAL.
APPEND INITIAL LINE TO it_level ASSIGNING <fs_level>.
<fs_level>-stufe = <fs_bom>-stufe.
* Assign Level initial
<fs_level>-level = '1'.
<fs_level>-cont = 1.
ELSE.
IF l_stufe > <fs_bom>-stufe.
* Delete upper levels
DELETE it_level WHERE stufe > <fs_bom>-stufe.
ENDIF.
* Get previous level
l_stufe = <fs_bom>-stufe - 1.
* Get previous level
READ TABLE it_level ASSIGNING <fs_level> WITH KEY stufe = l_stufe.
IF sy-subrc = 0.
l_level = <fs_level>-level.
* Add or modify level
READ TABLE it_level ASSIGNING <fs_level> WITH KEY stufe = <fs_bom>-stufe.
IF sy-subrc <> 0.
APPEND INITIAL LINE TO it_level ASSIGNING <fs_level>.
ENDIF.
* Assign values
<fs_level>-stufe = <fs_bom>-stufe.
<fs_level>-cont = <fs_level>-cont + 1.
l_cont = <fs_level>-cont.
CONDENSE l_cont NO-GAPS.
CONCATENATE l_level '.' l_cont INTO l_level.
<fs_level>-level = l_level.
ENDIF.
ENDIF.
* Assign current level
l_stufe = <fs_bom>-stufe.
* Assign level
<fs_bom>-level = <fs_level>-level.
* See results
WRITE: / <fs_bom>-zzsernr_lo, <fs_bom>-matnr, <fs_bom>-stufe, <fs_bom>-level.
ENDLOOP.
I hope this help you
Regards.
DCC
07-18-2013 10:01 AM
Hi David,
Thanks for the program
i dont want to hard code the values as the levels can be extended further.
07-18-2013 4:45 PM
Hi Ajay, I've put hard code values to replicate your scenario, but I think that the code works with any level in BOM
Regards
David Carballido
07-19-2013 11:25 AM
Hi Ajay,
I also earlier faced this type of requirement. For multiple BOM Explosion we have one function module is available, that is
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = c_capid
datuv = sy-datum
mehrs = c_mehrs
mtnrv = <fs_file>-matnr
stlal = <fs_file>-stlal
stlan = c_stlan
werks = p_werks
IMPORTING
topmat = wa_topmat
dstst = wa_dstst
TABLES
stb = gt_sub
matcat = gt_matcat
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found =3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.
IF sy-subrc EQ 0.
Now you got all the fields data in gt_sub. In this gt_sub STUFE field is there.That is depth. so by using this we have to populate the levels in the alv .
SORT gt_bom BYmatnr stufe .
LOOP AT gt_bom ASSIGNING <fs_bom>.
IF <fs_bom>-stufe EQ 1.
MOVE : c_one TO <fs_bom>-level ,
<fs_bom>-stufe TO lv_stufe,
<fs_bom>-level TO lv_level.
ELSE.
IF <fs_bom>-stufe > lv_stufe.
CONCATENATE lv_level c_dot c_one
INTO <fs_bom>-level.
MOVE: <fs_bom>-stufe TO lv_stufe ,
<fs_bom>-level TO lv_level.
ELSEIF <fs_bom>-stufe = lv_stufe.
SHIFT lv_level RIGHT DELETING TRAILING space.
MOVE : lv_level+19(1) TO lv_next.
lv_next = lv_next + 1 .
CONCATENATE lv_level+0(18) c_dot lv_next
INTO <fs_bom>-level.
SHIFT <fs_bom>-level LEFT DELETING LEADING space.
MOVE :<fs_bom>-stufe TO lv_stufe ,
<fs_bom>-level TO lv_level.
ENDIF.
ENDIF.
ENDLOOP.
that's it. just try it. If any thing is required let me know. If it is help ful give me the points.
Regards
Raju
07-22-2013 6:41 AM
07-19-2013 11:27 AM
07-19-2013 2:29 PM
Hi Ajay,
I wrote this blog for your question : http://scn.sap.com/community/abap/blog/2013/07/19/level-assignment-dynamicaly-oo-example
Regards
Tolga POLAT
Message was edited by: Tolga POLAT
07-22-2013 6:40 AM