Showing posts with label ABAP Reports for Production Planning. Show all posts
Showing posts with label ABAP Reports for Production Planning. Show all posts

Friday, November 30, 2007

Sample ABAP on Multi-Level Bom with Location Balance

REPORT ZMULTIBOM NO STANDARD PAGE HEADING LINE-SIZE 195
LINE-COUNT 60(2) MESSAGE-ID Z1.

TABLES: MBEW, "Material Valuation
MSLB, "Special stocks with vendor
MARA, "Material Master
MAKT, "Material Descriptions
MARD, "Material Master: Storage Location/Batch Segment
MAST, "BOM Header
STKO, "BOM Detail
STPO, "Bom Components
STAS. "BOM Alternative

* Text Elements
* Plant
SELECT-OPTIONS: S_WERKS FOR MAST-WERKS DEFAULT 'CA',
* Material
S_MATNR FOR MAST-MATNR,
* Material Type
S_MTART FOR MARA-MTART.
* Base Quantity
PARAMETERS: S_BASE TYPE I DEFAULT '1'.
* Display up to Level
PARAMETERS: S_LVL TYPE I DEFAULT '99'.
SELECTION-SCREEN SKIP.
* Include Vendor Stock
PARAMETERS: X_MSLB AS CHECKBOX.

DATA: W_MATNR LIKE MAPL-MATNR.

DATA: PARENT-MATNR LIKE MAST-MATNR,
CHILD-MATNR LIKE STPO-IDNRK,
CHILD-WERKS LIKE MAST-WERKS,
CHILD-STLAL LIKE MAST-STLAL,
W_MAKTX LIKE MAKT-MAKTX,
W_STD TYPE P DECIMALS 5,
W_MAV TYPE P DECIMALS 5,
W_MENGE TYPE P DECIMALS 3,
W_LEVEL TYPE I,
W_DOT(1),
W_LVL(12),
W_LVL1(12),
W_LVL2(2),
W_COL TYPE I,
W_LFLAG,
W_TTL LIKE MARD-LABST.

DATA: BEGIN OF INT1 OCCURS 50,
LGORT(6),
LABST LIKE MARD-LABST,
END OF INT1.

IF S_BASE EQ 0.
S_BASE = 1.
ENDIF.

** append multi level routing
SELECT * FROM MAST WHERE WERKS IN S_WERKS AND
MATNR IN S_MATNR.
SELECT SINGLE * FROM MARA WHERE MATNR = MAST-MATNR AND
MTART IN S_MTART.
IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
IF MARA-LVORM <> 'X'.
PARENT-MATNR = MAST-MATNR.
CHILD-MATNR = MAST-MATNR.
CHILD-WERKS = MAST-WERKS.
CHILD-STLAL = MAST-STLAL.
SELECT SINGLE * FROM MAKT WHERE MATNR = MAST-MATNR AND
SPRAS = 'E'.
W_MAKTX = MAKT-MAKTX.
REFRESH INT1.
SELECT * FROM MARD WHERE MATNR = MAST-MATNR AND
WERKS = MAST-WERKS AND
LABST NE 0.
MOVE MARD-LGORT TO INT1-LGORT.
MOVE MARD-LABST TO INT1-LABST.
APPEND INT1.
ENDSELECT.
IF X_MSLB EQ 'X'.
SELECT * FROM MSLB WHERE MATNR EQ MAST-MATNR AND
WERKS EQ MAST-WERKS AND
LBLAB NE 0.
MOVE MSLB-LIFNR TO INT1-LGORT.
MOVE MSLB-LBLAB TO INT1-LABST.
APPEND INT1.
ENDSELECT.
ENDIF.
W_LEVEL = 1.
NEW-PAGE.
PERFORM GETCHILD.
ENDIF.
ENDSELECT.

** get child parts
FORM GETCHILD.
SELECT * FROM STPO WHERE STLNR = MAST-STLNR
ORDER BY POSNR.
SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR
AND STLAL = MAST-STLAL.
SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
STLKN = STPO-STLKN AND
STLAL = MAST-STLAL.
IF SY-SUBRC EQ 0.
CLEAR: W_DOT, W_LVL, W_LVL1.
PERFORM WRT_DTL.
CHILD-MATNR = STPO-IDNRK.
W_LEVEL = W_LEVEL + 1.
IF W_LEVEL <= S_LVL.
PERFORM SUBCHILD.
ENDIF.
W_LEVEL = W_LEVEL - 1.
ENDIF.
ENDSELECT.
ENDFORM.

** get grand children parts
FORM SUBCHILD.
SELECT SINGLE * FROM MAST WHERE MATNR = CHILD-MATNR
AND WERKS = CHILD-WERKS.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
SELECT * FROM STPO WHERE STLNR = MAST-STLNR
ORDER BY POSNR.
SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR AND
STLAL = MAST-STLAL.
SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
STLKN = STPO-STLKN AND
STLAL = STKO-STLAL.
IF SY-SUBRC EQ 0.
W_DOT = '.'.
PERFORM WRT_DTL.
CHILD-MATNR = STPO-IDNRK.
W_LEVEL = W_LEVEL + 1.
IF W_LEVEL <= S_LVL.
PERFORM SUBCHILD.
ENDIF.
W_LEVEL = W_LEVEL - 1.
SHIFT W_LVL.
ENDIF.
ENDSELECT.
ENDFORM.

TOP-OF-PAGE.
WRITE:/ SY-DATUM,SY-UZEIT,
85 'ABC PTE LTD',
182 'Page', SY-PAGNO.
WRITE: / SY-REPID,
75 'BOM STRUCTURE (WITH LOCATION BALANCES)',
182 SY-UNAME.
SKIP.
CLEAR W_LFLAG.
WRITE:/ 'Material No.:', PARENT-MATNR,
60 'Plant :', MAST-WERKS.
W_COL = 90.
CLEAR W_TTL.
LOOP AT INT1.
IF W_COL > 195.
IF W_LFLAG IS INITIAL.
WRITE:/ 'Description :', W_MAKTX,
60 'Base Qty :', S_BASE LEFT-JUSTIFIED.
W_LFLAG = 'X'.
W_COL = 90.
ELSE.
W_COL = 90.
SKIP.
ENDIF.
ENDIF.
WRITE AT W_COL 'Loc :'.
W_COL = W_COL + 6.
WRITE AT W_COL INT1-LGORT.
W_COL = W_COL + 7.
WRITE AT W_COL(12) INT1-LABST LEFT-JUSTIFIED.
W_COL = W_COL + 16.
W_TTL = W_TTL + INT1-LABST.
ENDLOOP.
IF W_LFLAG IS INITIAL.
WRITE:/ 'Description :', W_MAKTX,
60 'Base Qty :', S_BASE LEFT-JUSTIFIED,
90 'Total :', W_TTL LEFT-JUSTIFIED.
ELSE.
WRITE AT W_COL 'Total :'.
W_COL = W_COL + 8.
WRITE AT W_COL W_TTL LEFT-JUSTIFIED.
ENDIF.
SKIP.
ULINE.
WRITE: /001 'Level',
011 'Item',
017 'Component',
037 'Description',
079 ' Per',
089 'UOM',
094 ' Std Price',
106 'Moving Avg',
119 'Location',
128 ' Balance',
139 'Location',
148 ' Balance',
159 'Location',
168 ' Balance',
179 'Total Quantity'.
ULINE.

FORM WRT_DTL.
CLEAR: MAKT-MAKTX, W_MAV, W_STD.
SELECT SINGLE * FROM MAKT WHERE MATNR = STPO-IDNRK AND
SPRAS = 'E'.
SELECT SINGLE * FROM MBEW WHERE MATNR = STPO-IDNRK AND
BWKEY = MAST-WERKS.
IF SY-SUBRC = 0.
W_MAV = MBEW-VERPR / MBEW-PEINH.
W_STD = MBEW-STPRS / MBEW-PEINH.
ENDIF.
W_MENGE = ( STPO-MENGE / STKO-BMENG ) * S_BASE.
W_LVL2 = W_LEVEL.
CONCATENATE W_DOT W_LVL INTO W_LVL.
CONCATENATE W_LVL W_LVL2 INTO W_LVL1.
WRITE: /001 W_LVL1,
011 STPO-POSNR,
017 STPO-IDNRK,
037 MAKT-MAKTX,
079(8) W_MENGE,
089 STPO-MEINS,
094(10) W_STD,
106(10) W_MAV.
W_COL = 119.
CLEAR W_TTL.
SELECT * FROM MARD WHERE MATNR = STPO-IDNRK AND
WERKS = MAST-WERKS AND
LABST NE 0.
IF W_COL > 166.
W_COL = 119.
WRITE AT /W_COL ' '.
ENDIF.
WRITE AT W_COL MARD-LGORT.
W_COL = W_COL + 5.
WRITE AT W_COL(13) MARD-LABST.
W_COL = W_COL + 15.
W_TTL = W_TTL + MARD-LABST.
ENDSELECT.
IF X_MSLB EQ 'X'.
SELECT * FROM MSLB WHERE MATNR = STPO-IDNRK AND
WERKS = MAST-WERKS AND
LBLAB NE 0.
IF W_COL > 166.
W_COL = 119.
WRITE AT /W_COL ' '.
ENDIF.
WRITE AT W_COL(6) MSLB-LIFNR.
W_COL = W_COL + 6.
WRITE AT W_COL(12) MSLB-LBLAB.
W_COL = W_COL + 14.
W_TTL = W_TTL + MSLB-LBLAB.
ENDSELECT.
ENDIF.
WRITE AT 179(15) W_TTL.
ENDFORM.

Writing a Multi-Level BOM Cost Roll-up with ABAP

REPORT ZBOMCOST NO STANDARD PAGE HEADING LINE-SIZE 195
LINE-COUNT 60(2) MESSAGE-ID Z1.

TABLES: MBEW,
MAPL,
PLPO,
PLAS,
CRHD,
CRCO,
CSSL,
COST,
EINE,
EINA,
MARA, "Material Master
MAKT,
MARC,
MAST, "BOM Header
STKO, "BOM Detail
STPO, "Bom Components
STAS. "BOM Alternative

SELECT-OPTIONS: S_WERKS FOR MAST-WERKS,
S_MATNR FOR MAST-MATNR,
S_MTART FOR MARA-MTART.

PARAMETERS: XBASE TYPE I DEFAULT '2000'.

DATA: W_MATNR LIKE MAPL-MATNR.

DATA: S_BASE TYPE I,
PARENT-MATNR LIKE MAST-MATNR,
CHILD-MATNR LIKE STPO-IDNRK,
CHILD-WERKS LIKE MAST-WERKS,
CHILD-STLAL LIKE MAST-STLAL,
W_MAKTX LIKE MAKT-MAKTX,
W_STD TYPE P DECIMALS 5,
W_MAV TYPE P DECIMALS 5,
W_MENGE TYPE P DECIMALS 3,
W_LEVEL TYPE I,
W_DOT(1),
W_LVL(12),
W_LVL1(12),
W_LVL2(2),
W_COL TYPE I,
W_LFLAG,
W_TTL LIKE MARD-LABST,
WCNT TYPE I.

DATA: WCONV TYPE P DECIMALS 5,
WCOST TYPE P DECIMALS 5,
WUCOST TYPE P DECIMALS 5,
WOHCOST TYPE P DECIMALS 5,
WEXCOST TYPE P DECIMALS 5,
WMCOST TYPE P DECIMALS 5,
WTCOST TYPE P DECIMALS 5.

DATA: WLAR LIKE PLPO-LAR01,
WVGW LIKE PLPO-VGW01,
WVGE LIKE PLPO-VGE01.

DATA: BEGIN OF ITAB OCCURS 100,
CNT TYPE I,
LEVEL TYPE I,
LVL1 LIKE W_LVL1,
WERKS LIKE MAST-WERKS,
POSNR LIKE STPO-POSNR,
IDNRK LIKE STPO-IDNRK,
MENGE TYPE P DECIMALS 5, " req qty
MEINS LIKE STPO-MEINS,
END OF ITAB.

DATA: BEGIN OF ITAB1 OCCURS 100,
WERKS LIKE MAST-WERKS,
IDNRK LIKE STPO-IDNRK,
UCOST TYPE P DECIMALS 5,
* mcost type p decimals 5,
* ohcost type p decimals 5,
* excost type p decimals 5,
END OF ITAB1.

DATA: BEGIN OF ITAB2 OCCURS 100,
CNT TYPE I,
SUBCNT TYPE I,
LEVEL TYPE I,
LVL1 LIKE W_LVL1,
WERKS LIKE MAST-WERKS,
POSNR LIKE STPO-POSNR,
IDNRK LIKE STPO-IDNRK,
SBASE TYPE P,
AUSSS LIKE MARC-AUSSS,
MENGE TYPE P DECIMALS 5,
MEINS LIKE STPO-MEINS,
STD TYPE P DECIMALS 5,
MAV TYPE P DECIMALS 5,
VPRSV LIKE MBEW-VPRSV,
VORNR LIKE PLPO-VORNR,
ARBPL LIKE CRHD-ARBPL,
BMSCH LIKE PLPO-BMSCH,
UCOST TYPE P DECIMALS 5,
WLAR LIKE PLPO-LAR01,
WDL TYPE P DECIMALS 5,
WDLR TYPE P DECIMALS 2,
WDLH TYPE P DECIMALS 3,
WMSU TYPE P DECIMALS 5,
WMSUR TYPE P DECIMALS 2,
WMSUH TYPE P DECIMALS 3,
WTS TYPE P DECIMALS 5,
WTSR TYPE P DECIMALS 2,
WTSH TYPE P DECIMALS 3,
WAST TYPE P DECIMALS 5,
WASTR TYPE P DECIMALS 2,
WASTH TYPE P DECIMALS 3,
WOTHA LIKE PLPO-LAR01,
WOTH TYPE P DECIMALS 5,
WOTHR TYPE P DECIMALS 2,
WOTHH TYPE P DECIMALS 3,
OHCOST TYPE P DECIMALS 5,
MCOST TYPE P DECIMALS 5,
LIFNR LIKE EINA-LIFNR,
EXCOST TYPE P DECIMALS 5,
NETPR LIKE EINE-NETPR,
PEINH LIKE EINE-PEINH,
WCONV LIKE WCONV,
END OF ITAB2.

DATA: WPERIOD LIKE T009B-POPER,
WGJAHR LIKE CSSL-GJAHR.

CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'
EXPORTING
I_DATE = SY-DATUM
* I_MONMIT = 00
I_PERIV = 'K4'
IMPORTING
E_BUPER = WPERIOD
E_GJAHR = WGJAHR
EXCEPTIONS
INPUT_FALSE = 1
T009_NOTFOUND = 2
T009B_NOTFOUND = 3
OTHERS = 4.

IF S_BASE EQ 0.
S_BASE = 1.
ENDIF.

FORMAT INTENSIFIED OFF.
** append multi level bom
SELECT * FROM MAST WHERE WERKS IN S_WERKS AND
MATNR IN S_MATNR.
SELECT SINGLE * FROM MARA WHERE MATNR = MAST-MATNR AND
MTART IN S_MTART.
IF SY-SUBRC NE 0.
CONTINUE.
ENDIF.
IF MARA-LVORM <> 'X'.
PARENT-MATNR = MAST-MATNR.
CHILD-MATNR = MAST-MATNR.
CHILD-WERKS = MAST-WERKS.
CHILD-STLAL = MAST-STLAL.
CLEAR ITAB.
CLEAR ITAB-LEVEL.
MOVE MAST-WERKS TO ITAB-WERKS.
MOVE MAST-MATNR TO ITAB-IDNRK.
MOVE MARA-MEINS TO ITAB-MEINS.
WCNT = WCNT + 1.
MOVE WCNT TO ITAB-CNT.
APPEND ITAB.
W_LEVEL = 1.
PERFORM GETCHILD.
ENDIF.
ENDSELECT.

SORT ITAB BY LEVEL DESCENDING.
LOOP AT ITAB.
CLEAR: ITAB1, ITAB2.
CLEAR: MARC-SOBSL, MARC-BESKZ, MARC-AUSSS.
SELECT SINGLE * FROM MARC WHERE MATNR = ITAB-IDNRK AND
WERKS = ITAB-WERKS.
IF SY-SUBRC EQ 0 AND
MARC-AUSSS NE 0.
S_BASE = XBASE + ( ( XBASE * MARC-AUSSS ) / 100 ).
ELSE.
S_BASE = XBASE.
ENDIF.
CLEAR: WOHCOST, WMCOST, WEXCOST, WUCOST.
PERFORM GET_ROUTE.
PERFORM GET_SUBC.
WTCOST = WOHCOST + WEXCOST.
PERFORM GET_BOM.
MOVE ITAB-WERKS TO ITAB1-WERKS.
MOVE ITAB-IDNRK TO ITAB1-IDNRK.
MOVE WUCOST TO ITAB1-UCOST.
APPEND ITAB1.
CLEAR ITAB2.
MOVE-CORRESPONDING ITAB TO ITAB2.
ITAB2-AUSSS = MARC-AUSSS.
ITAB2-SBASE = S_BASE.
MOVE WMCOST TO ITAB2-MCOST.
MOVE WOHCOST TO ITAB2-OHCOST.
MOVE WEXCOST TO ITAB2-EXCOST.
MOVE ITAB1-UCOST TO ITAB2-UCOST.
APPEND ITAB2.
ENDLOOP.

*loop at itab1.
* write:/ itab1-idnrk, itab1-ucost.
*endloop.
SORT ITAB2 BY CNT VORNR.
LOOP AT ITAB2.
WTCOST = ITAB2-MCOST + ITAB2-OHCOST + ITAB2-EXCOST.
IF ITAB2-LEVEL = 0 AND
ITAB2-SUBCNT = 0.
NEW-PAGE.
FORMAT COLOR COL_GROUP INVERSE ON.
CLEAR: MAKT-MAKTX, W_STD, W_MAV.
SELECT SINGLE * FROM MAKT WHERE MATNR = ITAB2-IDNRK AND
SPRAS = 'E'.
SELECT SINGLE * FROM MBEW WHERE MATNR = ITAB2-IDNRK AND
BWKEY = ITAB2-WERKS.
W_MAKTX = MAKT-MAKTX.
IF SY-SUBRC EQ 0.
W_STD = MBEW-STPRS / MBEW-PEINH.
W_MAV = MBEW-VERPR / MBEW-PEINH.
ENDIF.
WRITE:/ '***',
008 ITAB2-IDNRK,
034 MAKT-MAKTX,
076(6) ITAB2-AUSSS NO-ZERO,
096 ITAB2-MEINS,
101(12) ITAB2-UCOST,
114(12) W_STD,
127(12) W_MAV,
140(12) ITAB2-MCOST DECIMALS 3 NO-ZERO,
153(12) ITAB2-OHCOST DECIMALS 3 NO-ZERO,
166(12) ITAB2-EXCOST DECIMALS 3 NO-ZERO,
179(12) WTCOST DECIMALS 3 NO-ZERO.
FORMAT COLOR OFF INVERSE OFF.
ELSEIF ITAB2-LIFNR NE ''.
WRITE: /008 '**', 'Subcontact Cost'.
WRITE: /014 '*', ITAB2-LIFNR,
034 ITAB2-NETPR, '/' , ITAB2-PEINH.

ELSEIF ITAB2-VORNR NE ''.
WOHCOST = ITAB2-WDL + ITAB2-WMSU + ITAB2-WAST
+ ITAB2-WTS + ITAB2-WOTH.
IF WOHCOST NE 0.
CLEAR WVGW.
IF ITAB2-SUBCNT = '1'.
WRITE:/008 '**', 'Process Cost'.
ENDIF.
WVGW = ( ITAB2-WDLH / ITAB2-BMSCH ) * ITAB2-SBASE.
WRITE:/014 ITAB2-VORNR, ITAB2-ARBPL,
034 'DL',
040(10) ITAB2-WDLH,
052(10) ITAB2-WDLR,
064(12) WVGW,
078(16) ITAB2-WDL,
096 ITAB2-BMSCH LEFT-JUSTIFIED.
IF ITAB2-WMSUH NE 0.
WVGW = ( ITAB2-WMSUH / ITAB2-BMSCH ) * ITAB2-SBASE.
WRITE:/034 'MSU',
040(10) ITAB2-WMSUH,
052(10) ITAB2-WMSUR,
064(12) WVGW,
078(16) ITAB2-WMSU.
ENDIF.
IF ITAB2-WTSH NE 0.
WRITE:/034 'TOOLST',
040(10) ITAB2-WTSH,
052(10) ITAB2-WTSR,
064(12) ITAB2-WTSH,
078(16) ITAB2-WTS.
ENDIF.
IF ITAB2-WASTH NE 0.
WRITE:/034 'AST',
040(10) ITAB2-WASTH,
052(10) ITAB2-WASTR,
064(12) ITAB2-WASTH,
078(16) ITAB2-WAST.
ENDIF.
ENDIF.
IF ITAB2-WOTHH NE 0.
WVGW = ( ITAB2-WOTHH / ITAB2-BMSCH ) * S_BASE.
WRITE:/034 ITAB2-WOTHA,
040(8) ITAB2-WOTHH,
050(10) ITAB2-WOTHR,
062(8) WVGW,
072(10) ITAB2-WOTH.
ENDIF.
ELSE.
SKIP.
CLEAR: MAKT-MAKTX, W_STD, W_MAV.
SELECT SINGLE * FROM MAKT WHERE MATNR = ITAB2-IDNRK AND
SPRAS = 'E'.
SELECT SINGLE * FROM MBEW WHERE MATNR = ITAB2-IDNRK AND
BWKEY = ITAB2-WERKS.
IF SY-SUBRC EQ 0.
W_STD = MBEW-STPRS / MBEW-PEINH.
W_MAV = MBEW-VERPR / MBEW-PEINH.
ENDIF.
FORMAT INTENSIFIED ON.
WRITE:/001 ITAB2-LVL1,
008 ITAB2-POSNR,
014 ITAB2-IDNRK,
034 MAKT-MAKTX,
076(6) ITAB2-AUSSS NO-ZERO,
084(10) ITAB2-MENGE,
096 ITAB2-MEINS,
101(12) ITAB2-UCOST,
114(12) W_STD,
127(12) W_MAV,
140(12) ITAB2-MCOST DECIMALS 3 NO-ZERO,
153(12) ITAB2-OHCOST DECIMALS 3 NO-ZERO,
166(12) ITAB2-EXCOST DECIMALS 3 NO-ZERO,
179(12) WTCOST DECIMALS 3 NO-ZERO.
FORMAT INTENSIFIED OFF.
ENDIF.
ENDLOOP.

** get child parts
FORM GETCHILD.
SELECT * FROM STPO WHERE STLNR = MAST-STLNR
ORDER BY POSNR.
SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR
AND STLAL = MAST-STLAL.
SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
STLKN = STPO-STLKN AND
STLAL = MAST-STLAL.
IF SY-SUBRC EQ 0.
CLEAR: W_DOT, W_LVL, W_LVL1.
PERFORM MOV_DATA.
CHILD-MATNR = STPO-IDNRK.
W_LEVEL = W_LEVEL + 1.
PERFORM SUBCHILD.
W_LEVEL = W_LEVEL - 1.
ENDIF.
ENDSELECT.
ENDFORM.

** get grand children parts
FORM SUBCHILD.
SELECT SINGLE * FROM MAST WHERE MATNR = CHILD-MATNR
AND WERKS = CHILD-WERKS.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
SELECT * FROM STPO WHERE STLNR = MAST-STLNR
ORDER BY POSNR.
SELECT SINGLE * FROM STKO WHERE STLNR = STPO-STLNR AND
STLAL = MAST-STLAL.
SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
STLKN = STPO-STLKN AND
STLAL = STKO-STLAL.
IF SY-SUBRC EQ 0.
W_DOT = '.'.
PERFORM MOV_DATA.
CHILD-MATNR = STPO-IDNRK.
W_LEVEL = W_LEVEL + 1.
PERFORM SUBCHILD.
W_LEVEL = W_LEVEL - 1.
SHIFT W_LVL.
ENDIF.
ENDSELECT.
ENDFORM.

TOP-OF-PAGE.
WRITE:/ SY-DATUM,SY-UZEIT,
90 'ABC PRIVATE LIMITED',
180 'Page', SY-PAGNO.
WRITE: / SY-REPID,
88 'Roll-Up Cost (Multi-Level)',
180 SY-UNAME.
SKIP.
CLEAR W_LFLAG.
WRITE:/ 'Material No.:', ITAB2-IDNRK, W_MAKTX,
75 'Plant :', ITAB2-WERKS,
97 'Base Qty :', XBASE LEFT-JUSTIFIED.
SKIP.
ULINE.
FORMAT COLOR COL_HEADING.
WRITE: /001 'Level',
008 'Item',
014 'Component',
034 'Description',
075 'Scrap %',
084 ' Per',
096 'UOM',
101 'Roll-Up Cst',
114 'MM Std Cost',
127 'MM Mvg Cost',
140 ' Matl Cost',
153 'Process Cst',
166 'Sub-Con Cst',
179 ' Total Cost',
190 ' '.
WRITE: /034 'Act',
040 ' Std Val',
052 ' Act Rate',
064 ' Hours',
078 ' Cost',
096 'Base Qty',
190 ' '.
FORMAT COLOR OFF.
ULINE.

FORM MOV_DATA.
W_LVL2 = W_LEVEL.
CONCATENATE W_DOT W_LVL INTO W_LVL.
CONCATENATE W_LVL W_LVL2 INTO W_LVL1.
MOVE W_LVL1 TO ITAB-LVL1.
MOVE W_LEVEL TO ITAB-LEVEL.
MOVE MAST-WERKS TO ITAB-WERKS.
MOVE STPO-POSNR TO ITAB-POSNR.
MOVE STPO-IDNRK TO ITAB-IDNRK.
MOVE STPO-MEINS TO ITAB-MEINS.
ITAB-MENGE = ( STPO-MENGE / STKO-BMENG ).
WCNT = WCNT + 1.
ITAB-CNT = WCNT.
APPEND ITAB.
ENDFORM.

FORM GET_BOM.
CLEAR: WMCOST.
SELECT SINGLE * FROM MAST WHERE MATNR EQ ITAB-IDNRK AND
WERKS = ITAB-WERKS.
IF SY-SUBRC EQ 0.
SELECT * FROM STPO WHERE STLTY = 'M' AND
STLNR = MAST-STLNR AND
DATUV LE SY-DATUM.
SELECT SINGLE * FROM STKO WHERE STLTY = 'M' AND
STLNR = STPO-STLNR AND
STLAL = MAST-STLAL.
SELECT SINGLE * FROM STAS WHERE STLNR = STPO-STLNR AND
STLKN = STPO-STLKN AND
STLAL = STKO-STLAL.
IF SY-SUBRC EQ 0.
READ TABLE ITAB1 WITH KEY IDNRK = STPO-IDNRK
WERKS = ITAB-WERKS.
IF SY-SUBRC EQ 0.
WMCOST = WMCOST + ( ( STPO-MENGE / STKO-BMENG ) * S_BASE
* ITAB1-UCOST ).
ENDIF.
ENDIF.
ENDSELECT.
WUCOST = ( WTCOST + WMCOST ) / XBASE.
ELSE.
IF WTCOST EQ 0.
SELECT SINGLE * FROM MBEW WHERE BWKEY = ITAB-WERKS AND
MATNR = ITAB-IDNRK.
IF SY-SUBRC EQ 0.
IF MBEW-VPRSV = 'S'.
WUCOST = ( MBEW-STPRS / MBEW-PEINH ).
ELSE.
WUCOST = ( MBEW-VERPR / MBEW-PEINH ).
ENDIF.
ENDIF.
ELSE.
WUCOST = WTCOST / XBASE.
ENDIF.
ENDIF.
ENDFORM.

FORM GET_ROUTE.
CLEAR: WOHCOST, WCNT.
SELECT SINGLE * FROM MAPL WHERE WERKS = ITAB-WERKS AND
MATNR = ITAB-IDNRK AND
LOEKZ NE 'X'.
IF SY-SUBRC EQ 0.
SELECT * FROM PLAS WHERE PLNNR = MAPL-PLNNR AND
PLNAL = MAPL-PLNAL AND
DATUV LE SY-DATUM AND
LOEKZ NE 'X'.
SELECT * FROM PLPO WHERE PLNNR = PLAS-PLNNR AND
PLNKN = PLAS-PLNKN.
SELECT SINGLE * FROM CRHD WHERE OBJID = PLPO-ARBID.
SELECT SINGLE * FROM CRCO WHERE OBJTY = 'A' AND
OBJID = PLPO-ARBID AND
BEGDA LE SY-DATUM AND
ENDDA GE SY-DATUM.
CLEAR ITAB2.
MOVE ITAB-CNT TO ITAB2-CNT.
MOVE ITAB-LEVEL TO ITAB2-LEVEL.
MOVE PLPO-VORNR TO ITAB2-VORNR.
MOVE CRHD-ARBPL TO ITAB2-ARBPL.
MOVE PLPO-BMSCH TO ITAB2-BMSCH.
ITAB2-AUSSS = MARC-AUSSS.
ITAB2-SBASE = S_BASE.
IF PLPO-LAR01 CO SPACE.
WLAR = 'DL'.
ELSE.
WLAR = PLPO-LAR01.
ENDIF.
WVGW = PLPO-VGW01.
WVGE = PLPO-VGE01.
PERFORM MLCOST.
IF PLPO-LAR02 CO SPACE.
WLAR = 'TOOLST'.
ELSE.
WLAR = PLPO-LAR02.
ENDIF.
WVGW = PLPO-VGW02.
WVGE = PLPO-VGE02.
PERFORM MLCOST.
IF PLPO-LAR03 CO SPACE.
WLAR = 'MSU'.
ELSE.
WLAR = PLPO-LAR03.
ENDIF.
WVGW = PLPO-VGW03.
WVGE = PLPO-VGE03.
PERFORM MLCOST.
IF PLPO-LAR04 CO SPACE.
WLAR = 'AST'.
ELSE.
WLAR = PLPO-LAR04.
ENDIF.
WVGW = PLPO-VGW04.
WVGE = PLPO-VGE04.
PERFORM MLCOST.
ITAB2-OHCOST = ITAB2-WDL + ITAB2-WMSU + ITAB2-WTS +
ITAB2-WAST + ITAB2-WOTH.
WOHCOST = WOHCOST + ITAB2-OHCOST.
WCNT = WCNT + 1.
ITAB2-SUBCNT = WCNT.
APPEND ITAB2.
ENDSELECT.
ENDSELECT.
ENDIF.
ENDFORM.

FORM MLCOST.
SELECT SINGLE * FROM CSSL WHERE KOKRS = CRCO-KOKRS AND
KOSTL = CRCO-KOSTL AND
GJAHR = WGJAHR AND
LSTAR = WLAR.
IF SY-SUBRC EQ 0.
SELECT * FROM COST WHERE OBJNR = CSSL-OBJNR AND
GJAHR = WGJAHR.
IF WVGE = 'MIN'.
WVGW = WVGW / 60.
ENDIF.
IF WLAR = 'AST'.
ITAB2-WASTH = WVGW.
ITAB2-WASTR = COST-TKG012.
ITAB2-WAST = WVGW * COST-TKG012.
ELSEIF WLAR = 'TOOLST'.
ITAB2-WTSH = WVGW.
ITAB2-WTSR = COST-TKG012.
ITAB2-WTS = WVGW * COST-TKG012.
ELSEIF WLAR = 'DL'.
ITAB2-WDLH = WVGW.
ITAB2-WDLR = COST-TKG012.
ITAB2-WDL = ( WVGW * COST-TKG012 * S_BASE ) / PLPO-BMSCH.
ELSEIF WLAR = 'MSU'.
ITAB2-WMSUH = WVGW.
ITAB2-WMSUR = COST-TKG012.
ITAB2-WMSU = ( WVGW * S_BASE * COST-TKG012 ) / PLPO-BMSCH.
ELSE.
ITAB2-WOTHA = WLAR.
ITAB2-WOTHH = WVGW.
ITAB2-WOTHR = COST-TKG012.
ITAB2-WOTH = ( WVGW * S_BASE * COST-TKG012 ) / PLPO-BMSCH.
ENDIF.
ENDSELECT.
ENDIF.
ENDFORM.

FORM GET_SUBC.
CLEAR ITAB2.
IF MARC-SOBSL = 30 AND
MARC-BESKZ = 'F'.
SELECT SINGLE * FROM EINA WHERE MATNR = ITAB-IDNRK AND
LOEKZ NE 'X'.
IF SY-SUBRC EQ 0.
SELECT SINGLE * FROM EINE WHERE INFNR = EINA-INFNR AND
WERKS = ITAB-WERKS AND
ESOKZ = '3'.
IF SY-SUBRC EQ 0.
WCONV = ( EINE-BPUMN / EINE-BPUMZ ) * EINE-PEINH.
IF EINA-UMREN NE EINA-UMREZ.
WCONV = WCONV / EINA-UMREN * EINA-UMREZ.
ENDIF.
ITAB2-EXCOST = ( EINE-NETPR / WCONV ) * S_BASE.
ITAB2-LIFNR = EINA-LIFNR.
ITAB2-NETPR = EINE-NETPR.
ITAB2-PEINH = EINE-PEINH.
MOVE ITAB-CNT TO ITAB2-CNT.
MOVE ITAB-LEVEL TO ITAB2-LEVEL.
MOVE '9999' TO ITAB2-VORNR.
ITAB2-SUBCNT = 1.
APPEND ITAB2.
WEXCOST = ITAB2-EXCOST.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.