SAP订单费用报表

费用主要取自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.
相关推荐
HeathlX1 天前
SAP-Fiori:系列(3)Gateway ODATA (V2) CURD之Create
abap
HeathlX1 天前
SAP-Fiori:系列(4)Gateway ODATA (V2) CURD之Delete
sap·abap
戰皇Hermes3 天前
ABAP cl_document_bcs-用户权限不足导致正文内容变成附件txt
abap
duangww3 天前
SAP 生产订单组件修改
abap
HeathlX3 天前
SAP-Fiori:Gateway ODATA(V2)
abap
HeathlX3 天前
SAP-Fiori:Gateway ODATA (V2) CURD之Query
abap
爱喝水的鱼丶12 天前
SAP-ABAP:深入浅出 SAP AFVC 表:生产订单工序的核心数据仓库
运维·服务器·数据仓库·sap·abap·pp
爱喝水的鱼丶12 天前
SAP-ABAP: 深入浅出 SAP 经典可执行程序:从零开始掌握
运维·服务器·数据库·sap·abap·开发交流
LilySesy19 天前
【与AI+】英语day4——数据库与性能优化
数据库·oracle·性能优化·sap·abap·自动翻译