0% found this document useful (0 votes)
3 views27 pages

ZFI Cost Sheet Report Analysis

R1 Code ABAP SAP

Uploaded by

Rajat Dubey
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
3 views27 pages

ZFI Cost Sheet Report Analysis

R1 Code ABAP SAP

Uploaded by

Rajat Dubey
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

*&---------------------------------------------------------------------*

*& Report ZFI_COST_SHEET


*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfi_cost_sheet_cp..

INCLUDE zfit_cost_sheet_top_cp.
INCLUDE zfit_cost_sheet_sel_cp.
INCLUDE zfit_cost_sheet_detail_cp.

*--------------------------------------------------------------------*
*&---------------------------------------------------------------------*
******** START OF SELECTION EVENT ********************************
*&---------------------------------------------------------------------*
START-OF-SELECTION.

PERFORM get_data.
PERFORM generate_alv_fieldcat.
PERFORM sub_eventtab_build USING t_events.
PERFORM sub_comment_build USING t_list_top_of_page.
PERFORM set_cell_colours.
PERFORM alv_show.

*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .
DATA: t_list TYPE abaplist OCCURS 0.
DATA: lt_ascii TYPE TABLE OF soli.
FIELD-SYMBOLS <lt_pay_data> TYPE table.
DATA lr_pay_data TYPE REF TO data.
DATA itab TYPE REF TO data.

r_matnr_ss[] = s_matnr[].

SELECT * FROM zmmt_prod_cc INTO TABLE @DATA(it_prdcc) WHERE matnr IN @s_matnr AND werks IN @s_plant.
SELECT * FROM zmmt_oper_idend INTO TABLE it_opid.
SELECT * FROM zmmt_oper_cost INTO TABLE @DATA(it_glcc) FOR ALL ENTRIES IN @it_prdcc WHERE prodcc = @it_p
rdcc-kostl.
SELECT * FROM zmmt_oper_cost1 INTO TABLE @DATA(it_gl)." where PRODCC = @i_tab-KOSTL.
* SELECT * FROM zmmt_mat_cost INTO TABLE @DATA(it_mat) WHERE gjahr = @p_spmon+0(4).
SELECT * FROM zmmt_mat_cost INTO TABLE @DATA(it_mat) WHERE gjahr IN @s_gjahr.

DATA: i_acdoca1 TYPE STANDARD TABLE OF ts_acdoca.


DATA: ls_prdcc TYPE zmmt_prod_cc.
* READ TABLE it_prdcc INTO ls_prdcc WITH KEY werks = s_plant-low matnr = s_matnr-low.
LOOP AT it_prdcc INTO ls_prdcc WHERE werks = s_plant-low AND matnr = s_matnr-low.
SELECT rbukrs,
racct,
gjahr,
rcntr,
SUM( hsl ) AS hsl
1
FROM acdoca INTO TABLE @DATA(i_acdoca) " FOR ALL ENTRIES IN @iT_PRDCC
WHERE rldnr = '0L'
AND rbukrs IN @s_bukrs
AND rcntr = @ls_prdcc-kostl
* AND poper = @p_spmon+4(3)
* AND gjahr = @p_spmon+0(4)
AND poper IN @s_spmon"add krj
AND gjahr IN @s_gjahr"add krj
* AND drcrk = 'S'
GROUP BY rbukrs, racct, gjahr, rcntr.
APPEND LINES OF i_acdoca TO i_acdoca1.
REFRESH: i_acdoca[].
CLEAR: ls_prdcc.
ENDLOOP.
IF i_acdoca1[] IS NOT INITIAL.
i_acdoca[] = i_acdoca1[].
DELETE i_acdoca WHERE hsl EQ '0.00'.
ENDIF.

"added by krj
LOOP AT s_spmon.
IF s_spmon-high IS NOT INITIAL.
s_gjper-sign = 'I'.
s_gjper-option = 'BT'.
CONCATENATE s_gjahr-low s_spmon-low INTO s_gjper-low.
CONCATENATE s_gjahr-low s_spmon-high INTO s_gjper-high.
APPEND s_gjper.
ELSE.
s_gjper-sign = 'I'.
s_gjper-option = 'EQ'.
CONCATENATE s_gjahr-low s_spmon-low INTO s_gjper-low.
APPEND s_gjper.
ENDIF.
ENDLOOP.
"end by krj

* SELECT rbukrs,
* gjahr,
* rcntr,
* SUM( hsl ) AS hsl
* FROM acdoca INTO TABLE @DATA(i_acdoca2) " FOR ALL ENTRIES IN @iT_PRDCC
* WHERE rldnr = '0L'
* AND rbukrs IN @s_bukrs
* AND rcntr = @ls_prdcc-kostl
* AND poper = @p_spmon+4(3)
* AND gjahr = @p_spmon+0(4)
** AND drcrk = 'S'
* GROUP BY rbukrs, gjahr, rcntr.
* IF sy-subrc = 0.
*
* READ TABLE i_acdoca2 ASSIGNING FIELD-SYMBOL(<fs_1>) INDEX 1.
* IF sy-subrc EQ 0.
* tot_ix = <fs_1>-hsl.
2
* ENDIF.
* ENDIF.

* loop at i_acdoca into DATA(w_acdoca).


* READ TABLE iT_PRDCC into DATA(w_data) WITH KEY gl = w_acdoca-racct PRODCC = w_acdoca-racct.
* if sy-subrc = 0.
* endif.
* ENDLOOP.

DATA: lv_sum TYPE wertv12,


lv_sum_fc TYPE wertv12,
lv_sum_vc TYPE wertv12,
ls_glbal TYPE t_glbal.

CLEAR ls_glbal.

SORT it_gl BY gl.


LOOP AT i_acdoca ASSIGNING FIELD-SYMBOL(<fs5>).
READ TABLE it_glcc INTO DATA(ls_glcc) WITH KEY prodcc = ls_prdcc-kostl gl = <fs5>-racct.
IF sy-subrc EQ 0.
ls_glbal-id = ls_glcc-id.
ls_glbal-fc = ls_glcc-fc.
ls_glbal-vc = ls_glcc-vc.
ELSE.
READ TABLE it_gl INTO DATA(ls_gl) WITH KEY gl = <fs5>-racct BINARY SEARCH.
IF sy-subrc EQ 0.
ls_glbal-id = ls_gl-id.
ls_glbal-fc = ls_gl-fc.
ls_glbal-vc = ls_gl-vc.
ENDIF.
ENDIF.
ls_glbal-racct = <fs5>-racct.
ls_glbal-hsl = <fs5>-hsl.
IF ls_glbal-id IS NOT INITIAL.
APPEND ls_glbal TO i_glbal1.
ENDIF.
CLEAR: ls_glbal, ls_glcc, ls_gl.
ENDLOOP.

UNASSIGN <fs5>.

SORT i_glbal1 BY id.

DATA: ls_glbal1 TYPE t_glbal.

LOOP AT i_glbal1 INTO ls_glbal.


ls_glbal1 = ls_glbal.
lv_sum = lv_sum + ls_glbal-hsl.
lv_sum_fc = lv_sum_fc + ( ls_glbal-hsl * ls_glbal-fc ) / 100.
lv_sum_vc = lv_sum_vc + ( ls_glbal-hsl * ls_glbal-vc ) / 100.

AT END OF id.
3
ls_glbal1-hsl = lv_sum.
ls_glbal1-hsl_fc = lv_sum_fc.
ls_glbal1-hsl_vc = lv_sum_vc.
APPEND ls_glbal1 TO i_glbal.
CLEAR: ls_glbal1, lv_sum, lv_sum_fc, lv_sum_vc.
ENDAT.
CLEAR: ls_glbal.
ENDLOOP.

SELECT SUM( d~menge ) AS qty, d~mblnr, d~matnr, d~aufnr, d~bwart


INTO TABLE @DATA(it_finaltab1)
FROM matdoc AS d INNER JOIN mara AS m ON d~matnr EQ m~matnr
WHERE d~matnr IN @s_matnr
AND d~werks IN @s_plant
AND d~bukrs IN @s_bukrs
* AND d~gjper = @p_spmon
AND d~gjper IN @s_gjper
AND d~menge NE 0
AND d~bwart IN ( '101', '102', '131', '132' )
GROUP BY d~werks, d~matnr, d~aufnr, d~mblnr, d~bwart.

LOOP AT it_finaltab1 INTO DATA(wa_int).


IF wa_int-bwart EQ '101' OR wa_int-bwart EQ '131'.
qty = wa_int-qty + qty.
ELSEIF wa_int-bwart EQ '102' OR wa_int-bwart EQ '132'.
qty = ( wa_int-qty * -1 ) + qty.
ENDIF.
CLEAR: wa_int.
ENDLOOP.

IF it_finaltab1 IS NOT INITIAL.


SELECT d~matnr AS material, d~gjper, "Changed
d~menge AS qty, d~werks AS plant,
d~bwart AS movment_type,
d~meins AS unit, d~mblnr, d~dmbtr
FROM matdoc AS d
INTO TABLE @DATA(it_finaltab)
FOR ALL ENTRIES IN @it_finaltab1
WHERE d~aufnr = @it_finaltab1-aufnr
* AND d~gjper = @p_spmon
AND d~gjper IN @s_gjper
AND d~menge NE 0
AND d~bwart IN ( '261', '262', '531', '532' ).

SORT it_finaltab BY material gjper. "Changed

ENDIF.

DATA: lt_seltab TYPE STANDARD TABLE OF rsparams.


TYPES: BEGIN OF ty_output,
matnr TYPE matnr,
stprs TYPE stprs,
pvprs TYPE ck_pvprs_1,
4
vprsv TYPE vprsv,
peinh TYPE peinh,
mtart TYPE mtart,
* PSPNR TYPE PS_PSP_PNR,
* VBELN TYPE VBELN,
gjper TYPE matdoc-gjper,
END OF ty_output.
DATA: poper TYPE acdoca-poper,
poper1 TYPE acdoca-poper.
DATA: output TYPE STANDARD TABLE OF ty_output,
output1 TYPE STANDARD TABLE OF ty_output..
DATA: ls_seltab TYPE rsparams,
gjper1 TYPE matdoc-gjper.
DATA: lo_class TYPE REF TO zcl_cost_sheet_s99.
CREATE OBJECT lo_class.
**BREAK-POINT.
* LOOP AT s_gjper.
* IF s_gjper-high IS NOT INITIAL.
* DATA(num) = s_gjper-high - s_gjper-low.
* num = num + 1.
* ELSE.
* CLEAR: num.
* num = num + 1.
* ENDIF.
**BREAK-POINT.
* DO num TIMES.
* IF sy-tabix = 1.
* gjper1 = s_gjper-low.
** ELSEIF num >= 2.
* ELSEIF num > 2.
** gjper1 = s_gjper-low + 1.
* gjper1 = gjper1 + 1.
* ELSE.
* gjper1 = s_gjper-low.
* ENDIF.
CREATE OBJECT lo_class.
DATA:
lv_do TYPE acdoca-poper,
num TYPE acdoca-poper. "matdoc-gjper.
IF s_spmon-high IS NOT INITIAL.
num = s_spmon-high.
ELSEIF s_spmon-low IS NOT INITIAL.
num = s_spmon-low.
ENDIF.

CLEAR lv_do.
DO num TIMES.
lv_do = lv_do + 1.
IF lv_do = 1.
gjper1 = s_gjper-low.
ELSE.
gjper1 = gjper1 + 1.
ENDIF.
5
LOOP AT it_finaltab INTO DATA(wa) WHERE gjper = gjper1.
s_matnr-low = wa-material.
s_matnr-sign = 'I'.
s_matnr-option = 'EQ'.
APPEND s_matnr.
lt_seltab = VALUE #( BASE lt_seltab
( selname = 'R_MATNR'
kind = 'S'
sign = 'I'
option = 'EQ'
low = s_matnr-low
) ).
CLEAR: wa.
ENDLOOP.

lt_seltab = VALUE #( BASE lt_seltab


( selname = 'P_WERKS'
kind = 'P'
sign = 'I'
option = 'EQ'
low = s_plant-low )
( selname = 'P_POPER'
kind = 'P'
sign = 'I'
option = 'EQ'
low = gjper1+4(3) )
( selname = 'P_BDATJ'
kind = 'P'
sign = 'I'
option = 'EQ'
low = gjper1+0(4) )
( selname = 'R_PSPNR'
kind = 'P'
sign = 'I'
option = 'EQ'
low = space )
( selname = 'R_VBELN'
kind = 'P'
sign = 'I'
option = 'EQ'
low = space )
).

CALL METHOD lo_class->detail


EXPORTING
it_seltab = lt_seltab
IMPORTING
output = output1.
APPEND LINES OF output1 TO output.
CLEAR: output1, lt_seltab.
ENDDO.

6
*ENDLOOP.
DATA :l_sum TYPE dmbtr.

PERFORM add_record USING 'INPUT MATERIALS' '' '' ''.


DATA(it_finaltab_1) = it_finaltab[].
SORT it_finaltab_1 BY gjper.
SORT it_finaltab BY material gjper. "Changed
DELETE ADJACENT DUPLICATES FROM it_finaltab_1 COMPARING gjper.
*BREAK-POINT.
*loop at it_finaltab_1 into DATA(w_final).

DATA(it_finaltab_261) = it_finaltab[].
DELETE it_finaltab_261 WHERE movment_type EQ '531'.
DELETE it_finaltab_261 WHERE movment_type EQ '532'.
DELETE it_finaltab_261 WHERE movment_type EQ space.
DELETE it_finaltab_261 WHERE material+0(1) EQ '*'.

LOOP AT it_finaltab ASSIGNING FIELD-SYMBOL(<fs>) WHERE ( movment_type EQ '261' OR movment_type EQ '262' )


." and gjper = w_final-gjper.
* LOOP AT it_finaltab_261 ASSIGNING FIELD-SYMBOL(<fs>) WHERE ( movment_type EQ '261' OR movment_type
EQ '262' )." and gjper = w_final-gjper.
IF <fs>-movment_type = '262'.
<fs>-qty = <fs>-qty * -1.
<fs>-dmbtr = <fs>-dmbtr * -1.
ENDIF.
i_finaltab-matnr = <fs>-material.
i_finaltab-gjper = <fs>-gjper.
i_finaltab-uom = <fs>-unit.
i_finaltab-qty = i_finaltab-qty + <fs>-qty.
i_finaltab-tamt = i_finaltab-tamt + <fs>-dmbtr.
i_finaltab-mvmt = <fs>-movment_type.
* AT END OF material. "Changed
AT END OF gjper. "Changed
* CLEAR WA_MAT.
* BREAK-POINT.
* READ TABLE it_mat INTO DATA(wa_mat) WITH KEY gjahr = p_spmon+0(4) poper = p_spmon+4(3) matnr = i
_finaltab-matnr werks = s_plant-low.
READ TABLE it_mat INTO DATA(wa_mat) WITH KEY gjahr = <fs>-gjper+0(4) poper = <fs>-gjper+4(3) matnr = i_finalt
ab-matnr werks = s_plant-low.
IF sy-subrc EQ 0.
i_finaltab-var = ( i_finaltab-tamt * wa_mat-vc ) / 100.
i_finaltab-fix = ( i_finaltab-tamt * wa_mat-fc ) / 100.
i_finaltab-cvar = i_finaltab-var / qty.
i_finaltab-cfix = i_finaltab-fix / qty.
sqty9 = sqty9 + i_finaltab-tamt.
qty4 = i_finaltab-cvar + qty4.
qty5 = i_finaltab-cfix + qty5.
qty_4 = i_finaltab-var + qty_4.
qty_5 = i_finaltab-fix + qty_5.
CLEAR wa_mat.
ELSE.
sqty9 = sqty9 + i_finaltab-tamt.
i_finaltab-var = i_finaltab-tamt.
7
i_finaltab-cvar = i_finaltab-var / qty.
qty4 = i_finaltab-cvar + qty4.
qty_4 = i_finaltab-var + qty_4.
ENDIF.
i_finaltab-amt = i_finaltab-tamt / i_finaltab-qty.
APPEND i_finaltab.
CLEAR : i_finaltab, l_sum.
ENDAT.
ENDLOOP.
* endloop.

REFRESH it_finaltab_261.

i_finaltab-matnr = '*TOTAL MATERIAL*'.


i_finaltab-qty = qty1.
i_finaltab-tamt = sqty9.
i_finaltab-ctamt = qty1 / qty.
i_finaltab-cvar = qty4.
i_finaltab-cfix = qty5.
i_finaltab-var = qty_4.
i_finaltab-fix = qty_5.
MOVE 'C510' TO i_finaltab-linecolor.
APPEND i_finaltab.
CLEAR: i_finaltab.

CLEAR: tot_b.
PERFORM add_record USING 'HANDLING LOSS' '' '' ''.
PERFORM add_record USING '' 'HL_COAL' '' 'X'.
PERFORM add_record USING '' 'HL_IRNL' '' 'X'.
PERFORM add_record USING '' 'HL_IRNF' '' 'X'.
PERFORM add_record USING '' 'HL_LIME' '' 'X'.
PERFORM add_record USING '' 'HL_DOLO' '' 'X'.
PERFORM add_record USING 'TOT. HANDLING LOSS' '' 'TOT_B' 'P'.

PERFORM add_record USING 'GROSS MATERIAL COST' '' 'TOT_C' 'P'.

PERFORM add_record USING 'CREDIT MATERIALS' '' '' ''.


SORT it_finaltab BY material gjper. "Changed
* loop at it_finaltab_1 into w_final.
DATA(it_finaltab_531) = it_finaltab[].
DELETE it_finaltab_531 WHERE movment_type EQ '261'.
DELETE it_finaltab_531 WHERE movment_type EQ '262'.
DELETE it_finaltab_531 WHERE movment_type EQ space.
DELETE it_finaltab_531 WHERE material+0(1) EQ '*'.

* LOOP AT it_finaltab ASSIGNING FIELD-SYMBOL(<fs1>) WHERE ( movment_type EQ '531' OR movment_type EQ '


532' )." and gjper = w_final-gjper.
LOOP AT it_finaltab_531 ASSIGNING FIELD-SYMBOL(<fs1>) WHERE ( movment_type EQ '531' OR movment_type EQ '
532' )." and gjper = w_final-gjper.
IF <fs1>-movment_type = '531'.
<fs1>-qty = <fs1>-qty * -1.
<fs1>-dmbtr = <fs1>-dmbtr * -1.
ENDIF.
8
i_finaltab-uom = <fs1>-unit.
i_finaltab-matnr = <fs1>-material.
i_finaltab-gjper = <fs1>-gjper.
i_finaltab-qty = i_finaltab-qty + <fs1>-qty.
i_finaltab-tamt = i_finaltab-tamt + <fs1>-dmbtr.
i_finaltab-mvmt = <fs1>-movment_type.
** AT END OF material. "Changed
AT END OF gjper. "Changed
CLEAR wa_mat.
* READ TABLE it_mat INTO wa_mat WITH KEY gjahr = p_spmon+0(4) poper = p_spmon+4(3) matnr = i_finalt
ab-matnr werks = s_plant-low.
READ TABLE it_mat INTO wa_mat WITH KEY gjahr = <fs1>-gjper+0(4) poper = <fs1>-gjper+4(3) matnr = i_finaltab-
matnr werks = s_plant-low.
IF sy-subrc EQ 0.
i_finaltab-var = ( i_finaltab-tamt * wa_mat-vc ) / 100.
i_finaltab-fix = ( i_finaltab-tamt * wa_mat-fc ) / 100.
i_finaltab-cvar = i_finaltab-var / qty.
i_finaltab-cfix = i_finaltab-fix / qty.
sqty1 = sqty1 + i_finaltab-cvar.
sqty2 = sqty2 + i_finaltab-var.
sqty3 = sqty3 + i_finaltab-cfix.
sqty4 = sqty4 + i_finaltab-fix.
* CLEAR WA_MAT.
ELSE.
i_finaltab-var = i_finaltab-tamt.
i_finaltab-cvar = i_finaltab-tamt / qty.
sqty1 = sqty1 + i_finaltab-cvar.
sqty2 = sqty2 + i_finaltab-var.
sqty3 = sqty3 + i_finaltab-cfix.
sqty4 = sqty4 + i_finaltab-fix.
* i_finaltab-cvar = qty4.
* i_finaltab-cfix = qty5.
ENDIF.
i_finaltab-amt = i_finaltab-tamt / i_finaltab-qty.
APPEND i_finaltab.
CLEAR: i_finaltab, wa_mat.
* UNASSIGN <fs1>.
ENDAT.
ENDLOOP.
* ENDLOOP.

REFRESH it_finaltab_531.

*BREAK-POINT.
i_finaltab-matnr = '**CREDIT TOTAL*'.
i_finaltab-qty = qty2.
i_finaltab-cvar = sqty1.
i_finaltab-var = sqty2.
i_finaltab-cfix = sqty3.
i_finaltab-fix = sqty4.
MOVE 'C510' TO i_finaltab-linecolor.
APPEND i_finaltab.
9
DATA: lv_spl1 TYPE char10,
lv_spl2 TYPE char10.

DATA: lv_totamt261 TYPE wrbtr,


lv_totamt531 TYPE wrbtr,
lv_tamt TYPE wrbtr,
lv_tamt_dmbtr TYPE wrbtr,
lv_tamt_var TYPE wrbtr,
lv_var TYPE wrbtr,
lv_fix TYPE wrbtr,
lv_amt TYPE wrbtr,
lv_cvar TYPE wrbtr,
lv_cfix TYPE wrbtr.
* BREAK-POINT.
CLEAR: qty_4, qty_5,qty4, qty5,
sqty1, sqty2, sqty3, sqty4.
*BREAK-POINT.
*loop at IT_FINALTAB_1 into w_final.
****************** LOOP AT i_finaltab ASSIGNING FIELD-SYMBOL(<fs2>)." where gjper = w_final-gjper.
****************** DATA : lv_htype1 LIKE dd01v-datatype.
****************** CLEAR lv_htype1.
****************** CALL FUNCTION 'NUMERIC_CHECK'
****************** EXPORTING
****************** string_in = <fs2>-matnr
****************** IMPORTING
****************** htype = lv_htype1.
******************
****************** READ TABLE output INTO DATA(w_out) WITH KEY matnr = <fs2>-matnr gjper = <fs2>-
gjper.
****************** IF sy-subrc EQ 0 AND lv_htype1 NE 'NUMC'.
****************** LOOP AT it_finaltab_1 INTO DATA(w_final)." WHERE gjper = <fs2>-gjper.
******************* READ TABLE output INTO DATA(w_out) WITH KEY matnr = <fs2>-matnr gjper = <fs2>-
gjper.
****************** CLEAR: w_out.
****************** LOOP AT it_finaltab INTO DATA(ls_finaltab)
****************** WHERE material = <fs2>-matnr AND gjper = w_final-gjper.
****************** lv_qty_final = lv_qty_final + ls_finaltab-qty.
****************** lv_tamt_dmbtr = lv_tamt_dmbtr + ls_finaltab-dmbtr.
****************** ENDLOOP.
****************** READ TABLE output INTO w_out WITH KEY matnr = <fs2>-matnr gjper = w_final-gjper.
****************** IF sy-subrc = 0.
****************** DATA : lv_htype LIKE dd01v-datatype.
****************** CLEAR lv_htype.
****************** CALL FUNCTION 'NUMERIC_CHECK'
****************** EXPORTING
****************** string_in = <fs2>-matnr
****************** IMPORTING
****************** htype = lv_htype.
****************** IF w_out-vprsv EQ 'V' AND lv_htype NE 'NUMC'.
****************** w_out-pvprs = w_out-pvprs / w_out-peinh.
******************* <fs2>-tamt = w_out-pvprs * <fs2>-qty.
****************** lv_tamt = lv_tamt + ( w_out-pvprs * lv_qty_final ).
10
****************** lv_tamt_var = lv_tamt_var + ( w_out-pvprs * lv_qty_final ).
****************** lv_amt = w_out-pvprs.
****************** ELSEIF w_out-vprsv EQ 'S' AND lv_htype NE 'NUMC'.
****************** w_out-stprs = w_out-stprs / w_out-peinh.
******************* <fs2>-tamt = w_out-stprs * <fs2>-qty.
****************** lv_tamt = lv_tamt + ( w_out-stprs * lv_qty_final ).
****************** lv_tamt_var = lv_tamt_var + ( w_out-stprs * lv_qty_final ).
****************** lv_amt = w_out-stprs.
******************** <fs2>-amt = w_out-stprs.
****************** ELSEIF lv_htype EQ 'NUMC'.
****************** <fs2>-amt = <fs2>-tamt / <fs2>-qty.
****************** lv_tamt = lv_tamt + lv_tamt_dmbtr.
****************** lv_tamt_var = lv_tamt_var + lv_tamt_dmbtr.
****************** ENDIF.
******************* READ TABLE it_mat INTO wa_mat WITH KEY gjahr = p_spmon+0(4) poper = p_sp
mon+4(3) matnr = <fs2>-matnr werks = s_plant-low.
****************** READ TABLE it_mat INTO wa_mat WITH KEY gjahr = <fs2>-gjper+0(4)
******************* poper = <fs2>-gjper+4(3) matnr = <fs2>-matnr werks = s_plant-low.
****************** poper = w_final-gjper+4(3) matnr = <fs2>-matnr werks = s_plant-low.
****************** IF sy-subrc EQ 0.
******************* <fs2>-var = ( <fs2>-tamt * wa_mat-vc ) / 100.
****************** lv_var = lv_var + ( lv_tamt_var * wa_mat-vc ) / 100.
******************* <fs2>-fix = ( <fs2>-tamt * wa_mat-fc ) / 100.
****************** lv_fix = lv_fix + ( lv_tamt_var * wa_mat-fc ) / 100.
******************* <fs2>-cvar = <fs2>-var / qty.
******************* <fs2>-cfix = <fs2>-fix / qty.
******************* CLEAR WA_MAT.
****************** ELSE.
******************* <fs2>-var = <fs2>-tamt.
****************** lv_var = lv_var + lv_tamt_var.
******************* <fs2>-cvar = <fs2>-tamt / qty.
****************** ENDIF.
****************** "krj 07.09.25
******************* lv_cvar = <fs2>-cvar + lv_cvar.
******************* lv_cfix = <fs2>-cfix + lv_cfix.
******************** IF ( <fs2>-mvmt = '261' OR <fs2>-mvmt = '262' ).
******************** lv_totamt261 = lv_totamt261 + <fs2>-tamt.
******************** qty_4 = qty_4 + <fs2>-var.
******************** qty_5 = qty_5 + <fs2>-fix.
******************** qty4 = qty4 + <fs2>-cvar.
******************** qty5 = qty5 + <fs2>-cfix.
******************** ELSEIF ( <fs2>-mvmt = '531' OR <fs2>-mvmt = '532' ).
******************** lv_totamt531 = lv_totamt531 + <fs2>-tamt.
******************** sqty4 = sqty4 + <fs2>-fix.
******************** sqty2 = sqty2 + <fs2>-var.
******************** sqty3 = sqty3 + <fs2>-cfix.
******************** sqty1 = sqty1 + <fs2>-cvar.
******************** ENDIF.
********************* IF <fs2>-tamt NE '0.00' AND <fs2>-qty NE '0.00'.
********************* <fs2>-amt = <fs2>-tamt / <fs2>-qty.
********************* ENDIF.
******************** IF <fs2>-tamt NE '0.00' AND qty NE '0.00'.
********************* <fs2>-ctamt = <fs2>-tamt / qty1.
11
******************** <fs2>-ctamt = <fs2>-tamt / qty.
******************** ENDIF.
******************** IF qty NE '0.00' AND <fs2>-qty NE '0.00'.
********************* <fs2>-ucurr = <fs2>-qty / qty1.
******************** <fs2>-ucurr = <fs2>-qty / qty.
******************** ENDIF.
****************** ENDIF.
****************** CLEAR: w_out, lv_qty_final,lv_tamt_var.
****************** ENDLOOP.
****************** <fs2>-tamt = lv_tamt.
****************** <fs2>-amt = lv_tamt / <fs2>-qty.
****************** <fs2>-var = lv_var.
****************** <fs2>-fix = lv_fix.
****************** <fs2>-cvar = <fs2>-var / qty.
****************** <fs2>-cfix = <fs2>-fix / qty.
****************** CLEAR: lv_tamt,lv_var,lv_fix,lv_tamt_dmbtr.
****************** IF ( <fs2>-mvmt = '261' OR <fs2>-mvmt = '262' ).
****************** lv_totamt261 = lv_totamt261 + <fs2>-tamt.
****************** qty_4 = qty_4 + <fs2>-var.
****************** qty_5 = qty_5 + <fs2>-fix.
****************** qty4 = qty4 + <fs2>-cvar.
****************** qty5 = qty5 + <fs2>-cfix.
****************** ELSEIF ( <fs2>-mvmt = '531' OR <fs2>-mvmt = '532' ).
****************** lv_totamt531 = lv_totamt531 + <fs2>-tamt.
****************** sqty4 = sqty4 + <fs2>-fix.
****************** sqty2 = sqty2 + <fs2>-var.
****************** sqty3 = sqty3 + <fs2>-cfix.
****************** sqty1 = sqty1 + <fs2>-cvar.
****************** ENDIF.
******************* IF <fs2>-tamt NE '0.00' AND <fs2>-qty NE '0.00'.
******************* <fs2>-amt = <fs2>-tamt / <fs2>-qty.
******************* ENDIF.
****************** IF <fs2>-tamt NE '0.00' AND qty NE '0.00'.
******************* <fs2>-ctamt = <fs2>-tamt / qty1.
****************** <fs2>-ctamt = <fs2>-tamt / qty.
****************** ENDIF.
****************** IF qty NE '0.00' AND <fs2>-qty NE '0.00'.
******************* <fs2>-ucurr = <fs2>-qty / qty1.
****************** <fs2>-ucurr = <fs2>-qty / qty.
****************** ENDIF.
****************** ELSEIF sy-subrc EQ 0 AND lv_htype1 EQ 'NUMC'. " Raw-Material Cost
****************** IF <fs2>-tamt NE '0.00' AND qty NE '0.00'.
****************** <fs2>-ctamt = <fs2>-tamt / qty.
****************** ENDIF.
****************** IF qty NE '0.00' AND <fs2>-qty NE '0.00'.
****************** <fs2>-ucurr = <fs2>-qty / qty.
****************** ENDIF.
****************** IF ( <fs2>-mvmt = '531' OR <fs2>-mvmt = '532' ).
****************** lv_totamt531 = lv_totamt531 + <fs2>-tamt.
****************** ELSEIF ( <fs2>-mvmt = '261' OR <fs2>-mvmt = '262' ).
****************** lv_totamt261 = lv_totamt261 + <fs2>-tamt.
****************** ENDIF.
****************** ENDIF.
12
****************** ENDLOOP.
i_finaltab1[] = i_finaltab[].
LOOP AT i_finaltab1 ASSIGNING FIELD-SYMBOL(<fs2>)." where gjper = w_final-gjper.
DATA : lv_htype1 LIKE dd01v-datatype.
CLEAR lv_htype1.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = <fs2>-matnr
IMPORTING
htype = lv_htype1.

READ TABLE output INTO DATA(w_out) WITH KEY matnr = <fs2>-matnr gjper = <fs2>-gjper.
IF sy-subrc EQ 0 AND lv_htype1 NE 'NUMC'.
** LOOP AT it_finaltab_1 INTO DATA(w_final)." WHERE gjper = <fs2>-gjper.
*** READ TABLE output INTO DATA(w_out) WITH KEY matnr = <fs2>-matnr gjper = <fs2>-gjper.
** CLEAR: w_out.
** lv_qty_final = lv_qty_final + <fs2>-qty.
** lv_tamt_dmbtr = lv_tamt_dmbtr + <fs2>-dmbtr.
READ TABLE output INTO w_out WITH KEY matnr = <fs2>-matnr gjper = <fs2>-gjper.
IF sy-subrc = 0.
DATA : lv_htype LIKE dd01v-datatype.
CLEAR lv_htype.
CALL FUNCTION 'NUMERIC_CHECK'
EXPORTING
string_in = <fs2>-matnr
IMPORTING
htype = lv_htype.
IF w_out-vprsv EQ 'V' AND lv_htype NE 'NUMC'.
w_out-pvprs = w_out-pvprs / w_out-peinh.
<fs2>-tamt = w_out-pvprs * <fs2>-qty.
* lv_tamt = lv_tamt + ( w_out-pvprs * <fs2>-qty ).
lv_tamt_var = lv_tamt_var + ( w_out-pvprs * <fs2>-qty ).
lv_amt = <fs2>-amt = w_out-pvprs.
ELSEIF w_out-vprsv EQ 'S' AND lv_htype NE 'NUMC'.
w_out-stprs = w_out-stprs / w_out-peinh.
<fs2>-tamt = w_out-stprs * <fs2>-qty.
* lv_tamt = lv_tamt + ( w_out-stprs * <fs2>-qty ).
lv_tamt_var = lv_tamt_var + ( w_out-stprs * <fs2>-qty ).
lv_amt = <fs2>-amt = w_out-stprs.
** <fs2>-amt = w_out-stprs.
ELSEIF lv_htype EQ 'NUMC'.
<fs2>-amt = <fs2>-tamt / <fs2>-qty.
lv_tamt = lv_tamt + lv_tamt_dmbtr.
lv_tamt_var = lv_tamt_var + lv_tamt_dmbtr.
ENDIF.
* READ TABLE it_mat INTO wa_mat WITH KEY gjahr = p_spmon+0(4) poper = p_spmon+4(3) matnr = <fs2
>-matnr werks = s_plant-low.
READ TABLE it_mat INTO wa_mat WITH KEY gjahr = <fs2>-gjper+0(4)
* poper = <fs2>-gjper+4(3) matnr = <fs2>-matnr werks = s_plant-low.
poper = <fs2>-gjper+4(3) matnr = <fs2>-matnr werks = s_plant-low.
IF sy-subrc EQ 0.
<fs2>-var = ( <fs2>-tamt * wa_mat-vc ) / 100.
* <fs2>-var = lv_var + ( lv_tamt_var * wa_mat-vc ) / 100.
13
<fs2>-fix = ( <fs2>-tamt * wa_mat-fc ) / 100.
* <fs2>-fix = lv_fix + ( lv_tamt_var * wa_mat-fc ) / 100.
* <fs2>-cvar = <fs2>-var / qty.
* <fs2>-cfix = <fs2>-fix / qty.
* CLEAR WA_MAT.
ELSE.
<fs2>-var = <fs2>-tamt.
* lv_var = lv_var + lv_tamt_var.
* <fs2>-cvar = <fs2>-tamt / qty.
ENDIF.
ENDIF.
CLEAR: w_out, lv_qty_final,lv_tamt_var.
** ENDLOOP. "Extra internal loop commented
* <fs2>-tamt = lv_tamt.
* <fs2>-amt = lv_tamt / <fs2>-qty.
* <fs2>-var = lv_var.
* <fs2>-fix = lv_fix.
* <fs2>-cvar = <fs2>-var / qty.
* <fs2>-cfix = <fs2>-fix / qty.
* CLEAR: lv_tamt,lv_var,lv_fix,lv_tamt_dmbtr.
IF ( <fs2>-mvmt = '261' OR <fs2>-mvmt = '262' ).
lv_totamt261 = lv_totamt261 + <fs2>-tamt.
qty_4 = qty_4 + <fs2>-var.
qty_5 = qty_5 + <fs2>-fix.
qty4 = qty4 + <fs2>-cvar.
qty5 = qty5 + <fs2>-cfix.
ELSEIF ( <fs2>-mvmt = '531' OR <fs2>-mvmt = '532' ).
lv_totamt531 = lv_totamt531 + <fs2>-tamt.
sqty4 = sqty4 + <fs2>-fix.
sqty2 = sqty2 + <fs2>-var.
sqty3 = sqty3 + <fs2>-cfix.
sqty1 = sqty1 + <fs2>-cvar.
ENDIF.
* IF <fs2>-tamt NE '0.00' AND <fs2>-qty NE '0.00'.
* <fs2>-amt = <fs2>-tamt / <fs2>-qty.
* ENDIF.
IF <fs2>-tamt NE '0.00' AND qty NE '0.00'.
* <fs2>-ctamt = <fs2>-tamt / qty1.
<fs2>-ctamt = <fs2>-tamt / qty.
ENDIF.
IF qty NE '0.00' AND <fs2>-qty NE '0.00'.
* <fs2>-ucurr = <fs2>-qty / qty1.
<fs2>-ucurr = <fs2>-qty / qty.
ENDIF.
ELSEIF sy-subrc EQ 0 AND lv_htype1 EQ 'NUMC'. " Raw-Material Cost
IF <fs2>-tamt NE '0.00' AND qty NE '0.00'.
<fs2>-ctamt = <fs2>-tamt / qty.
ENDIF.
IF qty NE '0.00' AND <fs2>-qty NE '0.00'.
<fs2>-ucurr = <fs2>-qty / qty.
ENDIF.
IF ( <fs2>-mvmt = '531' OR <fs2>-mvmt = '532' ).
lv_totamt531 = lv_totamt531 + <fs2>-tamt.
14
ELSEIF ( <fs2>-mvmt = '261' OR <fs2>-mvmt = '262' ).
lv_totamt261 = lv_totamt261 + <fs2>-tamt.
ENDIF.
ENDIF.
ENDLOOP.

********* Cummulation
*DELETE ADJACENT DUPLICATES FROM I_FINALTAB COMPARING MATNR MVMT.

DATA: "wa_data1 TYPE t_finaltab,


i_finaltab_tmp TYPE STANDARD TABLE OF t_finaltab WITH EMPTY KEY.

TYPES: BEGIN OF ty_key,


matnr TYPE matnr,
bwart TYPE bwart,
END OF ty_key.

DATA: lt_seen TYPE HASHED TABLE OF ty_key WITH UNIQUE KEY matnr bwart,
wa_key TYPE ty_key,
flag_seen.

CLEAR flag_seen.
LOOP AT i_finaltab INTO DATA(wa_data1).
wa_key-matnr = wa_data1-matnr.
wa_key-bwart = wa_data1-mvmt.
IF wa_key-bwart EQ '261' OR wa_key-bwart EQ '262'.
wa_key-bwart = '261'.
ELSEIF wa_key-bwart EQ '531' OR wa_key-bwart EQ '532'.
wa_key-bwart = '531'.
ENDIF.

READ TABLE lt_seen WITH KEY matnr = wa_key-matnr


bwart = wa_key-bwart
TRANSPORTING NO FIELDS.
IF sy-subrc <> 0.
APPEND wa_data1 TO i_finaltab_tmp.
INSERT wa_key INTO TABLE lt_seen.
ENDIF.

ENDLOOP.

i_finaltab[] = i_finaltab_tmp[].
REFRESH i_finaltab_tmp.

********************************** End of Duplicate Records


CLEAR: lv_totamt261, lv_totamt531.
CLEAR: qty_4, qty_5, qty4, qty5, sqty4, sqty2, sqty3, sqty1.

DATA(lv_matval) = i_finaltab-tamt.
DATA(lv_qty) = i_finaltab-qty.
DATA(lv_fix_1) = i_finaltab-fix.
15
DATA(lv_var_1) = i_finaltab-var.
DATA(lv_ctamt_sum) = i_finaltab-ctamt.
CLEAR: lv_matval, lv_qty, lv_fix_1, lv_var_1,lv_ctamt_sum.

LOOP AT i_finaltab1 INTO DATA(wa_fintab) WHERE ( matnr+0(1) NE '*' AND mvmt IS NOT INITIAL ). "( mvmt is NOT I
NITIAL AND MVMT CN '***' ).
AT NEW matnr.
CLEAR: lv_matval, lv_qty, lv_fix_1, lv_var_1.
ENDAT.

lv_matval = lv_matval + wa_fintab-tamt.


lv_qty = lv_qty + wa_fintab-qty.
lv_fix_1 = lv_fix_1 + wa_fintab-fix.
lv_var_1 = lv_var_1 + wa_fintab-var.

AT END OF matnr.
DATA(lv_flag) = 'X'.
ENDAT.

IF lv_flag = 'X'.
READ TABLE i_finaltab ASSIGNING FIELD-SYMBOL(<fs_3>) WITH KEY matnr = wa_fintab-matnr mvmt = wa_fintab-
mvmt.
IF sy-subrc NE 0.
READ TABLE i_finaltab ASSIGNING <fs_3> WITH KEY matnr = wa_fintab-matnr mvmt = ( wa_fintab-mvmt + 1 ).
IF sy-subrc NE 0.
READ TABLE i_finaltab ASSIGNING <fs_3> WITH KEY matnr = wa_fintab-matnr mvmt = ( wa_fintab-mvmt - 1 ).
IF sy-subrc NE 0.
ELSE.
DATA(lv_flag_3) = 'X'.
ENDIF.
ELSE.
lv_flag_3 = 'X'.
ENDIF.
ELSE.
lv_flag_3 = 'X'.
ENDIF.
IF sy-subrc EQ 0 AND lv_flag_3 = 'X'.
CLEAR lv_flag_3.
<fs_3>-tamt = lv_matval.
<fs_3>-qty = lv_qty.
<fs_3>-var = lv_fix_1.
<fs_3>-fix = lv_var_1.
<fs_3>-amt = lv_matval / lv_qty.
<fs_3>-cvar = lv_fix_1 / qty.
<fs_3>-cfix = lv_var_1 / qty.
<fs_3>-ctamt = lv_matval / qty.
* LV_CTAMT_SUM = ( LV_CTAMT_SUM + <FS_3>-CTAMT ).
<fs_3>-ucurr = lv_qty / qty.
<fs_3>-mvmt = wa_fintab-mvmt.

IF ( <fs_3>-mvmt = '261' OR <fs_3>-mvmt = '262' ).


lv_totamt261 = lv_totamt261 + <fs_3>-tamt.
qty_4 = qty_4 + <fs_3>-var.
16
qty_5 = qty_5 + <fs_3>-fix.
qty4 = qty4 + <fs_3>-cvar.
qty5 = qty5 + <fs_3>-cfix.
ELSEIF ( <fs_3>-mvmt = '531' OR <fs_3>-mvmt = '532' ).
lv_totamt531 = lv_totamt531 + <fs_3>-tamt.
sqty4 = sqty4 + <fs_3>-fix.
sqty2 = sqty2 + <fs_3>-var.
sqty3 = sqty3 + <fs_3>-cfix.
sqty1 = sqty1 + <fs_3>-cvar.
ENDIF.
ENDIF. "End Read
CLEAR lv_flag.
ENDIF. "End Flag.
**MATNR
**UOM
**AMT
**VAR
**FIX
**TAMT
**CVAR
**CFIX
**CTAMT
**QTY
**UCURR
**MVMT
**GJPER

ENDLOOP.

***********************EndSet
*endloop.

UNASSIGN <fs2>.
*BREAK-POINT.
READ TABLE i_finaltab ASSIGNING <fs2> WITH KEY matnr = '*TOTAL MATERIAL*'.
IF sy-subrc EQ 0.
CLEAR: <fs2>-qty, <fs2>-uom, <fs2>-cvar, <fs2>-cfix.
<fs2>-tamt = lv_totamt261.
<fs2>-ctamt = <fs2>-tamt / qty.
* <fs2>-ctamt = LV_CTAMT_SUM.
tot_4 = <fs2>-cvar = qty4.
tot_5 = <fs2>-cfix = qty5.
tot_6 = <fs2>-var = qty_4.
tot_7 = <fs2>-fix = qty_5.
ENDIF.
* CLEAR: qty4, qty5, qty_4, qty_5.
READ TABLE i_finaltab ASSIGNING <fs2> WITH KEY matnr = '**CREDIT TOTAL*'.
IF sy-subrc EQ 0.
CLEAR: <fs2>-qty, <fs2>-uom, <fs2>-cvar, <fs2>-cfix.
<fs2>-tamt = lv_totamt531.
<fs2>-ctamt = <fs2>-tamt / qty.
<fs2>-cvar = sqty1.
<fs2>-cfix = sqty3.
17
<fs2>-var = sqty2.
<fs2>-fix = sqty4.
ENDIF.
* CLEAR: qty6, qty7, qty_6, qty_7.
***MATERIAL COST DERIVATIONS.
CLEAR: tot_a, tot_c, tot_d, tot_e.
tot_a = lv_totamt261.
tot_c = tot_a + tot_b.
tot_d = lv_totamt531.
tot_e = tot_c + tot_d.
tot_16 = i_finaltab-fix = tot_7 + tot_11 + sqty4.
tot_17 = i_finaltab-var = tot_10 + tot_6 + sqty2.
tot_18 = i_finaltab-cfix = tot_5 + tot_9 + sqty3.
tot_19 = i_finaltab-cvar = tot_4 + tot_8 + sqty1.
READ TABLE i_finaltab ASSIGNING <fs2> WITH KEY matnr = '**GROSS MATERIAL COST*'.
IF sy-subrc EQ 0.
CLEAR: <fs2>-qty, <fs2>-uom.
<fs2>-tamt = tot_a + tot_b. "lv_totamt531.
<fs2>-ctamt = <fs2>-tamt / qty.
tot_12 = <fs2>-cvar = tot_4 + tot_8.
tot_13 = <fs2>-cfix = tot_5 + tot_9.
tot_14 = <fs2>-var = tot_6 + tot_10.
tot_15 = <fs2>-fix = tot_7 + tot_11.
ENDIF.
UNASSIGN <fs2>.
*BREAK-POINT.
PERFORM add_record USING '' '' 'TOT_E' 'P'.
* perform add_exp '
* BREAK-POINT.
PERFORM add_record USING 'NET MATERIAL COST' '' 'TOT_E' 'P'.

PERFORM add_record USING 'OPERATING COST' '' '' ''.


PERFORM add_record USING '' 'EXP_EMPL' '' 'X'.
PERFORM add_record USING '' 'MNT_GEN' '' 'X'.
PERFORM add_record USING '' 'EXP_CONS' '' 'X'.
PERFORM add_record USING 'OPER COST' '' 'TOT_III' 'P'.

PERFORM add_record USING 'UTILITIES' '' '' ''.


PERFORM add_record USING '' 'GAS_COG' '' 'X' .
PERFORM add_record USING '' 'GAS_BFG' '' 'X'.
PERFORM add_record USING '' 'GAS_LDG' '' 'X'.
PERFORM add_record USING '' 'EXP_WATR' '' 'X'.
PERFORM add_record USING '' 'EXP_ELEC' '' 'X'.
PERFORM add_record USING '' 'GAS_OXY' '' 'X'.
PERFORM add_record USING '' 'GAS_NIT' '' 'X'.
PERFORM add_record USING '' 'UTL_OTHR' '' 'X'.
PERFORM add_record USING 'TOT. UTILITIES' '' 'TOT_IV' 'P'.

PERFORM add_record USING 'OVERHEADS' '' '' ''.


PERFORM add_record USING '' 'OVH_PROD' '' 'X'.
PERFORM add_record USING '' 'OVH_ADMN' '' 'X'.
PERFORM add_record USING '' 'MNT_REFR' '' 'X'.
PERFORM add_record USING '' 'EXP_INST' '' 'X'.
18
PERFORM add_record USING '' 'MNT_MECH' '' 'X'.
PERFORM add_record USING '' 'MNT_ELEC' '' 'X'.
PERFORM add_record USING '' 'MNT_CIVL' '' 'X'.
PERFORM add_record USING '' 'EXP_OTHR' '' 'X'.
PERFORM add_record USING 'TOT. OVERHEADS' '' 'TOT_V' 'P'.

PERFORM add_record USING 'TOT. OPERATING COST' '' 'TOT_VI' 'P'.


PERFORM add_record USING 'PROD COST BEFORE INT&DEP' '' 'TOT_VII' 'P'.

PERFORM add_record USING 'DEPRICIATION' 'EXP_DEPR' 'TOT_VIII' 'X'.


*BREAK-POINT.
* PERFORM add_record USING ' ' 'CST_ABSR' '' 'P'.
PERFORM add_record USING 'OVER/UNDER ABSORBTION' '' 'TOT_IX' 'P'.
PERFORM add_record USING 'TOTAL COST OF PROD' '' 'TOT_X' 'P'.

PERFORM add_record USING 'INTEREST' '' '' ''.


PERFORM add_record USING '' 'INT_WC' '' 'X'.
PERFORM add_record USING '' 'INT_TL' '' 'X'.
PERFORM add_record USING 'TOT. INTEREST' '' 'TOT_XI' 'P'.

PERFORM add_record USING 'TOT. COST INCL INTEREST' '' 'TOT_XII' 'P'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form ADD_RECORD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 Header
*& <-- p2 Identifier
*&---------------------------------------------------------------------*
FORM add_record USING p_hdr TYPE char25
p_id TYPE char20
total TYPE char20
x TYPE c.
STATICS: tot_i TYPE wrbtr,
tot_ii TYPE wrbtr,
tot_iii TYPE wrbtr,
tot_iv TYPE wrbtr,
tot_v TYPE wrbtr,
tot_vi TYPE wrbtr,
tot_vii TYPE wrbtr,
tot_viii TYPE wrbtr,
* TOT_IX TYPE wrbtr, GLOBAL DECLR
tot_x TYPE wrbtr,
tot_x1 TYPE wrbtr,
tot_x2 TYPE wrbtr,
tot_x3 TYPE wrbtr,
tot_x4 TYPE wrbtr,
tot_xi TYPE wrbtr,
tot_xi1 TYPE wrbtr,
tot_xi2 TYPE wrbtr,
19
tot_xi3 TYPE wrbtr,
tot_xi4 TYPE wrbtr,
tot_xii TYPE wrbtr.
CLEAR i_finaltab.
IF p_hdr IS NOT INITIAL.
CONCATENATE '**' p_hdr '*' INTO i_finaltab-matnr.
i_finaltab-qty = ''.
MOVE 'C510' TO i_finaltab-linecolor.
IF x EQ 'P'. "IS NOT INITIAL.
IF total_hl IS NOT INITIAL.
i_finaltab-tamt = total_hl.
ENDIF.
* BREAK-POINT.
CASE total.
WHEN 'TOT_B'.tot_b = total_hl.
WHEN 'TOT_C'.
tot_c = tot_b.
tot_12 = i_finaltab-fix = tot_4 + tot_8.
tot_13 = i_finaltab-var = tot_5 + tot_9.
tot_14 = i_finaltab-cfix = tot_6 + tot_10.
tot_15 = i_finaltab-cvar = tot_7 + tot_11.
WHEN 'TOT_E'.
i_finaltab-tamt = tot_e.
i_finaltab-fix = tot_16.
i_finaltab-var = tot_17.
i_finaltab-cfix = tot_18.
i_finaltab-cvar = tot_19.
WHEN 'TOT_III'.
tot_iii = total_hl.
tot_20 = i_finaltab-fix = qty_9.
tot_21 = i_finaltab-var = qty_8 .
tot_22 = i_finaltab-cfix = qty9.
tot_23 = i_finaltab-cvar = qty8 .
WHEN 'TOT_IV'.
tot_iv = total_hl.
tot_24 = i_finaltab-fix = qty_9.
tot_25 = i_finaltab-var = qty_8 .
tot_26 = i_finaltab-cfix = qty9.
tot_27 = i_finaltab-cvar = qty8 .
WHEN 'TOT_V'.
tot_v = total_hl.
tot_28 = i_finaltab-fix = qty_9.
tot_29 = i_finaltab-var = qty_8 .
tot_30 = i_finaltab-cfix = qty9.
tot_31 = i_finaltab-cvar = qty8 .
WHEN 'TOT_VI'.
i_finaltab-tamt = tot_vi = tot_iii + tot_iv + tot_v.
sqty5 = i_finaltab-fix = tot_20 + tot_24 + tot_28.
sqty6 = i_finaltab-var = tot_21 + tot_25 + tot_29.
sqty7 = i_finaltab-cfix = tot_22 + tot_26 + tot_30.
sqty8 = i_finaltab-cvar = tot_23 + tot_27 + tot_31.
WHEN 'TOT_VII'.
i_finaltab-tamt = tot_vii = tot_e + tot_vi.
20
tot_32 = i_finaltab-fix = tot_16 + sqty5.
tot_33 = i_finaltab-var = tot_17 + sqty6.
tot_34 = i_finaltab-cfix = tot_18 + sqty7.
tot_35 = i_finaltab-cvar = tot_19 + sqty8.
WHEN 'TOT_VIII'.
tot_viii = total_hl.
tot_36 = i_finaltab-fix = qty_9.
tot_37 = i_finaltab-var = qty_8 .
tot_38 = i_finaltab-cfix = qty9 .
tot_39 = i_finaltab-cvar = qty8 .
WHEN 'TOT_IX'.
READ TABLE i_glbal INTO DATA(ls_glbal2) WITH KEY id = 'CST_ABSR'.
* i_finaltab-tamt = tot_b + tot_i + tot_ii + tot_iii + tot_iv + tot_v + tot_viii.
i_finaltab-tamt = tot_vii + tot_viii - tot_e. "Less Credit Material Cost.
* i_finaltab-tamt = TOT_VI + TOT_VIII.
** i_finaltab-fix = tot_24 + tot_28 + tot_32.
** i_finaltab-var = tot_25 + tot_29 + tot_33.
** i_finaltab-cfix = tot_26 + tot_30 + tot_34.
** i_finaltab-cvar = tot_27 + tot_31 + tot_35.
i_finaltab-fix = tot_32 + qty_9 - tot_16.
i_finaltab-var = tot_33 + qty_8 - tot_17.
i_finaltab-cfix = tot_34 + qty9 - tot_18.
i_finaltab-cvar = tot_35 + qty8 - tot_19.
** i_finaltab-fix = ( i_finaltab-fix + ls_glbal2-hsl ) * -1.
** i_finaltab-var = ( i_finaltab-var + ls_glbal2-hsl ) * -1.
** i_finaltab-cfix = ( i_finaltab-cfix + ls_glbal2-hsl ) * -1.
** i_finaltab-cvar = ( i_finaltab-cvar + ls_glbal2-hsl ) * -1.
i_finaltab-tamt = ( i_finaltab-tamt + ls_glbal2-hsl ) * -1.
i_finaltab-fix = ( i_finaltab-fix + ls_glbal2-hsl_fc ) * -1.
i_finaltab-var = ( i_finaltab-var + ls_glbal2-hsl_vc ) * -1.
i_finaltab-cfix = ( i_finaltab-fix / qty ).
i_finaltab-cvar = ( i_finaltab-var / qty ).
tot_ix = i_finaltab-tamt.
tot_ix1 = i_finaltab-fix.
tot_ix2 = i_finaltab-var.
tot_ix3 = i_finaltab-cfix.
tot_ix4 = i_finaltab-cvar.
WHEN 'TOT_X'.
* BREAK-POINT.
i_finaltab-tamt = tot_x = tot_vii + tot_viii + tot_ix.
tot_x1 = i_finaltab-fix = tot_32 + tot_36 + tot_ix1.
tot_x2 = i_finaltab-var = tot_33 + tot_37 + tot_ix2.
tot_x3 = i_finaltab-cfix = tot_34 + tot_38 + tot_ix3.
tot_x4 = i_finaltab-cvar = tot_35 + tot_39 + tot_ix4.
WHEN 'TOT_XI'.
tot_xi = total_hl.
tot_xi1 = i_finaltab-cvar = qty8 .
tot_xi2 = i_finaltab-cfix = qty9.
tot_xi3 = i_finaltab-var = qty_8 .
tot_xi4 = i_finaltab-fix = qty_9.
WHEN 'TOT_XII'.
i_finaltab-tamt = tot_xii = tot_x + tot_xi.
** i_finaltab-cvar = tot_x1 + tot_xi1.
21
** i_finaltab-cfix = tot_x2 + tot_xi2.
** i_finaltab-var = tot_x3 + tot_xi3.
** i_finaltab-fix = tot_x4 + tot_xi4.
i_finaltab-fix = tot_x1 + tot_xi4.
i_finaltab-var = tot_x2 + tot_xi3.
i_finaltab-cvar = tot_x4 + tot_xi1.
i_finaltab-cfix = tot_x3 + tot_xi2.

* tot_b + tot_i + tot_ii + tot_iii + tot_iv + tot_v + tot_viii.


WHEN OTHERS.
ENDCASE.

ENDIF.
i_finaltab-ctamt = i_finaltab-tamt / qty.
IF p_hdr = 'NET MATERIAL COST' OR p_hdr = 'TOT. OPERATING COST' OR total = 'TOT_III' " p_hdr = 'PROD COST BE
FORE INT&DEP' OR
OR total = 'TOT_IV' OR total = 'TOT_V' OR total = 'TOT_VI' OR total = 'TOT_VII' OR total = 'TOT_VIII' OR total = 'TO
T_IX'
OR total = 'TOT_X' OR total = 'TOT_XI' OR total = 'TOT_XII'..
ELSE.
i_finaltab-cvar = qty8 .
i_finaltab-cfix = qty9.
i_finaltab-var = qty_8 .
i_finaltab-fix = qty_9.
tot_8 = i_finaltab-cvar + tot_8 .
tot_9 = i_finaltab-cfix + tot_9.
tot_10 = i_finaltab-var + tot_10 .
tot_11 = i_finaltab-fix + tot_11.
ENDIF.
APPEND i_finaltab.
CLEAR: total_hl,qty8, qty9, qty_8, qty_9.
ENDIF.

CLEAR i_finaltab.
IF p_id IS NOT INITIAL.
READ TABLE i_glbal INTO ls_glbal2 WITH KEY id = p_id.
IF sy-subrc EQ 0.
READ TABLE it_opid INTO DATA(ls_opid) WITH KEY id = p_id.
IF sy-subrc EQ 0.
i_finaltab-matnr = ls_opid-name.
ENDIF.
i_finaltab-tamt = ls_glbal2-hsl.
IF x EQ 'X'.
total_hl = total_hl + ls_glbal2-hsl.
ENDIF.
i_finaltab-fix = ls_glbal2-hsl_fc.
i_finaltab-var = ls_glbal2-hsl_vc.

i_finaltab-cfix = ls_glbal2-hsl_fc / qty.


i_finaltab-cvar = ls_glbal2-hsl_vc / qty.
qty8 = qty8 + i_finaltab-cvar.
qty9 = qty9 + i_finaltab-cfix.
qty_8 = qty_8 + i_finaltab-var.
22
qty_9 = qty_9 + i_finaltab-fix.
i_finaltab-ctamt = i_finaltab-tamt / qty.
APPEND i_finaltab.
ENDIF.
IF total EQ 'TOT_VIII'.
tot_viii = i_finaltab-tamt.
tot_36 = i_finaltab-fix = qty_9.
tot_37 = i_finaltab-var = qty_8 .
tot_38 = i_finaltab-cfix = qty9 .
tot_39 = i_finaltab-cvar = qty8 .
CLEAR: i_finaltab.
ENDIF.
ENDIF.
CLEAR: ls_glbal2.
ENDFORM.

Below is a clean and practical Man-Day estimate for the ZFI_COST_SHEET report based on the code you shared.

Your code is large, multi-module, multi-loop, multi-table, with ACDOCA summarization, MATERIAL movements
(MATDOC), period logic, and custom Z-tables.
It also integrates with a custom class (zcl_cost_sheet_s99) for cost calculation.

✅ 1. Overall Complexity Assessment

Complexity Level: HIGH

Reasons:

✅ 30+ SELECT queries (ACDOCA, MATDOC, Z-tables)


✅ FOR ALL ENTRIES + LOOP-based SELECTs
✅ Multi-period dynamic POPER/GJPER logic
✅ Multi-level cost computation (FC/VC mix)
✅ Material movement 261/262/531/532 valuation logic
✅ Aggregations, subtotals, end-of-group summaries
✅ ALV Field catalog + events + colors
✅ Multiple intermediate internal tables (15+ tables)
✅ Huge procedural logic involving many loops
✅ Class method call for cost sheet calculation
✅ Hard-coded accounting logic (variance, fixed/variable cost)

This is equivalent to a full-fledged financial cost computation engine inside a report.

✅ 2. Man-Day Estimate Summary (High-Level)

23
Activity Effort (Man-days)

1. Requirement Study & Walkthrough 1.5

2. Existing Code Analysis (1100–1500 LOC) 2.0

3. Impact Analysis & Technical Design (TDS) 1.5

4. Development / Enhancements 4.0

5. Unit Testing (Functional + Regression) 2.0

6. Performance Optimization (ACDOCA, MATDOC) 1.0

7. UAT Support & Issue Fixing 1.5

8. Documentation + KT 0.5

✅ Total Estimated Effort = 14 Man-days

✅ 3. Detailed Breakdown of Man-Days

1. Requirement Study – 1.5 MD

 Understanding flow of MATERIAL COSTING

 Mapping tables: ACDOCA, MATDOC, ZMMT tables

 Walkthrough of movement types (261/262/531/532)

 POPER/GJPER period logic clarification

2. Code Analysis – 2.0 MD

 Analyzing 1000+ LOC across:

o ZFIT_COST_SHEET_TOP_CP

o ZFIT_COST_SHEET_SEL_CP

o ZFIT_COST_SHEET_DETAIL_CP

 Understanding loops, internal tables, ENDAT blocks

 Reading zcl_cost_sheet_s99->detail method behavior

3. Technical Design (TDS) – 1.5 MD

Includes:

 Selection screen fields mapping → logic

 Data model (all internal tables)

 Movement type filtering logic

 Summation logic for:

o qty

24
o tamt

o var/fix

o cvar/cfix

 ALV design

 Error handling + performance considerations

 Test data preparation

4. Development / Enhancement – 4.0 MD

Covers:

 Fixing SELECT…ENDSELECT

 Adding indexes / joins

 Refactoring nested loops

 Improving GJPER creation logic

 Fix ACDOCA summarization

 Streamlining MATDOC movement grouping

 Improving computations of FC/VC components

 Color coding in ALV

 Adding totals and subtotals

This code has heavy financial logic; ensuring accuracy takes effort.

5. Unit Testing – 2.0 MD

Test Scenarios:

 Single period vs multi-period

 Multiple materials

 Negative qty (262/532)

 Cost variance calculation

 Missing entries in Z tables

 POPER/GJPER rollover

 UOM conversions

 Multiple plants / company codes

 Summation at ENDAT blocks

6. Performance Optimization – 1.0 MD

 Replace multiple SELECTs with JOINs

25
 Reduce loops

 Add proper DELETE ADJACENT DUPLICATES

 Add SORT / BINARY SEARCH

 Table buffering for custom tables

 Index usage (ACDOCA / MATDOC)

7. UAT Support – 1.5 MD

 Helping users validate cost sheets

 Fixing rounding / variance mismatches

 Adjusting for month-end data inconsistencies

 Handling missing data in Z tables

8. Documentation + KT – 0.5 MD

 Prepare technical flow

 Data flow diagram

 Test cases

 KT to support team

✅ Total = 14 Man-Days

✅ Optional — If you want, I can also deliver:

✅ A Professional TDS for this exact code


✅ A Flowchart of the program
✅ Summary of logic (high-level + low-level)
✅ A Complexity Heat-Map (which lines have highest risk)
✅ Man-day estimate Excel file (downloadable)

26
27

You might also like