BOM alv report / change number solution
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
Good Job, Keep Blogging 🙂
Thanks swadhin ghatuary .