费用主要取自MLDOC,MLDOCCCS表,MLDOC的element成本要素对应的水电气人工等
MLDOCCCS的TOT 总成本价值
1.订单移动记录表和MLDOC关联关系:
AUFM表和MLDOC表关联关系 AUFM~MBLNR = MLDOC~AWREF
AND AUFM~MJAHR = MLDOC~AWORG
AND AUFM~lpad( a~zeile, 6, '0' )(补0至6位)=MLDOC~AWITEM
2.MLDOC物料分类账表和MLDOCCCS物料分类账成本分割表关联关系
关联字段
DOCREF凭证参考
CURTP外部货币类型和评估视图
3.源代码
*&---------------------------------------------------------------------*
*& Report ZCOR008
*&---------------------------------------------------------------------*
*& 试产订单费用报表
*&---------------------------------------------------------------------*
REPORT zcor008.
TABLES: aufm,aufk,bkpf.
TYPES: BEGIN OF ty_out,
werks TYPE aufm-werks,
aufnr TYPE aufm-aufnr,
ablad TYPE afpo-ablad, "比克大批
waers TYPE aufm-waers, "货币
scf TYPE aufm-dmbtr, "试产费合计额
zjcl TYPE aufm-dmbtr, "生产成本-直接材料费
jjcl TYPE coss-wkg001, "间接材料费用
jjrg TYPE coss-wkg001, "间接人工费
ny TYPE coss-wkg001, "能源(电费)
nydl TYPE coss-wkg001, "能源动力(水汽)
zjcf TYPE coss-wkg001, "折旧和厂房租金
zjrg TYPE coss-wkg001, "直接人工成本
cc TYPE coss-wkg001, "产出
cc_sl TYPE mseg-menge, "产出数量
objnr TYPE aufk-objnr,
teco_date TYPE jcds-udate, "TECO日期
el001 TYPE mldocccs-tot, "产出1-直接材料
el002 TYPE mldocccs-tot, "产出2-直接人工
el003 TYPE mldocccs-tot,
el004 TYPE mldocccs-tot,
el005 TYPE mldocccs-tot,
el006 TYPE mldocccs-tot,
el007 TYPE mldocccs-tot,
el008 TYPE mldocccs-tot,
diff001 TYPE mldocccs-tot,
diff002 TYPE mldocccs-tot,
diff003 TYPE mldocccs-tot,
diff004 TYPE mldocccs-tot,
diff005 TYPE mldocccs-tot,
diff006 TYPE mldocccs-tot,
diff007 TYPE mldocccs-tot, "试产费7-能源(电费)
diff_sum TYPE mldocccs-tot, "试产费合计金额
END OF ty_out.
DATA gt_out TYPE TABLE OF ty_out.
* ALV相关的变量
DATA: go_grid TYPE REF TO cl_gui_alv_grid,
gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat,
gs_variant TYPE disvariant,
gs_fieldcat LIKE LINE OF gt_fieldcat,
gt_exclude TYPE slis_t_extab,
gv_repid TYPE syrepid.
RANGES: rt_date FOR jcds-udate.
SELECTION-SCREEN BEGIN OF BLOCK blk01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:s_bukrs FOR aufk-bukrs OBLIGATORY,
s_gjahr FOR bkpf-gjahr,
s_mon FOR bkpf-monat,
s_aufnr FOR aufm-aufnr.
SELECTION-SCREEN END OF BLOCK blk01.
START-OF-SELECTION.
PERFORM frm_get_data.
PERFORM frm_get_mldocccs.
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
DATA lv_kstar TYPE coss-kstar.
DATA wkg_sum TYPE coss-wkg001.
DATA x LIKE cosba-wkg001.
PERFORM get_date_range.
SELECT a~aufnr,b~werks,b~waers,a~objnr,
SUM( CASE bwart WHEN '261' THEN dmbtr
WHEN '262' THEN - dmbtr
END ) AS zjcl,
SUM( CASE bwart WHEN '531' THEN dmbtr
WHEN '532' THEN - dmbtr
END ) AS cc,
SUM( CASE bwart WHEN '531' THEN menge
WHEN '532' THEN - menge
END ) AS cc_sl
FROM aufk AS a
INNER JOIN aufm AS b
ON a~aufnr = b~aufnr
AND a~werks = b~werks
WHERE a~auart IN ('ZP30','ZP31','ZP36','ZP39')
AND a~aufnr IN @s_aufnr
AND a~bukrs IN @s_bukrs
AND b~bwart IN ( '261','262','531','532' )
GROUP BY a~aufnr,b~werks,b~waers,a~objnr
INTO CORRESPONDING FIELDS OF TABLE @gt_out.
IF gt_out[] IS NOT INITIAL.
SELECT aufnr,ablad INTO TABLE @DATA(lt_afpo)
FROM afpo
FOR ALL ENTRIES IN @gt_out
WHERE aufnr = @gt_out-aufnr.
SORT lt_afpo BY aufnr.
SELECT a~objnr,a~kstar,
lednr,gjahr,wrttp,versn,hrkft,vrgng,parob,uspob,beknz,
twaer,perbl,
a~wkg001,a~wkg002,a~wkg003,a~wkg004,
a~wkg005,a~wkg006,a~wkg007,a~wkg008,
a~wkg009,a~wkg010,a~wkg011,a~wkg012,
a~wkg013,a~wkg014,a~wkg015,a~wkg016
FROM v_coss_view AS a
INNER JOIN @gt_out AS b ON a~objnr = b~objnr
WHERE wrttp = '04' "实际
ORDER BY a~objnr
INTO TABLE @DATA(lt_coss).
SELECT objnr,usnam,udate INTO TABLE @DATA(lt_jcds)
FROM jcds
FOR ALL ENTRIES IN @gt_out
WHERE stat = 'I0045' "teco
AND inact = '' "活动状态
AND objnr = @gt_out-objnr
AND udate IN @rt_date.
SORT lt_jcds BY objnr.
ENDIF.
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
CLEAR: lv_kstar,wkg_sum.
READ TABLE lt_afpo INTO DATA(ls_afpo) WITH KEY aufnr = <fs_out>-aufnr
BINARY SEARCH.
IF sy-subrc = 0.
<fs_out>-ablad = ls_afpo-ablad.
ENDIF.
READ TABLE lt_jcds INTO DATA(ls_jcds) WITH KEY objnr = <fs_out>-objnr
BINARY SEARCH.
IF sy-subrc = 0.
<fs_out>-teco_date = ls_jcds-udate.
ELSE.
IF s_gjahr[] IS NOT INITIAL.
DELETE gt_out.
CONTINUE.
ENDIF.
ENDIF.
READ TABLE lt_coss TRANSPORTING NO FIELDS WITH KEY objnr = <fs_out>-objnr
BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT lt_coss INTO DATA(ls_coss) FROM sy-tabix.
IF ls_coss-objnr NE <fs_out>-objnr.
EXIT.
ENDIF.
CLEAR: x,wkg_sum.
DO 16 TIMES
VARYING x FROM ls_coss-wkg001 NEXT ls_coss-wkg002.
wkg_sum = wkg_sum + x.
ENDDO.
lv_kstar = |{ ls_coss-kstar ALPHA = OUT }|.
CASE lv_kstar.
WHEN '601001'. "直接人工成本
<fs_out>-zjrg = <fs_out>-zjrg + wkg_sum.
WHEN '601002'. "折旧和厂房租金
<fs_out>-zjcf = <fs_out>-zjcf + wkg_sum.
WHEN '601003'. "能源动力(水汽)
<fs_out>-nydl = <fs_out>-nydl + wkg_sum.
WHEN '601004'. "间接材料费用
<fs_out>-jjcl = <fs_out>-jjcl + wkg_sum.
WHEN '601005'. "间接人工费
<fs_out>-jjrg = <fs_out>-jjrg + wkg_sum.
WHEN '601006'. ""能源(电费)
<fs_out>-ny = <fs_out>-ny + wkg_sum.
ENDCASE.
CLEAR: ls_coss.
ENDLOOP.
ENDIF.
* 试产费合计额
<fs_out>-scf = <fs_out>-zjcl + <fs_out>-jjcl + <fs_out>-jjrg + <fs_out>-ny +
<fs_out>-nydl + <fs_out>-zjcf + <fs_out>-zjrg.
ENDLOOP.
SORT gt_out BY werks aufnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
DATA:ls_layout TYPE lvc_s_layo.
ls_layout-zebra = abap_true.
ls_layout-sel_mode = 'A'.
ls_layout-cwidth_opt = abap_true.
PERFORM frm_build_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-cprog
i_bypassing_buffer = abap_true
is_layout_lvc = ls_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
TABLES
t_outtab = gt_out
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.
*&---------------------------------------------------------------------*
*& Form frm_build_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat .
DEFINE mcr_fieldcat.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-coltext = &2.
gs_fieldcat-scrtext_s = &2.
gs_fieldcat-scrtext_l = &2.
gs_fieldcat-scrtext_m = &2.
gs_fieldcat-key = &3.
gs_fieldcat-checkbox = &4.
gs_fieldcat-edit = &5.
gs_fieldcat-hotspot = &6.
gs_fieldcat-ref_table = &7.
gs_fieldcat-ref_field = &8.
gs_fieldcat-icon = &9.
APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.
CLEAR gt_fieldcat.
mcr_fieldcat 'WERKS' '工厂' '' '' '' '' 'AUFM' 'WERKS' ''.
mcr_fieldcat 'TECO_DATE' 'TECO日期' '' '' '' '' 'JCDS' 'UDATE' ''.
mcr_fieldcat 'AUFNR' '生产订单' '' '' '' '' 'AUFM' 'AUFNR' ''.
mcr_fieldcat 'ABLAD' '生产批次' '' '' '' '' 'AFPO' 'ABLAD' ''.
mcr_fieldcat 'WAERS' '货币' '' '' '' '' '' '' ''.
mcr_fieldcat 'SCF' '投入合计金额' '' '' '' '' '' '' ''.
mcr_fieldcat 'ZJCL' '生产成本-直接材料费' '' '' '' '' '' '' ''.
mcr_fieldcat 'JJCL' '间接材料费用' '' '' '' '' '' '' ''.
mcr_fieldcat 'JJRG' '间接人工费' '' '' '' '' '' '' ''.
mcr_fieldcat 'NY' '能源(电费)' '' '' '' '' '' '' ''.
mcr_fieldcat 'NYDL' '能源动力(水汽)' '' '' '' '' '' '' ''.
mcr_fieldcat 'ZJCF' '折旧和厂房租金' '' '' '' '' '' '' ''.
mcr_fieldcat 'ZJRG' '直接人工成本' '' '' '' '' '' '' ''.
mcr_fieldcat 'CC' '产出合计金额' '' '' '' '' '' '' ''.
mcr_fieldcat 'CC_SL' '产出数量' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL001' '产出1-直接材料' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL002' '产出2-直接人工' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL003' '产出3-间接人工' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL004' '产出4-折旧和厂房租金' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL005' '产出5-间接材料' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL006' '产出6-能源动力(水汽)' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL007' '产出7-能源(电费)' '' '' '' '' '' '' ''.
mcr_fieldcat 'EL008' '产出8-外部作业' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF_SUM' '试产费合计金额' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF001' '试产费1-直接材料' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF002' '试产费2-直接人工' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF003' '试产费3-间接人工' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF004' '试产费4-折旧和厂房租金' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF005' '试产费5-间接材料' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF006' '试产费6-能源动力(水汽)' '' '' '' '' '' '' ''.
mcr_fieldcat 'DIFF007' '试产费7-能源(电费)' '' '' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_date_range
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM get_date_range .
DATA: lv_beg_gjahr TYPE bseg-gjahr, "开始日期的年
lv_gjahr TYPE bseg-gjahr,
lv_beg_mon TYPE bkpf-monat, "开始日期的月份
lv_mon TYPE bkpf-monat.
DATA: lv_begda TYPE begda,
lv_endda TYPE endda.
REFRESH rt_date.CLEAR rt_date.
CHECK s_gjahr[] IS NOT INITIAL.
lv_beg_gjahr = s_gjahr-low.
IF s_gjahr-high IS NOT INITIAL.
lv_gjahr = s_gjahr-high.
ELSEIF s_gjahr-low IS NOT INITIAL.
LOOP AT s_gjahr INTO DATA(ls_gjahr).
IF ls_gjahr-low > lv_gjahr.
lv_gjahr = ls_gjahr-low.
ENDIF.
CLEAR: ls_gjahr.
ENDLOOP.
ENDIF.
IF s_mon-low IS NOT INITIAL.
lv_beg_mon = s_mon-low.
ELSE.
lv_beg_mon = '01'.
ENDIF.
IF s_mon-high IS NOT INITIAL.
lv_mon = s_mon-high.
ELSEIF s_mon-low IS NOT INITIAL.
LOOP AT s_mon INTO DATA(ls_mon).
IF ls_mon-low > lv_mon.
lv_mon = s_mon-low.
ENDIF.
CLEAR: ls_mon.
ENDLOOP.
ELSE.
lv_mon = 12.
ENDIF.
lv_begda = lv_beg_gjahr && lv_beg_mon && '01'.
lv_endda = lv_gjahr && lv_mon && '01'.
CALL FUNCTION 'LAST_DAY_OF_MONTHS'
EXPORTING
day_in = lv_endda
IMPORTING
last_day_of_month = lv_endda
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.
rt_date[] = VALUE #(
( sign = 'I' option = 'BT' low = lv_begda high = lv_endda )
).
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_mldocccs
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_mldocccs .
DATA: lv1 TYPE string,
lv2 TYPE string.
SELECT a~aufnr,element,SUM( tot ) AS tot
FROM aufm AS a
INNER JOIN @gt_out AS d ON a~aufnr = d~aufnr
INNER JOIN mldoc AS b
ON a~mblnr = b~awref
AND lpad( a~zeile, 6, '0' ) = b~awitem
AND a~mjahr = b~aworg
INNER JOIN mldocccs AS c
ON b~docref = c~docref
AND b~curtp = c~curtp
WHERE a~bwart IN ('531','532')
GROUP BY a~aufnr,element
ORDER BY a~aufnr
INTO TABLE @DATA(lt_mldoc).
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
READ TABLE lt_mldoc TRANSPORTING NO FIELDS WITH KEY aufnr = <fs_out>-aufnr BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT lt_mldoc INTO DATA(ls_mldoc) FROM sy-tabix.
IF ls_mldoc-aufnr NE <fs_out>-aufnr.
EXIT.
ENDIF.
lv1 = |EL{ ls_mldoc-element }|.
ASSIGN COMPONENT lv1 OF STRUCTURE <fs_out> TO FIELD-SYMBOL(<fs1>).
IF sy-subrc = 0.
<fs1> = <fs1> + ls_mldoc-tot.
ENDIF.
CLEAR: ls_mldoc.
ENDLOOP.
ENDIF.
* 试产费1-直接材料=生产成本直接材料费 - 产出1直接材料 - 产出8外部作业
<fs_out>-diff001 = <fs_out>-zjcl - <fs_out>-el001 - <fs_out>-el008.
* 试产费2-直接人工=直接人工成本-产出2-直接人工
<fs_out>-diff002 = <fs_out>-zjrg - <fs_out>-el002.
* 试产费3-间接人工=间接人工费 - 产出3-间接人工
<fs_out>-diff003 = <fs_out>-jjrg - <fs_out>-el003.
* 试产费4-折旧和厂房租金=折旧和厂房租金 - 产出4-折旧和厂房租金
<fs_out>-diff004 = <fs_out>-zjcf - <fs_out>-el004.
* 试产费5-间接材料=间接材料费用 - 产出5-间接材料
<fs_out>-diff005 = <fs_out>-jjcl - <fs_out>-el005.
* 试产费6-能源动力(水汽)=能源动力(水汽) - 产出6-能源动力(水汽)
<fs_out>-diff006 = <fs_out>-nydl - <fs_out>-el006.
* 试产费7-能源(电费)=能源(电费) - 产出7-能源(电费)
<fs_out>-diff007 = <fs_out>-ny - <fs_out>-el007.
* 试产费合计金额
<fs_out>-diff_sum = <fs_out>-diff001 + <fs_out>-diff002 + <fs_out>-diff003
+ <fs_out>-diff004 + <fs_out>-diff005
+ <fs_out>-diff006 + <fs_out>-diff007.
ENDLOOP.
ENDFORM.