Application Development 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: 

Assign levels dynamically as shown in the below table

Former Member
0 Kudos

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

1 ACCEPTED SOLUTION

david_carballido
Active Participant
0 Kudos

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

8 REPLIES 8

david_carballido
Active Participant
0 Kudos

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

0 Kudos

Hi David,

Thanks for the program

i dont want to hard code the values as the levels can be extended further. 

0 Kudos

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

Former Member
0 Kudos

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

0 Kudos

Hi Lova

Thanks

Regards

Ajay Krishna

Former Member
0 Kudos

Hi David,

Thanks 

Got the solution.

tolga_polat
Active Participant
0 Kudos

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

0 Kudos

Hi Tolga POLAT

Thanks for the Blog.

Regards

Ajay Krishna