In this document ;  Bill of material list report developed with alv concept to run all of materials which are listed by users. The most important trick is a solution of dublicate records in BOM tables so change number records.

For example : In belowed printscreen that you can see STPO table.

If you read STPO table without a restriction , you will get 2 rows for PY200005 Bom item material.

1.JPG

If you do not benefit change number functionality , you can join tables like belowed and it can be used to list BOMs.

2.JPG

But , change number functionality cause additional records in STPO and other related PP tables.

To solve this problem , you can benefit belowed alv report.

This report provides last record of changing component with change number.

Go to SE38 , add this code and list results.



*&---------------------------------------------------------------------*
*& Report  ZPP_BILL_OF_MATERIAL
*&
*&---------------------------------------------------------------------*
*& M.Ozgur Unal ------ 04.11.2014
*& Ürün ağaçları listeleme raporudur.
*& özgü 🙂
*&---------------------------------------------------------------------*

REPORT  ZPP_BILL_OF_MATERIAL.

TYPE-POOLS : slis.
CONSTANTS : c_tcode(4) TYPE c VALUE 'CS03'.
TABLES : mast , stko , stpo , stas , makt , mara .

*************************
* DATA TYPES DEFINITIONS*
*************************

DATA: BEGIN OF it_mast OCCURS 0 ,
          matnr  LIKE mast-matnr,
          werks  LIKE mast-werks,
          stlan  LIKE mast-stlan,
          stlnr  LIKE mast-stlnr,
          stlal  LIKE mast-stlal,
          maktx  LIKE makt-maktx,
          matkl  LIKE mara-matkl,
       END OF it_mast.

DATA : BEGIN OF it_stko OCCURS 0,
          stlnr LIKE stko-stlnr,
          stlal LIKE stko-stlal,
          datuv LIKE stko-datuv,
          bmein LIKE stko-bmein,
          bmeng LIKE stko-bmeng,
          stlst LIKE stko-stlst,
        END OF it_stko.

DATA : BEGIN OF it_stpo OCCURS 0,
          stlnr LIKE stpo-stlnr,
          stlkn LIKE stpo-stlkn,
          datuv LIKE stpo-datuv,
          idnrk LIKE stpo-idnrk,
          meins LIKE stpo-meins,
          menge LIKE stpo-menge,
          aennr LIKE stpo-aennr,
          andat LIKE stpo-andat,
          annam LIKE stpo-annam,
          aenam LIKE stpo-aenam,
          posnr LIKE stpo-posnr,
          maktx LIKE makt-maktx,
          vgknt LIKE stpo-vgknt,
          stvkn LIKE stpo-stvkn,
          stpoz LIKE stpo-stpoz,
          vgpzl LIKE stpo-vgpzl,
          matkl LIKE mara-matkl,
        END OF it_stpo.

DATA : BEGIN OF it_stas OCCURS 0,
          stlnr LIKE stas-stlnr,
          stlal LIKE stas-stlal,
          stlkn LIKE stas-stlkn,
          aennr LIKE stas-aennr,
          lkenz LIKE stas-lkenz,
          stvkn LIKE stas-stvkn,
        END OF it_stas.

DATA : BEGIN OF it_final OCCURS 0,
          matnr LIKE mast-matnr,
          werks LIKE mast-werks,
          stlan LIKE mast-stlan,
          stlnr LIKE mast-stlnr,
          stlal LIKE mast-stlal,
          datuv LIKE stko-datuv,
          bmein LIKE stko-bmein,
          bmeng LIKE stko-bmeng,
          idnrk LIKE stpo-idnrk,
          posnr LIKE stpo-posnr,
          meins LIKE stpo-meins,
          menge LIKE stpo-menge,
          maktx LIKE makt-maktx,
          aennr LIKE stpo-aennr,
          andat LIKE stpo-andat,
          annam LIKE stpo-annam,
          aenam LIKE stpo-aenam,
          matkl LIKE mara-matkl,
          stlst LIKE stko-stlst,
          lkenz LIKE stas-lkenz,
         maktx2 LIKE makt-maktx,
          stvkn LIKE stas-stvkn,
          vgknt LIKE stpo-vgknt,
          stlkn LIKE stpo-stlkn,
         stvkn2 LIKE stpo-stvkn,
          stpoz LIKE stpo-stpoz,
          vgpzl LIKE stpo-vgpzl,
         matkl2 LIKE mara-matkl,
  END OF it_final.


DATA : wa_mast LIKE LINE OF it_mast.
DATA : wa_stko LIKE LINE OF it_stko.
DATA : wa_stpo LIKE LINE OF it_stpo,
       wa_stas LIKE LINE OF it_stas,
       gw_final LIKE LINE OF it_final,
       gw_final2 LIKE LINE OF it_final,
       gt_fcat  TYPE slis_t_fieldcat_alv,
       gw_fcat  TYPE slis_fieldcat_alv.


******************
*SELECTION SCREEN*
******************

SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.

SELECT-OPTIONS: s_matnr FOR  mast-matnr,
                s_matkl FOR  mara-matkl.
PARAMETERS p_werks TYPE mast-werks OBLIGATORY DEFAULT 1006.

SELECTION-SCREEN END OF BLOCK blk.

*******************************
*GET DATA & INSERT TO GT_FINAL*
*******************************

PERFORM get_data.

PERFORM loop_data.


IF it_final[] IS NOT INITIAL.

  PERFORM f_fill_fcat .
  PERFORM f_display_alv .

ELSE .
  MESSAGE 'Veri bulunamadı' TYPE 'I'.
ENDIF.

PERFORM plant_validation.

*&---------------------------------------------------------------------*
*&      Form  FETCH_DATA_RETREIVE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .

" break ounal.

  SELECT mast~matnr mast~werks mast~stlan mast~stlnr mast~stlal
         makt~maktx mara~matkl

           INTO CORRESPONDING FIELDS OF TABLE it_mast
           FROM mast
           INNER JOIN makt
           ON mast~matnr = makt~matnr
           INNER JOIN mara
           ON makt~matnr = mara~matnr
           WHERE  mast~matnr IN s_matnr
                AND mast~werks = p_werks
                AND mast~stlan = '1'
                AND mara~matkl IN s_matkl.

  IF LINES( it_mast ) GT 0.
    SELECT stlnr stlal datuv bmein bmeng
           aennr andat annam  aenam stlst
           FROM stko
           INTO CORRESPONDING FIELDS OF TABLE it_stko
           FOR ALL ENTRIES IN it_mast
           WHERE stlnr = it_mast-stlnr AND
                 stlal = it_mast-stlal.

    SORT it_stko BY datuv DESCENDING.

    SELECT stlnr stlal stlkn lkenz aennr stvkn
           FROM stas INTO CORRESPONDING FIELDS OF TABLE it_stas
           FOR ALL ENTRIES IN it_mast
           WHERE stlnr = it_mast-stlnr AND
                 stlal = it_mast-stlal.

    SORT it_stas BY lkenz DESCENDING.

  ENDIF.

*20.11.2014 - M.Ozgur Unal
*Üretim tarafından bileşenlerin mal grubu eklenmesi talebi ile
*revize edildi.

IF LINES( it_stko ) GT 0.
    SELECT stpo~stlnr stpo~stlkn stpo~datuv stpo~idnrk
           stpo~posnr stpo~meins stpo~menge stpo~aennr
           stpo~andat stpo~annam stpo~aenam stpo~posnr
           makt~maktx stpo~vgknt stpo~stvkn stpo~stpoz
           stpo~vgpzl mara~matkl
           FROM stpo
           INNER JOIN makt
           ON stpo~idnrk = makt~matnr
           INNER JOIN mara
           ON makt~matnr = mara~matnr
           INTO CORRESPONDING FIELDS OF TABLE it_stpo
           FOR ALL ENTRIES IN it_mast
           WHERE stlnr = it_mast-stlnr.

  ENDIF.

ENDFORM.                    " FETCH_DATA_RETREIVE



*&---------------------------------------------------------------------*
*&      Form  LOOP_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM loop_data .

  REFRESH it_final.

  LOOP AT it_mast INTO wa_mast.

    LOOP AT it_stpo INTO wa_stpo WHERE stlnr = wa_mast-stlnr.

       IF sy-subrc = 0.
        MOVE: wa_mast-matnr TO gw_final-matnr,
              wa_mast-stlnr TO gw_final-stlnr,
              wa_mast-werks TO gw_final-werks,
              wa_mast-stlal TO gw_final-stlal,
              wa_mast-stlan TO gw_final-stlan,
              wa_mast-matkl TO gw_final-matkl,
              wa_mast-maktx TO gw_final-maktx2,
              wa_stpo-matkl TO gw_final-matkl2,
              wa_stpo-idnrk TO gw_final-idnrk,
              wa_stpo-menge TO gw_final-menge,
              wa_stpo-aennr TO gw_final-aennr,
              wa_stpo-andat TO gw_final-andat,
              wa_stpo-annam TO gw_final-annam,
              wa_stpo-aenam TO gw_final-aenam,
              wa_stpo-posnr TO gw_final-posnr,
              wa_stpo-meins TO gw_final-meins,
              wa_stpo-maktx TO gw_final-maktx,
              wa_stpo-datuv TO gw_final-datuv,
              wa_stpo-stlkn TO gw_final-stlkn,
              wa_stpo-vgknt TO gw_final-vgknt,
              wa_stpo-stvkn TO gw_final-stvkn2,
              wa_stpo-stpoz TO gw_final-stpoz,
              wa_stpo-vgpzl TO gw_final-vgpzl.

      READ TABLE it_stko INTO wa_stko WITH KEY stlnr = wa_mast-stlnr
                                               stlal = wa_mast-stlal.


      IF sy-subrc = 0.
        MOVE: wa_stko-stlst TO gw_final-stlst,
              wa_stko-bmein TO gw_final-bmein,
              wa_stko-bmeng TO gw_final-bmeng.

     ENDIF.
    ENDIF.

      READ TABLE it_stas INTO wa_stas WITH KEY stlnr = wa_stpo-stlnr
                                              " stlkn = wa_stpo-stlkn
                                               stvkn = wa_stpo-stvkn.

      MOVE: wa_stas-stvkn  TO gw_final-stvkn,
            wa_stas-lkenz  TO gw_final-lkenz.

   APPEND gw_final TO it_final.
   CLEAR gw_final.

     ENDLOOP.
   ENDLOOP.

*add by ounal.
*Silinip yerine değişiklik no ile atama yapılan kalemlerin ürün
*ağaçlarında standart dışında eski düğüm ve eski sayaç no yu
*kullanarak atama yapıyoruz.

FIELD-SYMBOLS: <fs_it_final> LIKE LINE OF it_final,
               <fs_it_final2> LIKE LINE OF it_final.

SORT it_final BY stlnr stlkn ASCENDING.
  IF LINES( it_final ) NE 0.
   LOOP AT it_final ASSIGNING <fs_it_final>.
     LOOP AT it_final ASSIGNING <fs_it_final2>.
    IF <fs_it_final> IS ASSIGNED.
     IF <fs_it_final2> IS ASSIGNED.
      IF <fs_it_final>-stlnr = <fs_it_final2>-stlnr AND
         <fs_it_final>-stlkn = <fs_it_final2>-vgknt AND
         <fs_it_final>-stpoz = <fs_it_final2>-vgpzl.

         <fs_it_final>-idnrk = <fs_it_final2>-idnrk.
         <fs_it_final>-menge = <fs_it_final2>-menge.
         <fs_it_final>-aennr = <fs_it_final2>-aennr.
         <fs_it_final>-matkl2 = <fs_it_final2>-matkl2.
         <fs_it_final>-lkenz = ''.

      ENDIF.
     ENDIF.
     ENDIF.
    ENDLOOP.
   ENDLOOP.
  ENDIF.

ENDFORM.                    " LOOP_DATA

*&---------------------------------------------------------------------*
*&      Form  f_fill_fcat
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_fill_fcat .

  gw_fcat-col_pos = 1.
  gw_fcat-fieldname = 'WERKS'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Üretim yeri'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.


  gw_fcat-col_pos = 2.
  gw_fcat-fieldname = 'STLNR'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Ürün ağacı no.'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 3.
  gw_fcat-fieldname = 'STLAL'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Alternatif bom'.
*   gw_fcat-do_sum = 'X'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 4.
  gw_fcat-fieldname = 'MATNR'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Malzeme No.'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.


  gw_fcat-col_pos = 5.
  gw_fcat-fieldname = 'MAKTX2'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Kısa metin'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 6.
  gw_fcat-fieldname = 'IDNRK'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Bileşen'.
  gw_fcat-outputlen  = 10.
*  gw_fcat-emphasize   = 'X'.
*  gw_fcat-key         = 'X'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 7.
  gw_fcat-fieldname = 'POSNR'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Kalem no'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 8.
  gw_fcat-fieldname = 'BMENG'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Temel miktar'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 9.
  gw_fcat-fieldname = 'MENGE'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Bileşen miktarı'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 10.
  gw_fcat-fieldname = 'AENAM'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Değiştiren'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 11.
  gw_fcat-fieldname = 'MATKL'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Mal grubu'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 12.
  gw_fcat-fieldname = 'AENNR'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Değişiklik no'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 13.
  gw_fcat-fieldname = 'ANDAT'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Kayıt tarihi'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 14.
  gw_fcat-fieldname = 'ANNAM'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Kaydeden'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 15.
  gw_fcat-fieldname = 'DATUV'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Geçerlilik başı'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 16.
  gw_fcat-fieldname = 'STLST'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Statü'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 17.
  gw_fcat-fieldname = 'BMEIN'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Temel ölçü'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 18.
  gw_fcat-fieldname = 'MEINS'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Bileşen ölçü'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 19.
  gw_fcat-fieldname = 'MAKTX'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Bileşen metni'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 20.
  gw_fcat-fieldname = 'LKENZ'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Silme'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 21.
  gw_fcat-fieldname = 'STVKN'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Düğüm as'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 22.
  gw_fcat-fieldname = 'VGKNT'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Önceki düğüm'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 23.
  gw_fcat-fieldname = 'STVKN2'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Düğüm po'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 24.
  gw_fcat-fieldname = 'STLKN'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Düğüm'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 25.
  gw_fcat-fieldname = 'STPOZ'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Dahili sayaç'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 26.
  gw_fcat-fieldname = 'VGPZL'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Eski sayaç'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

  gw_fcat-col_pos = 27.
  gw_fcat-fieldname = 'MATKL2'.
  gw_fcat-tabname = 'IT_FINAL'.
  gw_fcat-seltext_m = 'Bileşen mal grubu'.
  APPEND gw_fcat TO gt_fcat.
  CLEAR gw_fcat.

ENDFORM.                    "f_fill_fcat

*&---------------------------------------------------------------------*
*&      Form  f_display_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_display_alv .
  DATA:lv_repid TYPE sy-repid.
  lv_repid = sy-cprog.

  DATA: w_layout TYPE slis_layout_alv.
  w_layout-colwidth_optimize = 'X'.
  w_layout-zebra = 'X'.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
     EXPORTING

       i_callback_program     = sy-cprog
       is_layout              = w_layout
       i_callback_user_command = 'USER_COMMAND'
       it_fieldcat            = gt_fcat[]
       i_default              = 'X'
       i_save                 = 'A'
     TABLES
       t_outtab               = it_final
     EXCEPTIONS
       program_error          = 1
       OTHERS                 = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    "f_display_alv
*&---------------------------------------------------------------------*
*&      Form  PLANT_VALIDATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM plant_validation .
  DATA : lv_plant TYPE mast-werks.
  SELECT SINGLE werks
         FROM mast
        INTO  lv_plant
    WHERE werks = p_werks.

  IF sy-subrc NE 0.
    MESSAGE 'Üretim yerini kontrol ediniz' TYPE 'I'.
    RETURN.
  ENDIF.
ENDFORM.                    "PLANT_VALIDATION



*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE
slis_selfield.

  IF r_ucomm = '&IC1'.

    READ TABLE it_final INTO gw_final INDEX rs_selfield-tabindex.

    rs_selfield-value = gw_final-matnr.

    SET PARAMETER ID 'MAT' FIELD rs_selfield-value.
    CALL TRANSACTION 'CS03' AND SKIP FIRST SCREEN.

  ENDIF.

ENDFORM.                    "user_command

   Finally , you can get this list.

3.JPG

   Regards.

   M.Ozgur Unal

To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

Leave a Reply