Application Development and Automation 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: 
Read only

How about this implementation of BOM Explosion(simulate stack)

Former Member
0 Likes
608

REPORT YZWX00301_06 LINE-SIZE 142

LINE-COUNT 65

MESSAGE-ID YM1

NO STANDARD PAGE HEADING .

*----


  • INCLUDE

*----


INCLUDE: YXXI00050.

*----


*TABLES use table define

*----


TABLES: MARA, " Material General Table

MARC, " Plant Data for Material

MDMA, " MRP Area table

EORD, " Vendor table

A018, " Vendor material mapping table

KONP, " Vendor condition table

MAST, " Material BOM table

STPO, " Material BOM Component table

STAS. " Material BOM Component table detail

*----


*CONSTANTS define

*----


CONSTANTS:

C_DAT_X TYPE C VALUE 'X',

C_MODE LIKE dxfields-fileoper VALUE 'R',

C_MASK LIKE dxfields-filemask VALUE '.',

C_FLG_LOCATION TYPE C VALUE 'A',

C_DFPATH(15) TYPE C VALUE '\bmwx\'.

*----


  • Work Area Define

*----


---- build stack structure -


DATA: BEGIN OF WK_STACK,

LEVEL(1) TYPE C, "Save Level

QUANT TYPE I, "Save Quantity

END OF WK_STACK.

---- BOM work area -


DATA: BEGIN OF WK_BOM,

LEVEL(1) TYPE C, "BOM LEVEL

MATNR LIKE MARC-MATNR, "MATERIAL 18

POSTP LIKE STPO-POSTP, "ITEM CATEGORY 1

MENGE LIKE STPO-MENGE, "BOM COMPONENT 13

DATUV LIKE STPO-DATUV, "VALID FROM 10

DATUB LIKE STPO-DATUV, "VALID TO 10

END OF WK_BOM.

---- DATA work area -


DATA: BEGIN OF DATAITEM,

LEVEL(1) TYPE C, "BOM LEVEL

MATNR LIKE MARC-MATNR, "MATERIAL

POSTP LIKE STPO-POSTP, "ITEM CATEGORY

MENGE LIKE STPO-MENGE, "BOM COMPONENT

DATUV LIKE STPO-DATUV, "VALID FROM!!!

DATUB LIKE STPO-DATUV, "VALID TO

EKGRP LIKE MARC-EKGRP, "PURCHASE ORG

LIFNR LIKE EORD-LIFNR, "Vendor code 10

MARK(1) TYPE C, "Mark

KBETR LIKE KONP-KBETR, "Rate price 11

KONWA LIKE KONP-KONWA, "Currency 5

KPEIN LIKE KONP-KPEIN, "Unit Qty 5

KMEIN LIKE KONP-KMEIN, "Condition Unit 3

DATAB LIKE A018-DATAB, "Condition from 10

DATBI LIKE A018-DATBI, "Condition to 10

END OF DATAITEM.

---- File Line work area -


DATA: BEGIN OF LINE,

WERKS(4) TYPE C, "Plaint 4

MATNR(18) TYPE C, "Material Number 18

EKGRP(3) TYPE C, "Purchase Group 3

LIFNR(10) TYPE C, "Vendor code 10

VDATU LIKE EORD-VDATU, "Vendor valid from 10

BDATU LIKE EORD-BDATU, "Vendor valid to 10

MARK(1) TYPE C, "Mark

KSCHL(4) TYPE C, "Condition type 4

KBETR(18) TYPE C, "Rate price 11

KPEIN(5) TYPE C, "Rate unit 5

KONWA(5) TYPE C, "Currency 5

KMEIN(3) TYPE C, "Condition Unit 3

DATAB LIKE A018-DATAB, "Condition from 10

DATBI LIKE A018-DATBI, "Condition to 10

END OF LINE.

*----


*Local Data Object Define

*----


DATA: WK_CNT TYPE I, "Count variable

WK_LVL TYPE I, "BOM level

WK_QTY TYPE I. "BOM component qty

DATA: WK_LIFNR LIKE EORD-LIFNR,

WK_MATNR LIKE MARC-MATNR.

*----


*Internal Table define

*----


DATA TAB_STACK LIKE STANDARD TABLE OF WK_STACK. "STACK TABLE

DATA TAB_BOM LIKE STANDARD TABLE OF WK_BOM. "FOR BOM

DATA TAB_DATA LIKE STANDARD TABLE OF DATAITEM. "FOR ALL

*----


  • Parameter in Block1

*----


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME. "TITLE TEXT-001.

PARAMETERS:

P_WERKS LIKE MARC-WERKS DEFAULT 'WX01', "Plant

P_STLTY LIKE STPO-STLTY DEFAULT 'M', "BOM Category

P_MATNR LIKE MARC-MATNR OBLIGATORY, "Material

P_STDAT LIKE EORD-VDATU OBLIGATORY DEFAULT SY-DATUM. "Standard Date

SELECTION-SCREEN END OF BLOCK B1.

*----


  • Parameter in Block2

*----


SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.

SELECTION-SCREEN BEGIN OF LINE.

PARAMETERS: P_SCREEN RADIOBUTTON GROUP R1. "Screen output

SELECTION-SCREEN COMMENT 03(21) TEXT-001.

SELECTION-SCREEN POSITION 32.

PARAMETERS: P_FILE RADIOBUTTON GROUP R1. "NTFILE output

SELECTION-SCREEN COMMENT 34(17) TEXT-002.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK B2.

*----


  • Parameter in Block3

*----


SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME.

PARAMETERS:

  • P_NTFILE(45) TYPE C LOWER CASE OBLIGATORY.

P_PCFILE LIKE RLGRAP-FILENAME.

SELECTION-SCREEN END OF BLOCK B3.

*----


  • INITIALIZATION

*----


INITIALIZATION .

CLEAR : WK_CNT,

WK_LVL,

WK_QTY,

WK_MATNR,

WK_STACK,

WK_BOM,

DATAITEM.

WK_LVL = 0.

WK_QTY = 1.

REFRESH: TAB_STACK,

TAB_DATA,

TAB_BOM.

&----


*& AT SELECTION-SCREE ON VALUE-REQUEST

&----


*AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_NTFILE.

  • PERFORM F_SHOW_FILE_POPUP CHANGING P_NTFILE. "Popup display

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PCFILE.

PERFORM F_FILENAME_GET USING P_PCFILE

CHANGING P_PCFILE.

&----


*& Form F_FILENAME_GET

----


  • --> ST_DAT_PATH : Preset path

  • <-- ST_DAT_FILENAME : Selected file name

----


FORM F_FILENAME_GET USING st_dat_path

CHANGING st_dat_filename.

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

def_filename = SPACE

def_path = st_dat_path

mask = ',.,.,'

mode = '0'

title = 'TXT-file select'

IMPORTING

filename = st_dat_filename

EXCEPTIONS

inv_winsys = 1

no_batch = 2

selection_cancel = 3

selection_error = 4

OTHERS = 5.

IF sy-subrc <> 0.

MESSAGE s002(yf1) WITH 'F_FILENAME_GET' sy-subrc.

ENDIF.

ENDFORM. "F_FILENAME_GET

*----


  • MAIN PROCESS

*----


START-OF-SELECTION.

---- Check material -


PERFORM CHECK_PROD.

---- get vendor data -


PERFORM GET_VENDOR_DATA.

---- output screen/file -


IF P_SCREEN = 'X'.

PERFORM SET_OUTPUT. "Output to screen directly

ELSEIF P_FILE = 'X'.

IF P_PCFILE <> ''.

PERFORM DOWNLOAD_DATA. "Write data into ntfile

ELSE.

MESSAGE E007(00) WITH 'P_PCFILE'.

ENDIF.

ENDIF.

*----


END-OF-SELECTION.

ULINE (142).

WRITE: /002 'Component Material Count:', WK_CNT.

*----


  • TOP-OF-PAGE

*----


TOP-OF-PAGE.

WRITE: /002 'Product:', 013 P_MATNR,

030 '****** BOM Price List ******',

070 SY-DATUM,

095 'PAGE:',

100 SY-PAGNO.

ULINE (142).

WRITE: /001 '|Level',

007 '|Material',

026 '|Cat',

030 '|Quantity',

044 '|From',

055 '|To',

066 '|PurG',

071 '|Vendor',

082 '|MK',

085 '|Price',

101 '|Crncy',

107 '|UnitQty',

115 '|Unit',

120 '|From',

131 '|To',

142 '|'.

ULINE (142).

*&----


*&FORM CHECK_PROD

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_PROD.

SELECT SINGLE * FROM MARC

WHERE WERKS = P_WERKS " Plant

AND MATNR = P_MATNR " Material

AND DISPR IN ('F100','F200'). " Product

IF SY-SUBRC = 0.

PERFORM CHECK_BOM1 USING MARC-MATNR MARC-WERKS. " CHECK_BOM1

ELSE.

MESSAGE E022.

ENDIF.

ENDFORM. " CHECK_PROD

*&----


*&FORM CHECK_BOM1

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM1 USING VALUE(FP_MATNR) VALUE(FP_WERKS).

SELECT SINGLE * FROM MAST

WHERE MATNR = FP_MATNR AND "Material

WERKS = FP_WERKS. "Plant

IF SY-SUBRC = 0.

PERFORM PUSH_STACK USING WK_LVL WK_QTY. "Save parent attribute

PERFORM CHECK_BOM2 USING MAST-STLNR. "Check BOM2

ENDIF.

ENDFORM. "CHECK_BOM1

*&----


*&FORM CHECK_BOM2

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM2 USING VALUE(FP_STLNR).

SELECT * FROM STPO

WHERE STLTY = P_STLTY AND "BOM category

STLNR = FP_STLNR. "BOM number

PERFORM POPOUT_WK. "Pop out to work area

WK_BOM-LEVEL = WK_LVL. "Current BOM level

WK_BOM-MATNR = STPO-IDNRK. "Material number

WK_BOM-POSTP = STPO-POSTP. "ITEM Category

WK_QTY = STPO-MENGE * WK_QTY. "For Stack

WK_BOM-MENGE = WK_QTY. "BOM Component qty

PERFORM CHECK_BOM3 USING STPO-STLTY STPO-STLNR STPO-STLKN.

PERFORM CHECK_BOM1 USING STPO-IDNRK P_WERKS.

ENDSELECT.

PERFORM POPOUT_STACK.

ENDFORM. "CHECK_BOM2

*&----


*&FORM CHECK_BOM3

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM3 USING VALUE(FP_STLTY) VALUE(FP_STLNR) VALUE(FP_STLKN).

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

AND DATUV <= P_STDAT "Valid from

AND LKENZ = ' ' . "Valid

IF SY-SUBRC = 0.

WK_BOM-DATUV = STAS-DATUV. "Valid from

ENDIF.

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

  • AND DATUV > P_STDAT "Valid from

AND LKENZ = 'X' . "Invalid

IF SY-SUBRC = 0.

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

AND DATUV > P_STDAT "Valid from

AND LKENZ = 'X' . "Invalid

IF SY-SUBRC = 0.

WK_BOM-DATUB = STAS-DATUV. "Valid to

APPEND WK_BOM TO TAB_BOM.

ENDIF.

ELSE.

WK_BOM-DATUB = '99991231'. "Manul input

APPEND WK_BOM TO TAB_BOM.

ENDIF.

ENDFORM. "CHECK_BOM3

*&----


*&FORM PUSH_STACK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM PUSH_STACK USING VALUE(FP_LVL) VALUE(FP_QTY).

WK_STACK-LEVEL = FP_LVL + 1.

WK_STACK-QUANT = FP_QTY.

APPEND WK_STACK TO TAB_STACK. "Push stack

SORT TAB_STACK BY LEVEL. "Sort table by level

ENDFORM. "PUSH_STACK

*&----


*&FORM PUSH_STACK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM POPOUT_STACK.

DESCRIBE TABLE TAB_STACK LINES WK_CNT.

IF WK_CNT > 0.

DELETE TAB_STACK INDEX WK_CNT. "Popout stack

SORT TAB_STACK BY LEVEL. "Sort table by level

ENDIF.

ENDFORM. "POPOUT_STACK

*&----


*&FORM POPOUT_WK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM POPOUT_WK.

DESCRIBE TABLE TAB_STACK LINES WK_CNT.

IF WK_CNT > 0.

READ TABLE TAB_STACK INTO WK_STACK INDEX WK_CNT. "Popout stack

IF SY-SUBRC = 0.

WK_LVL = WK_STACK-LEVEL. "Current Level

WK_QTY = WK_STACK-QUANT. "Parent Qty

ENDIF.

ENDIF.

ENDFORM. "POPOUT_WK

*&----


*&FORM DOWNLOAD_DATA

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM DOWNLOAD_DATA.

DATA: L_RETURN TYPE SY-SUBRC.

PERFORM GUI_DOWNLOAD

TABLES

TAB_DATA

USING

P_PCFILE

'X'

CHANGING

L_RETURN.

IF L_RETURN <> 0.

MESSAGE S020.

ELSE.

MESSAGE S021.

ENDIF.

ENDFORM. " DOWNLOAD_DATA

*&----


*&FORM GET_VENDOR_DATA

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM GET_VENDOR_DATA.

LOOP AT TAB_BOM INTO WK_BOM.

CLEAR DATAITEM.

SELECT * FROM MARC

WHERE WERKS = P_WERKS "Plant

AND MATNR = WK_BOM-MATNR. "Material

DATAITEM-EKGRP = MARC-EKGRP.

SELECT SINGLE * FROM MARA

WHERE MATNR = MARC-MATNR AND "Material number

MTART IN ('1211','1221').

IF SY-SUBRC = 0.

SELECT COUNT(*) FROM EORD

INTO (WK_CNT)

WHERE WERKS = P_WERKS AND "Plaint

MATNR = WK_BOM-MATNR AND "Material

VDATU <= P_STDAT AND "Valid-From

BDATU > P_STDAT. "Valid-To

IF WK_CNT > 1.

DATAITEM-MARK = '*'.

ELSEIF WK_CNT = 0.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

SELECT * FROM EORD

WHERE WERKS = P_WERKS AND "Plaint

MATNR = WK_BOM-MATNR AND "Material

VDATU <= P_STDAT AND "Valid-From

BDATU > P_STDAT. "Valid-To

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

DATAITEM-LIFNR = EORD-LIFNR. "Vendor code

SELECT * FROM A018

WHERE LIFNR = EORD-LIFNR AND "Vendor code

MATNR = EORD-MATNR AND "Material

EKORG = EORD-EKORG AND "Purchase org

DATAB <= P_STDAT AND "Valid-from

DATBI > P_STDAT. "Valid-to

DATAITEM-DATAB = A018-DATAB. "Condition From

DATAITEM-DATBI = A018-DATBI. "Condition To

IF SY-SUBRC = 0.

SELECT * FROM KONP

WHERE KNUMH = A018-KNUMH AND "Cnd Number

KSCHL = A018-KSCHL AND "Cnd Type

KAPPL = A018-KAPPL. "Cnd Cat

DATAITEM-KBETR = KONP-KBETR. "Price

DATAITEM-KONWA = KONP-KONWA. "Currency

DATAITEM-KPEIN = KONP-KPEIN. "Price Unit

DATAITEM-KMEIN = KONP-KMEIN. "Unit of Material

APPEND DATAITEM TO TAB_DATA. "Append TAB_DATA

ENDSELECT.

ENDIF.

ENDSELECT.

ENDSELECT.

ELSE.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

ENDSELECT.

IF SY-SUBRC <> 0.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

ENDLOOP.

ENDFORM. "GET_DATA

&----


*& Form SET_OUTPUT

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM SET_OUTPUT .

CLEAR WK_CNT.

LOOP AT TAB_DATA INTO DATAITEM.

WRITE: /001 '|', 002 DATAITEM-LEVEL, "Material Number

007 '|', 008 DATAITEM-MATNR, "Purchase Grp

026 '|', 027 DATAITEM-POSTP, "Item category

030 '|', 031 DATAITEM-MENGE, "BOM Component qty

044 '|', 045 DATAITEM-DATUV, "BOM valid from

055 '|', 056 DATAITEM-DATUB, "BOM valid to

066 '|', 067 DATAITEM-EKGRP, "Purchase Org

071 '|', 072 DATAITEM-LIFNR, "Vendor

082 '|', 083 DATAITEM-MARK, "Mark flag

085 '|', 086 DATAITEM-KBETR, "Price

101 '|', 102 DATAITEM-KONWA, "Currency

107 '|', 108 DATAITEM-KPEIN, "Unit Qty

115 '|', 116 DATAITEM-KMEIN, "Unit OM

120 '|', 121 DATAITEM-DATAB, "Cnd From

131 '|', 132 DATAITEM-DATBI, "Cnd To

142 '|'.

WK_CNT = WK_CNT + 1.

ENDLOOP.

ENDFORM. " SET_OUTPUT

REPORT YZWX00301_06 LINE-SIZE 142

LINE-COUNT 65

MESSAGE-ID YM1

NO STANDARD PAGE HEADING .

*----


  • INCLUDE

*----


INCLUDE: YXXI00050.

*----


*TABLES use table define

*----


TABLES: MARA, " Material General Table

MARC, " Plant Data for Material

MDMA, " MRP Area table

EORD, " Vendor table

A018, " Vendor material mapping table

KONP, " Vendor condition table

MAST, " Material BOM table

STPO, " Material BOM Component table

STAS. " Material BOM Component table detail

*----


*CONSTANTS define

*----


CONSTANTS:

C_DAT_X TYPE C VALUE 'X',

C_MODE LIKE dxfields-fileoper VALUE 'R',

C_MASK LIKE dxfields-filemask VALUE '.',

C_FLG_LOCATION TYPE C VALUE 'A',

C_DFPATH(15) TYPE C VALUE '\bmwx\'.

*----


  • Work Area Define

*----


---- build stack structure -


DATA: BEGIN OF WK_STACK,

LEVEL(1) TYPE C, "Save Level

QUANT TYPE I, "Save Quantity

END OF WK_STACK.

---- BOM work area -


DATA: BEGIN OF WK_BOM,

LEVEL(1) TYPE C, "BOM LEVEL

MATNR LIKE MARC-MATNR, "MATERIAL 18

POSTP LIKE STPO-POSTP, "ITEM CATEGORY 1

MENGE LIKE STPO-MENGE, "BOM COMPONENT 13

DATUV LIKE STPO-DATUV, "VALID FROM 10

DATUB LIKE STPO-DATUV, "VALID TO 10

END OF WK_BOM.

---- DATA work area -


DATA: BEGIN OF DATAITEM,

LEVEL(1) TYPE C, "BOM LEVEL

MATNR LIKE MARC-MATNR, "MATERIAL

POSTP LIKE STPO-POSTP, "ITEM CATEGORY

MENGE LIKE STPO-MENGE, "BOM COMPONENT

DATUV LIKE STPO-DATUV, "VALID FROM!!!

DATUB LIKE STPO-DATUV, "VALID TO

EKGRP LIKE MARC-EKGRP, "PURCHASE ORG

LIFNR LIKE EORD-LIFNR, "Vendor code 10

MARK(1) TYPE C, "Mark

KBETR LIKE KONP-KBETR, "Rate price 11

KONWA LIKE KONP-KONWA, "Currency 5

KPEIN LIKE KONP-KPEIN, "Unit Qty 5

KMEIN LIKE KONP-KMEIN, "Condition Unit 3

DATAB LIKE A018-DATAB, "Condition from 10

DATBI LIKE A018-DATBI, "Condition to 10

END OF DATAITEM.

---- File Line work area -


DATA: BEGIN OF LINE,

WERKS(4) TYPE C, "Plaint 4

MATNR(18) TYPE C, "Material Number 18

EKGRP(3) TYPE C, "Purchase Group 3

LIFNR(10) TYPE C, "Vendor code 10

VDATU LIKE EORD-VDATU, "Vendor valid from 10

BDATU LIKE EORD-BDATU, "Vendor valid to 10

MARK(1) TYPE C, "Mark

KSCHL(4) TYPE C, "Condition type 4

KBETR(18) TYPE C, "Rate price 11

KPEIN(5) TYPE C, "Rate unit 5

KONWA(5) TYPE C, "Currency 5

KMEIN(3) TYPE C, "Condition Unit 3

DATAB LIKE A018-DATAB, "Condition from 10

DATBI LIKE A018-DATBI, "Condition to 10

END OF LINE.

*----


*Local Data Object Define

*----


DATA: WK_CNT TYPE I, "Count variable

WK_LVL TYPE I, "BOM level

WK_QTY TYPE I. "BOM component qty

DATA: WK_LIFNR LIKE EORD-LIFNR,

WK_MATNR LIKE MARC-MATNR.

*----


*Internal Table define

*----


DATA TAB_STACK LIKE STANDARD TABLE OF WK_STACK. "STACK TABLE

DATA TAB_BOM LIKE STANDARD TABLE OF WK_BOM. "FOR BOM

DATA TAB_DATA LIKE STANDARD TABLE OF DATAITEM. "FOR ALL

*----


  • Parameter in Block1

*----


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME. "TITLE TEXT-001.

PARAMETERS:

P_WERKS LIKE MARC-WERKS DEFAULT 'WX01', "Plant

P_STLTY LIKE STPO-STLTY DEFAULT 'M', "BOM Category

P_MATNR LIKE MARC-MATNR OBLIGATORY, "Material

P_STDAT LIKE EORD-VDATU OBLIGATORY DEFAULT SY-DATUM. "Standard Date

SELECTION-SCREEN END OF BLOCK B1.

*----


  • Parameter in Block2

*----


SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.

SELECTION-SCREEN BEGIN OF LINE.

PARAMETERS: P_SCREEN RADIOBUTTON GROUP R1. "Screen output

SELECTION-SCREEN COMMENT 03(21) TEXT-001.

SELECTION-SCREEN POSITION 32.

PARAMETERS: P_FILE RADIOBUTTON GROUP R1. "NTFILE output

SELECTION-SCREEN COMMENT 34(17) TEXT-002.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK B2.

*----


  • Parameter in Block3

*----


SELECTION-SCREEN BEGIN OF BLOCK B3 WITH FRAME.

PARAMETERS:

  • P_NTFILE(45) TYPE C LOWER CASE OBLIGATORY.

P_PCFILE LIKE RLGRAP-FILENAME.

SELECTION-SCREEN END OF BLOCK B3.

*----


  • INITIALIZATION

*----


INITIALIZATION .

CLEAR : WK_CNT,

WK_LVL,

WK_QTY,

WK_MATNR,

WK_STACK,

WK_BOM,

DATAITEM.

WK_LVL = 0.

WK_QTY = 1.

REFRESH: TAB_STACK,

TAB_DATA,

TAB_BOM.

&----


*& AT SELECTION-SCREE ON VALUE-REQUEST

&----


*AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_NTFILE.

  • PERFORM F_SHOW_FILE_POPUP CHANGING P_NTFILE. "Popup display

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PCFILE.

PERFORM F_FILENAME_GET USING P_PCFILE

CHANGING P_PCFILE.

&----


*& Form F_FILENAME_GET

----


  • --> ST_DAT_PATH : Preset path

  • <-- ST_DAT_FILENAME : Selected file name

----


FORM F_FILENAME_GET USING st_dat_path

CHANGING st_dat_filename.

CALL FUNCTION 'WS_FILENAME_GET'

EXPORTING

def_filename = SPACE

def_path = st_dat_path

mask = ',.,.,'

mode = '0'

title = 'TXT-file select'

IMPORTING

filename = st_dat_filename

EXCEPTIONS

inv_winsys = 1

no_batch = 2

selection_cancel = 3

selection_error = 4

OTHERS = 5.

IF sy-subrc <> 0.

MESSAGE s002(yf1) WITH 'F_FILENAME_GET' sy-subrc.

ENDIF.

ENDFORM. "F_FILENAME_GET

*----


  • MAIN PROCESS

*----


START-OF-SELECTION.

---- Check material -


PERFORM CHECK_PROD.

---- get vendor data -


PERFORM GET_VENDOR_DATA.

---- output screen/file -


IF P_SCREEN = 'X'.

PERFORM SET_OUTPUT. "Output to screen directly

ELSEIF P_FILE = 'X'.

IF P_PCFILE <> ''.

PERFORM DOWNLOAD_DATA. "Write data into ntfile

ELSE.

MESSAGE E007(00) WITH 'P_PCFILE'.

ENDIF.

ENDIF.

*----


END-OF-SELECTION.

ULINE (142).

WRITE: /002 'Component Material Count:', WK_CNT.

*----


  • TOP-OF-PAGE

*----


TOP-OF-PAGE.

WRITE: /002 'Product:', 013 P_MATNR,

030 '****** BOM Price List ******',

070 SY-DATUM,

095 'PAGE:',

100 SY-PAGNO.

ULINE (142).

WRITE: /001 '|Level',

007 '|Material',

026 '|Cat',

030 '|Quantity',

044 '|From',

055 '|To',

066 '|PurG',

071 '|Vendor',

082 '|MK',

085 '|Price',

101 '|Crncy',

107 '|UnitQty',

115 '|Unit',

120 '|From',

131 '|To',

142 '|'.

ULINE (142).

*&----


*&FORM CHECK_PROD

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_PROD.

SELECT SINGLE * FROM MARC

WHERE WERKS = P_WERKS " Plant

AND MATNR = P_MATNR " Material

AND DISPR IN ('F100','F200'). " Product

IF SY-SUBRC = 0.

PERFORM CHECK_BOM1 USING MARC-MATNR MARC-WERKS. " CHECK_BOM1

ELSE.

MESSAGE E022.

ENDIF.

ENDFORM. " CHECK_PROD

*&----


*&FORM CHECK_BOM1

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM1 USING VALUE(FP_MATNR) VALUE(FP_WERKS).

SELECT SINGLE * FROM MAST

WHERE MATNR = FP_MATNR AND "Material

WERKS = FP_WERKS. "Plant

IF SY-SUBRC = 0.

PERFORM PUSH_STACK USING WK_LVL WK_QTY. "Save parent attribute

PERFORM CHECK_BOM2 USING MAST-STLNR. "Check BOM2

ENDIF.

ENDFORM. "CHECK_BOM1

*&----


*&FORM CHECK_BOM2

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM2 USING VALUE(FP_STLNR).

SELECT * FROM STPO

WHERE STLTY = P_STLTY AND "BOM category

STLNR = FP_STLNR. "BOM number

PERFORM POPOUT_WK. "Pop out to work area

WK_BOM-LEVEL = WK_LVL. "Current BOM level

WK_BOM-MATNR = STPO-IDNRK. "Material number

WK_BOM-POSTP = STPO-POSTP. "ITEM Category

WK_QTY = STPO-MENGE * WK_QTY. "For Stack

WK_BOM-MENGE = WK_QTY. "BOM Component qty

PERFORM CHECK_BOM3 USING STPO-STLTY STPO-STLNR STPO-STLKN.

PERFORM CHECK_BOM1 USING STPO-IDNRK P_WERKS.

ENDSELECT.

PERFORM POPOUT_STACK.

ENDFORM. "CHECK_BOM2

*&----


*&FORM CHECK_BOM3

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM CHECK_BOM3 USING VALUE(FP_STLTY) VALUE(FP_STLNR) VALUE(FP_STLKN).

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

AND DATUV <= P_STDAT "Valid from

AND LKENZ = ' ' . "Valid

IF SY-SUBRC = 0.

WK_BOM-DATUV = STAS-DATUV. "Valid from

ENDIF.

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

  • AND DATUV > P_STDAT "Valid from

AND LKENZ = 'X' . "Invalid

IF SY-SUBRC = 0.

SELECT SINGLE * FROM STAS

WHERE STLTY = FP_STLTY "BOM category

AND STLNR = FP_STLNR "BOM number

AND STLKN = FP_STLKN "BOM item

AND DATUV > P_STDAT "Valid from

AND LKENZ = 'X' . "Invalid

IF SY-SUBRC = 0.

WK_BOM-DATUB = STAS-DATUV. "Valid to

APPEND WK_BOM TO TAB_BOM.

ENDIF.

ELSE.

WK_BOM-DATUB = '99991231'. "Manul input

APPEND WK_BOM TO TAB_BOM.

ENDIF.

ENDFORM. "CHECK_BOM3

*&----


*&FORM PUSH_STACK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM PUSH_STACK USING VALUE(FP_LVL) VALUE(FP_QTY).

WK_STACK-LEVEL = FP_LVL + 1.

WK_STACK-QUANT = FP_QTY.

APPEND WK_STACK TO TAB_STACK. "Push stack

SORT TAB_STACK BY LEVEL. "Sort table by level

ENDFORM. "PUSH_STACK

*&----


*&FORM PUSH_STACK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM POPOUT_STACK.

DESCRIBE TABLE TAB_STACK LINES WK_CNT.

IF WK_CNT > 0.

DELETE TAB_STACK INDEX WK_CNT. "Popout stack

SORT TAB_STACK BY LEVEL. "Sort table by level

ENDIF.

ENDFORM. "POPOUT_STACK

*&----


*&FORM POPOUT_WK

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM POPOUT_WK.

DESCRIBE TABLE TAB_STACK LINES WK_CNT.

IF WK_CNT > 0.

READ TABLE TAB_STACK INTO WK_STACK INDEX WK_CNT. "Popout stack

IF SY-SUBRC = 0.

WK_LVL = WK_STACK-LEVEL. "Current Level

WK_QTY = WK_STACK-QUANT. "Parent Qty

ENDIF.

ENDIF.

ENDFORM. "POPOUT_WK

*&----


*&FORM DOWNLOAD_DATA

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM DOWNLOAD_DATA.

DATA: L_RETURN TYPE SY-SUBRC.

PERFORM GUI_DOWNLOAD

TABLES

TAB_DATA

USING

P_PCFILE

'X'

CHANGING

L_RETURN.

IF L_RETURN <> 0.

MESSAGE S020.

ELSE.

MESSAGE S021.

ENDIF.

ENDFORM. " DOWNLOAD_DATA

*&----


*&FORM GET_VENDOR_DATA

*&----


  • text

  • -->p1 text

  • <--p2 text

*----


FORM GET_VENDOR_DATA.

LOOP AT TAB_BOM INTO WK_BOM.

CLEAR DATAITEM.

SELECT * FROM MARC

WHERE WERKS = P_WERKS "Plant

AND MATNR = WK_BOM-MATNR. "Material

DATAITEM-EKGRP = MARC-EKGRP.

SELECT SINGLE * FROM MARA

WHERE MATNR = MARC-MATNR AND "Material number

MTART IN ('1211','1221').

IF SY-SUBRC = 0.

SELECT COUNT(*) FROM EORD

INTO (WK_CNT)

WHERE WERKS = P_WERKS AND "Plaint

MATNR = WK_BOM-MATNR AND "Material

VDATU <= P_STDAT AND "Valid-From

BDATU > P_STDAT. "Valid-To

IF WK_CNT > 1.

DATAITEM-MARK = '*'.

ELSEIF WK_CNT = 0.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

SELECT * FROM EORD

WHERE WERKS = P_WERKS AND "Plaint

MATNR = WK_BOM-MATNR AND "Material

VDATU <= P_STDAT AND "Valid-From

BDATU > P_STDAT. "Valid-To

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

DATAITEM-LIFNR = EORD-LIFNR. "Vendor code

SELECT * FROM A018

WHERE LIFNR = EORD-LIFNR AND "Vendor code

MATNR = EORD-MATNR AND "Material

EKORG = EORD-EKORG AND "Purchase org

DATAB <= P_STDAT AND "Valid-from

DATBI > P_STDAT. "Valid-to

DATAITEM-DATAB = A018-DATAB. "Condition From

DATAITEM-DATBI = A018-DATBI. "Condition To

IF SY-SUBRC = 0.

SELECT * FROM KONP

WHERE KNUMH = A018-KNUMH AND "Cnd Number

KSCHL = A018-KSCHL AND "Cnd Type

KAPPL = A018-KAPPL. "Cnd Cat

DATAITEM-KBETR = KONP-KBETR. "Price

DATAITEM-KONWA = KONP-KONWA. "Currency

DATAITEM-KPEIN = KONP-KPEIN. "Price Unit

DATAITEM-KMEIN = KONP-KMEIN. "Unit of Material

APPEND DATAITEM TO TAB_DATA. "Append TAB_DATA

ENDSELECT.

ENDIF.

ENDSELECT.

ENDSELECT.

ELSE.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

ENDSELECT.

IF SY-SUBRC <> 0.

MOVE-CORRESPONDING WK_BOM TO DATAITEM.

APPEND DATAITEM TO TAB_DATA.

ENDIF.

ENDLOOP.

ENDFORM. "GET_DATA

&----


*& Form SET_OUTPUT

&----


  • text

----


  • --> p1 text

  • <-- p2 text

----


FORM SET_OUTPUT .

CLEAR WK_CNT.

LOOP AT TAB_DATA INTO DATAITEM.

WRITE: /001 '|', 002 DATAITEM-LEVEL, "Material Number

007 '|', 008 DATAITEM-MATNR, "Purchase Grp

026 '|', 027 DATAITEM-POSTP, "Item category

030 '|', 031 DATAITEM-MENGE, "BOM Component qty

044 '|', 045 DATAITEM-DATUV, "BOM valid from

055 '|', 056 DATAITEM-DATUB, "BOM valid to

066 '|', 067 DATAITEM-EKGRP, "Purchase Org

071 '|', 072 DATAITEM-LIFNR, "Vendor

082 '|', 083 DATAITEM-MARK, "Mark flag

085 '|', 086 DATAITEM-KBETR, "Price

101 '|', 102 DATAITEM-KONWA, "Currency

107 '|', 108 DATAITEM-KPEIN, "Unit Qty

115 '|', 116 DATAITEM-KMEIN, "Unit OM

120 '|', 121 DATAITEM-DATAB, "Cnd From

131 '|', 132 DATAITEM-DATBI, "Cnd To

142 '|'.

WK_CNT = WK_CNT + 1.

ENDLOOP.

ENDFORM. " SET_OUTPUT

2 REPLIES 2
Read only

Former Member
0 Likes
493

check this

no need to access all the tables.

Regards

Prabhu

Read only

Former Member
0 Likes
493

Prabhu Peram,

Thanks very much.

I want to show an idea of BOM explosion by constructing a stack.

BOM explosion uses first-root-searching and pushes the "root" material into stack.If the "root" has no left-child,pops out the "root" material and searchs the right-child....and completes the entire BOM explosion.

Message was edited by:

Mic chen

Message was edited by:

Mic chen