Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member183155
Active Contributor

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.

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

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.

   Regards.

   M.Ozgur Unal

2 Comments