CKM3物料价格分析报表
...
CKM3物料价格分析报表
表:KEKO/MBEW/mldoc/MLDOCCCS/CKMLCR
 事物代码:CKM3(N)
 想要开发一个和CKM3大致的批量显示收货和和期末库存的报表,成本会计做成本的报表还是成本分析啥的吧我猜的。
 下面这个报表的如果筛选的月份是当月,但没有跑物料分类账。其中期末库存前面的值是对的,但因为我圈起来的料工费这种由实际值拆分得来的(还有前面的价格差异也不对),但我代码里写的时候是根据期初加收货减消耗这种算出来的,所以不太对。没有跑物料分类账的话MLDOC里就不会有EB这些行

 可以改一下由期末库存的实际值乘以对应的拆分比例算,然后价格差异的话也要算一下,没有找到那个比例在哪懒得改了,就先放着吧。反正看报表应该也是看结完后的🍄
 跑完物料分类账后,期末库存会多一行结算,就是由原本标准成本的值变成了移动平均价的值(跟库存价值有关了),这个结算行应该就是移动平均价和标准价的价值的差异。


和参考文献中不同点
期初+ZU收货+PC重新评估(因标准价格修改进行重新评估价格更改的标准成本)-VN消耗=期末标准成本

我的期初标准成本计算方法为:(按文章里的直接取不太对)
    DATA GV_DATE TYPE SY-DATUM.
      GV_DATE = S_GJAHR-LOW && S_POPER-LOW+1(2) && '01'.
      CALL FUNCTION 'CCM_GO_BACK_MONTHS'
        EXPORTING
          CURRDATE   = GV_DATE
          BACKMONTHS = '001'
        IMPORTING
          NEWDATE    = GV_DATE.
      SELECT SINGLE * INTO @DATA(GS_CKMLCR)
        FROM CKMLCR
       WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @GV_DATE+0(4)
         AND POPER = @GV_DATE+4(2).
      <FS_OUT>-STVAL = <FS_OUT>-QUANT * GS_CKMLCR-STPRS / GS_CKMLCR-PEINH.CKMLCR表中上个月的标准价格乘以期初数量除以上个月的价格单位
实际代码
*&---------------------------------------------------------------------*
*& Report ZFIR041
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFIR041.
*
*SELECT
*  SUM( MLDOC~QUANT ) AS SL,MLDOC~MEINS
*  FROM MBEW
*           LEFT JOIN MLDOC
*  ON MLDOC~JAHRPER = '2022012'
*  AND MLDOC~KALNR = MBEW~KALN1
*  AND MLDOC~CATEG = 'ZU'
*           WHERE MBEW~MATNR = '000000000400000001'
*             AND MBEW~BWKEY = '6000'
*GROUP BY MEINS
*            INTO TABLE @DATA(LT)
*            .
*CL_DEMO_OUTPUT=>DISPLAY( LT  ).
TABLES:MBEW,ACDOCA.
TYPES:BEGIN OF TYP_OUT,
        GJAHR  TYPE ACDOCA-GJAHR,    "年度
        POPER  TYPE ACDOCA-POPER,     "期间
        BWKEY  TYPE MBEW-BWKEY,     "工厂
        MATNR  TYPE MBEW-MATNR, "物料
        MAKTX  TYPE MAKT-MAKTX, "物料描述
        ZTYPE  TYPE CHAR10, "类别
        QUANT  TYPE MLDOC-QUANT, "交易数量
        MEINS  TYPE MLDOC-MEINS, "数量单位
        STVAL  TYPE MLDOC-STVAL, "初级评估
        PRD    TYPE MLDOC-PRD, "价格差异
        KDM    TYPE MLDOC-KDM, "汇率差异
        TOTAL  TYPE FCML4H_LIST_S-TOTAL, "实际值=初级评估+价格差异+汇率差异
        PRICE  TYPE FCML4H_LIST_S-PRICE, "价格=实际值/数量*成本核算批量
        ELM10  TYPE MLDOCCCS-TOT, "直接材料-电芯
        ELM11  TYPE MLDOCCCS-TOT, "直接材料-模组PACK
        ELM12  TYPE MLDOCCCS-TOT, "半成品
        ELM13  TYPE MLDOCCCS-TOT, "产成品
        ELM14  TYPE MLDOCCCS-TOT, "准备工时
        ELM15  TYPE MLDOCCCS-TOT, "直接人工
        ELM16  TYPE MLDOCCCS-TOT, "设备折旧
        ELM17  TYPE MLDOCCCS-TOT, "燃料动力
        ELM18  TYPE MLDOCCCS-TOT, "制造费用
        ELM19  TYPE MLDOCCCS-TOT, "委外加工
        ELM    TYPE MLDOCCCS-TOT, "成本构成总和
        CLR    TYPE CHAR4, "可以控制行颜色
        SEL(1) TYPE C,
        KALN1  TYPE MBEW-KALN1, "成本估算编号
        NUM(1) TYPE C, "类别排序
      END OF TYP_OUT.
DATA:GS_OUT TYPE TYP_OUT,
     GT_OUT TYPE TABLE OF TYP_OUT.
DATA:GV_JAHRPER TYPE MLDOC-JAHRPER.
DATA:FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
DATA:I_SORT   TYPE LVC_T_SORT WITH HEADER LINE.
DATA:WA_LAYOUT   TYPE LVC_S_LAYO.
DATA:GT_EVENT TYPE SLIS_T_EVENT WITH HEADER LINE.
DATA:IS_VARIANT LIKE DISVARIANT.
DATA:G_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA:REF_GRID TYPE REF TO CL_GUI_ALV_GRID.
*-----------------------------------------------------------------------
* SCREEN DECLARATION: PARAMETERS & SELECT-OPTIONS *
*-----------------------------------------------------------------------
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS:S_MATNR FOR MBEW-MATNR, "物料
                 S_BWKEY FOR MBEW-BWKEY, "估价范围
                 S_GJAHR FOR ACDOCA-GJAHR NO-EXTENSION NO INTERVALS OBLIGATORY DEFAULT SY-DATUM+0(4),"会计年度
                 S_POPER FOR ACDOCA-POPER NO-EXTENSION NO INTERVALS OBLIGATORY.               "期间
  PARAMETERS:P_R1 TYPE C AS CHECKBOX DEFAULT 'X', "收货
             P_R2 TYPE C AS CHECKBOX. "期末库存
SELECTION-SCREEN END OF BLOCK BL1.
*-----------------------------------------------------------------------
* Definition *
*-----------------------------------------------------------------------
DEFINE FILL_FIELD.
  CLEAR fieldcat.
  fieldcat-fieldname     = &1.
  fieldcat-scrtext_l     = &2.
  fieldcat-cfieldname    = &3.
  fieldcat-outputlen     = &4.
  fieldcat-decimals      = &5.
  fieldcat-no_zero       = &6.
  fieldcat-ref_table     = &7.
  fieldcat-ref_field     = &8.
  fieldcat-edit          = &9.
  APPEND fieldcat.
END-OF-DEFINITION.
*-----------------------------------------------------------------------
* INITIALIZE PARAMETER TO DEFAULT VALUE *
*-----------------------------------------------------------------------
INITIALIZATION.
*======================================================================*
*                        At Selection Screen
*======================================================================*
AT SELECTION-SCREEN.
  PERFORM FRM_AUTH_CHECK.
*======================================================================*
*                        At Selection Screen Output
*======================================================================*
AT SELECTION-SCREEN OUTPUT .
*-----------------------------------------------------------------------
* MAIN SELECTION LOGIC *
*-----------------------------------------------------------------------
START-OF-SELECTION.
  PERFORM FRM_DATA_GET.
*-----------------------------------------------------------------------
* HANDLING END OF PROGRAM LOGIC *
*-----------------------------------------------------------------------
END-OF-SELECTION.
  IF GT_OUT[] IS INITIAL.
    MESSAGE '没有合适的数据,请检查你的输入!' TYPE 'I'.
  ELSEIF GT_OUT[] IS NOT INITIAL.
    PERFORM FRM_DISPLAY_DATA.
  ENDIF.
*&---------------------------------------------------------------------*
*& Form FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_AUTH_CHECK .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DATA_GET
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DATA_GET .
  DEFINE FILL_JAH.
    CLEAR GV_JAHRPER.
    GV_JAHRPER = &1 && &2.
  END-OF-DEFINITION.
  FILL_JAH S_GJAHR-LOW S_POPER-LOW.
  IF P_R1 = 'X' OR P_R2 = 'X'..
    SELECT
      SUM( MLDOC~QUANT ) AS QUANT,MLDOC~MEINS,MBEW~BWKEY,MBEW~MATNR,SUM( MLDOC~STVAL ) AS STVAL,
      SUM( MLDOC~PRD ) AS PRD,SUM( MLDOC~KDM ) AS KDM,MBEW~KALN1,'2' AS NUM
               FROM MBEW
               LEFT JOIN MLDOC
      ON MLDOC~JAHRPER = @GV_JAHRPER
      AND MLDOC~KALNR = MBEW~KALN1
      AND MLDOC~CATEG = 'ZU'
               WHERE MBEW~MATNR IN @S_MATNR
                 AND MBEW~BWKEY IN @S_BWKEY
                 GROUP BY MATNR,MEINS,BWKEY,MBEW~KALN1
                INTO CORRESPONDING FIELDS OF TABLE @GT_OUT.
    IF GT_OUT[] IS NOT INITIAL.
*      SELECT MLDOCCCS~DOCREF,MLDOCCCS~ELEMENT,MLDOCCCS~TOT,MLDOC~KALNR INTO TABLE @DATA(GT_MLDOCCCS)
*        FROM MLDOC
*        LEFT JOIN MLDOCCCS
*          ON MLDOC~DOCREF = MLDOCCCS~DOCREF
*         FOR ALL ENTRIES IN @GT_OUT
*       WHERE MLDOC~KALNR = @GT_OUT-KALN1
*         AND MLDOC~JAHRPER = @GV_JAHRPER
*         AND MLDOC~CATEG = 'ZU'.
      SELECT MATNR,MAKTX,SPRAS INTO TABLE @DATA(GT_MAKT)
        FROM MAKT
         FOR ALL ENTRIES IN @GT_OUT
       WHERE MATNR = @GT_OUT-MATNR.
      SORT GT_MAKT BY MATNR SPRAS.
    ENDIF.
    LOOP AT GT_OUT ASSIGNING FIELD-SYMBOL(<FS_OUT>).
      READ TABLE GT_MAKT INTO DATA(GS_MAKT) WITH KEY MATNR = <FS_OUT>-MATNR SPRAS = SY-LANGU BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_OUT>-MAKTX = GS_MAKT-MAKTX.
      ENDIF.
      <FS_OUT>-MATNR = |{ <FS_OUT>-MATNR ALPHA = OUT }|.
      <FS_OUT>-GJAHR = S_GJAHR-LOW.
      <FS_OUT>-POPER = S_POPER-LOW.
      <FS_OUT>-ZTYPE = '收货'.
      <FS_OUT>-TOTAL = <FS_OUT>-STVAL + <FS_OUT>-PRD + <FS_OUT>-KDM.
      SELECT SINGLE PEINH INTO @DATA(LV_PEINH)
        FROM CKMLCR WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @S_GJAHR-LOW
         AND POPER = @S_POPER-LOW.
      IF <FS_OUT>-QUANT IS NOT INITIAL.
        <FS_OUT>-PRICE = <FS_OUT>-TOTAL / <FS_OUT>-QUANT *  LV_PEINH.
      ENDIF.
      SELECT MLDOCCCS~DOCREF,MLDOCCCS~ELEMENT,MLDOCCCS~TOT,MLDOC~KALNR INTO TABLE @DATA(GT_MLDOCCCS)
        FROM MLDOC
        LEFT JOIN MLDOCCCS
          ON MLDOC~DOCREF = MLDOCCCS~DOCREF
       WHERE MLDOC~KALNR = @<FS_OUT>-KALN1
         AND MLDOC~JAHRPER = @GV_JAHRPER
         AND MLDOC~CATEG = 'ZU'.
      SORT GT_MLDOCCCS BY DOCREF ELEMENT.
      LOOP AT GT_MLDOCCCS INTO DATA(GS_MLDOCCCS)
        GROUP BY ( DOCREF = GS_MLDOCCCS-DOCREF ELEMENT = GS_MLDOCCCS-ELEMENT )."按括号里的条件进行分组
        LOOP AT GROUP GS_MLDOCCCS INTO DATA(MEMBER)."按分组后进行组员的访问,这里就是对同一组的进行某个字段的汇总
          CHECK MEMBER-KALNR = <FS_OUT>-KALN1.
          IF MEMBER-ELEMENT = '010'.
            <FS_OUT>-ELM10 = <FS_OUT>-ELM10 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '011'.
            <FS_OUT>-ELM11 = <FS_OUT>-ELM11 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '012'.
            <FS_OUT>-ELM12 = <FS_OUT>-ELM12 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '013'.
            <FS_OUT>-ELM13 = <FS_OUT>-ELM13 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '014'.
            <FS_OUT>-ELM14 = <FS_OUT>-ELM14 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '015'.
            <FS_OUT>-ELM15 = <FS_OUT>-ELM15 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '016'.
            <FS_OUT>-ELM16 = <FS_OUT>-ELM16 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '017'.
            <FS_OUT>-ELM17 = <FS_OUT>-ELM17 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '018'.
            <FS_OUT>-ELM18 = <FS_OUT>-ELM18 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '019'.
            <FS_OUT>-ELM19 = <FS_OUT>-ELM19 + MEMBER-TOT.
          ENDIF.
        ENDLOOP.
        <FS_OUT>-ELM = <FS_OUT>-ELM10 + <FS_OUT>-ELM11 + <FS_OUT>-ELM12 + <FS_OUT>-ELM13 +
        <FS_OUT>-ELM14 + <FS_OUT>-ELM15 + <FS_OUT>-ELM16 + <FS_OUT>-ELM17 + <FS_OUT>-ELM18 + <FS_OUT>-ELM19.
      ENDLOOP.
    ENDLOOP.
  ENDIF.
  IF P_R2 = 'X'.
    SELECT
       SUM( MLDOC~QUANT ) AS QUANT,MLDOC~MEINS,MBEW~BWKEY,MBEW~MATNR,
       MBEW~KALN1,'期初' AS ZTYPE,'1' AS NUM
                FROM MBEW
                LEFT JOIN MLDOC
       ON MLDOC~JAHRPER < @GV_JAHRPER
       AND MLDOC~KALNR = MBEW~KALN1
*      AND MLDOC~CATEG = 'AB'
                WHERE MBEW~MATNR IN @S_MATNR
                  AND MBEW~BWKEY IN @S_BWKEY
                  GROUP BY MATNR,MEINS,BWKEY,MBEW~KALN1
                 APPENDING CORRESPONDING FIELDS OF TABLE @GT_OUT.
    LOOP AT GT_OUT ASSIGNING <FS_OUT> WHERE ZTYPE = '期初'.
      SELECT SUM( MLDOC~PRD ) AS PRD,SUM( MLDOC~KDM ) AS KDM INTO ( @<FS_OUT>-PRD,@<FS_OUT>-KDM )
        FROM MLDOC WHERE JAHRPER = @GV_JAHRPER AND KALNR = @<FS_OUT>-KALN1
         AND CATEG = 'AB'.
*      DATA LV_GJAHR TYPE ACDOCA-GJAHR.
*      DATA LV_POPER TYPE ACDOCA-POPER.
*      IF S_POPER-LOW = '010'.
*        LV_GJAHR = S_GJAHR-LOW - 1.
*        LV_POPER = '012'.
*      ELSE.
*        LV_GJAHR = S_GJAHR-LOW.
*        LV_POPER = S_POPER-LOW - 1.
*      ENDIF.
*      SELECT SINGLE CKMLCR~SALK3 INTO @<FS_OUT>-STVAL
*        FROM CKMLCR
*       WHERE KALNR = @<FS_OUT>-KALN1
**         AND BDATJ = @LV_GJAHR
**         AND POPER = @LV_POPER.
*         AND BDATJ = @S_GJAHR-LOW
*         AND POPER = @S_POPER-LOW
*         AND VPRSV = 'S'.
      DATA GV_DATE TYPE SY-DATUM.
      GV_DATE = S_GJAHR-LOW && S_POPER-LOW+1(2) && '01'.
      CALL FUNCTION 'CCM_GO_BACK_MONTHS'
        EXPORTING
          CURRDATE   = GV_DATE
          BACKMONTHS = '001'
        IMPORTING
          NEWDATE    = GV_DATE.
      SELECT SINGLE * INTO @DATA(GS_CKMLCR)
        FROM CKMLCR
       WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @GV_DATE+0(4)
         AND POPER = @GV_DATE+4(2).
      <FS_OUT>-STVAL = <FS_OUT>-QUANT * GS_CKMLCR-STPRS / GS_CKMLCR-PEINH.
    ENDLOOP.
    IF GT_OUT[] IS NOT INITIAL.
*      SELECT MLDOCCCS_EXTRACT~ELEMENT,MLDOCCCS_EXTRACT~TOT,MLDOCCCS_EXTRACT~KALNR INTO TABLE @DATA(GT_MLDOCCCS_EXTRACT)
*        FROM MLDOCCCS_EXTRACT
*         FOR ALL ENTRIES IN @GT_OUT
*       WHERE MLDOCCCS_EXTRACT~KALNR = @GT_OUT-KALN1
*         AND MLDOCCCS_EXTRACT~JAHRPER < @GV_JAHRPER.
      SELECT MATNR,MAKTX,SPRAS INTO TABLE @GT_MAKT
        FROM MAKT
         FOR ALL ENTRIES IN @GT_OUT
       WHERE MATNR = @GT_OUT-MATNR.
      SORT GT_MAKT BY MATNR SPRAS.
    ENDIF.
    LOOP AT GT_OUT ASSIGNING <FS_OUT> WHERE ZTYPE = '期初'..
      READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR = <FS_OUT>-MATNR SPRAS = SY-LANGU BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_OUT>-MAKTX = GS_MAKT-MAKTX.
      ENDIF.
      <FS_OUT>-MATNR = |{ <FS_OUT>-MATNR ALPHA = OUT }|.
      <FS_OUT>-GJAHR = S_GJAHR-LOW.
      <FS_OUT>-POPER = S_POPER-LOW.
*      <FS_OUT>-ZTYPE = '期初'.
      <FS_OUT>-TOTAL = <FS_OUT>-STVAL + <FS_OUT>-PRD + <FS_OUT>-KDM.
      SELECT SINGLE PEINH INTO @LV_PEINH
        FROM CKMLCR WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @S_GJAHR-LOW
         AND POPER = @S_POPER-LOW.
      IF <FS_OUT>-QUANT IS NOT INITIAL.
        <FS_OUT>-PRICE = <FS_OUT>-TOTAL / <FS_OUT>-QUANT *  LV_PEINH.
      ENDIF.
      SELECT MLDOCCCS_EXTRACT~ELEMENT,MLDOCCCS_EXTRACT~TOT,MLDOCCCS_EXTRACT~KALNR INTO TABLE @DATA(GT_MLDOCCCS_EXTRACT)
        FROM MLDOCCCS_EXTRACT
       WHERE MLDOCCCS_EXTRACT~KALNR = @<FS_OUT>-KALN1
         AND MLDOCCCS_EXTRACT~JAHRPER < @GV_JAHRPER.
      SORT GT_MLDOCCCS_EXTRACT BY KALNR ELEMENT.
      LOOP AT GT_MLDOCCCS_EXTRACT INTO DATA(GS_MLDOCCCS_EXTRACT)
        GROUP BY ( KALNR = GS_MLDOCCCS_EXTRACT-KALNR ELEMENT = GS_MLDOCCCS_EXTRACT-ELEMENT )."按括号里的条件进行分组
        LOOP AT GROUP GS_MLDOCCCS_EXTRACT INTO DATA(MEMBER_EXTRACT)."按分组后进行组员的访问,这里就是对同一组的进行某个字段的汇总
          CHECK MEMBER_EXTRACT-KALNR = <FS_OUT>-KALN1.
          IF MEMBER_EXTRACT-ELEMENT = '010'.
            <FS_OUT>-ELM10 = <FS_OUT>-ELM10 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '011'.
            <FS_OUT>-ELM11 = <FS_OUT>-ELM11 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '012'.
            <FS_OUT>-ELM12 = <FS_OUT>-ELM12 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '013'.
            <FS_OUT>-ELM13 = <FS_OUT>-ELM13 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '014'.
            <FS_OUT>-ELM14 = <FS_OUT>-ELM14 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '015'.
            <FS_OUT>-ELM15 = <FS_OUT>-ELM15 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '016'.
            <FS_OUT>-ELM16 = <FS_OUT>-ELM16 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '017'.
            <FS_OUT>-ELM17 = <FS_OUT>-ELM17 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '018'.
            <FS_OUT>-ELM18 = <FS_OUT>-ELM18 + MEMBER_EXTRACT-TOT.
          ELSEIF MEMBER_EXTRACT-ELEMENT = '019'.
            <FS_OUT>-ELM19 = <FS_OUT>-ELM19 + MEMBER_EXTRACT-TOT.
          ENDIF.
        ENDLOOP.
        <FS_OUT>-ELM = <FS_OUT>-ELM10 + <FS_OUT>-ELM11 + <FS_OUT>-ELM12 + <FS_OUT>-ELM13 +
        <FS_OUT>-ELM14 + <FS_OUT>-ELM15 + <FS_OUT>-ELM16 + <FS_OUT>-ELM17 + <FS_OUT>-ELM18 + <FS_OUT>-ELM19.
      ENDLOOP.
    ENDLOOP.
    SELECT
  SUM( MLDOC~QUANT ) AS QUANT,MLDOC~MEINS,MBEW~BWKEY,MBEW~MATNR,SUM( MLDOC~STVAL ) AS STVAL,
  SUM( MLDOC~PRD ) AS PRD,SUM( MLDOC~KDM ) AS KDM,MBEW~KALN1,'消耗' AS ZTYPE,'3' AS NUM
           FROM MBEW
           LEFT JOIN MLDOC
  ON MLDOC~JAHRPER = @GV_JAHRPER
  AND MLDOC~KALNR = MBEW~KALN1
  AND MLDOC~CATEG = 'VN'
           WHERE MBEW~MATNR IN @S_MATNR
             AND MBEW~BWKEY IN @S_BWKEY
             GROUP BY MATNR,MEINS,BWKEY,MBEW~KALN1
            APPENDING CORRESPONDING FIELDS OF TABLE @GT_OUT.
    IF GT_OUT[] IS NOT INITIAL.
*      SELECT MLDOCCCS~DOCREF,MLDOCCCS~ELEMENT,MLDOCCCS~TOT,MLDOC~KALNR INTO TABLE @GT_MLDOCCCS
*        FROM MLDOC
*        LEFT JOIN MLDOCCCS
*          ON MLDOC~DOCREF = MLDOCCCS~DOCREF
*         FOR ALL ENTRIES IN @GT_OUT
*       WHERE MLDOC~KALNR = @GT_OUT-KALN1
*         AND MLDOC~JAHRPER = @GV_JAHRPER
*         AND MLDOC~CATEG = 'VN'.
      SELECT MATNR,MAKTX,SPRAS INTO TABLE @GT_MAKT
        FROM MAKT
         FOR ALL ENTRIES IN @GT_OUT
       WHERE MATNR = @GT_OUT-MATNR.
      SORT GT_MAKT BY MATNR SPRAS.
    ENDIF.
    LOOP AT GT_OUT ASSIGNING <FS_OUT>  WHERE ZTYPE = '消耗'...
      <FS_OUT>-QUANT = <FS_OUT>-QUANT * -1.
      READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR = <FS_OUT>-MATNR SPRAS = SY-LANGU BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_OUT>-MAKTX = GS_MAKT-MAKTX.
      ENDIF.
      <FS_OUT>-MATNR = |{ <FS_OUT>-MATNR ALPHA = OUT }|.
      <FS_OUT>-GJAHR = S_GJAHR-LOW.
      <FS_OUT>-POPER = S_POPER-LOW.
      <FS_OUT>-TOTAL = <FS_OUT>-STVAL + <FS_OUT>-PRD + <FS_OUT>-KDM.
      SELECT SINGLE PEINH INTO @LV_PEINH
        FROM CKMLCR WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @S_GJAHR-LOW
         AND POPER = @S_POPER-LOW.
      IF <FS_OUT>-QUANT IS NOT INITIAL.
        <FS_OUT>-PRICE = <FS_OUT>-TOTAL / <FS_OUT>-QUANT *  LV_PEINH.
      ENDIF.
      SELECT MLDOCCCS~DOCREF,MLDOCCCS~ELEMENT,MLDOCCCS~TOT,MLDOC~KALNR INTO TABLE @GT_MLDOCCCS
        FROM MLDOC
        LEFT JOIN MLDOCCCS
          ON MLDOC~DOCREF = MLDOCCCS~DOCREF
       WHERE MLDOC~KALNR = @<FS_OUT>-KALN1
         AND MLDOC~JAHRPER = @GV_JAHRPER
         AND MLDOC~CATEG = 'VN'.
      SORT GT_MLDOCCCS BY DOCREF ELEMENT.
      LOOP AT GT_MLDOCCCS INTO GS_MLDOCCCS
        GROUP BY ( DOCREF = GS_MLDOCCCS-DOCREF ELEMENT = GS_MLDOCCCS-ELEMENT )."按括号里的条件进行分组
        LOOP AT GROUP GS_MLDOCCCS INTO MEMBER."按分组后进行组员的访问,这里就是对同一组的进行某个字段的汇总
          CHECK MEMBER-KALNR = <FS_OUT>-KALN1.
          IF MEMBER-ELEMENT = '010'.
            <FS_OUT>-ELM10 = <FS_OUT>-ELM10 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '011'.
            <FS_OUT>-ELM11 = <FS_OUT>-ELM11 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '012'.
            <FS_OUT>-ELM12 = <FS_OUT>-ELM12 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '013'.
            <FS_OUT>-ELM13 = <FS_OUT>-ELM13 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '014'.
            <FS_OUT>-ELM14 = <FS_OUT>-ELM14 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '015'.
            <FS_OUT>-ELM15 = <FS_OUT>-ELM15 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '016'.
            <FS_OUT>-ELM16 = <FS_OUT>-ELM16 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '017'.
            <FS_OUT>-ELM17 = <FS_OUT>-ELM17 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '018'.
            <FS_OUT>-ELM18 = <FS_OUT>-ELM18 + MEMBER-TOT.
          ELSEIF MEMBER-ELEMENT = '019'.
            <FS_OUT>-ELM19 = <FS_OUT>-ELM19 + MEMBER-TOT.
          ENDIF.
        ENDLOOP.
        <FS_OUT>-ELM = <FS_OUT>-ELM10 + <FS_OUT>-ELM11 + <FS_OUT>-ELM12 + <FS_OUT>-ELM13 +
        <FS_OUT>-ELM14 + <FS_OUT>-ELM15 + <FS_OUT>-ELM16 + <FS_OUT>-ELM17 + <FS_OUT>-ELM18 + <FS_OUT>-ELM19.
      ENDLOOP.
      FILL_FIELD 'STVAL'   '初级评估' '' '25' '' '' '' '' ''.
      FILL_FIELD 'PRD'   '价格差异' '' '25' '' '' '' '' ''.
      FILL_FIELD 'KDM'   '汇率差异' '' '25' '' '' '' '' ''.
      FILL_FIELD 'TOTAL'   '实际值' '' '25' '' '' '' '' ''.
      FILL_FIELD 'PRICE'   '价格' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM10'   '直接材料-电芯' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM11'   '直接材料-模组PACK' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM12'   '半成品' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM13'   '产成品' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM14'   '准备工时' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM15'   '直接人工' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM16'   '设备折旧' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM17'   '燃料动力' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM18'   '制造费用' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM19'   '委外加工' '' '25' '' '' '' '' ''.
      FILL_FIELD 'ELM'   '成本构成总和' '' '25' '' '' '' '' ''.
      <FS_OUT>-STVAL = <FS_OUT>-STVAL * -1.
      <FS_OUT>-PRD = <FS_OUT>-PRD * -1.
      <FS_OUT>-KDM = <FS_OUT>-KDM * -1.
      <FS_OUT>-TOTAL = <FS_OUT>-TOTAL * -1.
      <FS_OUT>-PRICE = <FS_OUT>-PRICE * -1.
      <FS_OUT>-ELM10 = <FS_OUT>-ELM10 * -1.
      <FS_OUT>-ELM11 = <FS_OUT>-ELM11 * -1.
      <FS_OUT>-ELM12 = <FS_OUT>-ELM12 * -1.
      <FS_OUT>-ELM13 = <FS_OUT>-ELM13 * -1.
      <FS_OUT>-ELM14 = <FS_OUT>-ELM14 * -1.
      <FS_OUT>-ELM15 = <FS_OUT>-ELM15 * -1.
      <FS_OUT>-ELM16 = <FS_OUT>-ELM16 * -1.
      <FS_OUT>-ELM17 = <FS_OUT>-ELM17 * -1.
      <FS_OUT>-ELM18 = <FS_OUT>-ELM18 * -1.
      <FS_OUT>-ELM19 = <FS_OUT>-ELM19 * -1.
      <FS_OUT>-ELM = <FS_OUT>-ELM * -1.
    ENDLOOP.
    SELECT
   MLDOC~MEINS,MBEW~BWKEY,MBEW~MATNR,
   SUM( MLDOC~PRD ) AS PRD,SUM( MLDOC~KDM ) AS KDM,MBEW~KALN1,'期末库存' AS ZTYPE,'4' AS NUM
            FROM MBEW
            LEFT JOIN MLDOC
   ON MLDOC~JAHRPER = @GV_JAHRPER
   AND MLDOC~KALNR = MBEW~KALN1
   AND MLDOC~CATEG = 'EB'
            WHERE MBEW~MATNR IN @S_MATNR
              AND MBEW~BWKEY IN @S_BWKEY
              GROUP BY MATNR,MEINS,BWKEY,MBEW~KALN1
             APPENDING CORRESPONDING FIELDS OF TABLE @GT_OUT.
    LOOP AT GT_OUT ASSIGNING <FS_OUT>  WHERE ZTYPE = '期末库存'.
      <FS_OUT>-PRD = <FS_OUT>-PRD * -1.
      <FS_OUT>-KDM = <FS_OUT>-KDM * -1.
      READ TABLE GT_MAKT INTO GS_MAKT WITH KEY MATNR = <FS_OUT>-MATNR SPRAS = SY-LANGU BINARY SEARCH.
      IF SY-SUBRC = 0.
        <FS_OUT>-MAKTX = GS_MAKT-MAKTX.
      ENDIF.
      <FS_OUT>-MATNR = |{ <FS_OUT>-MATNR ALPHA = OUT }|.
      <FS_OUT>-GJAHR = S_GJAHR-LOW.
      <FS_OUT>-POPER = S_POPER-LOW.
      READ TABLE GT_OUT INTO DATA(LS_OUT1) WITH KEY
      ZTYPE = '期初' GJAHR = <FS_OUT>-GJAHR POPER = <FS_OUT>-POPER BWKEY = <FS_OUT>-BWKEY MATNR = <FS_OUT>-MATNR.
      READ TABLE GT_OUT INTO DATA(LS_OUT2) WITH KEY
      ZTYPE = '收货' GJAHR = <FS_OUT>-GJAHR POPER = <FS_OUT>-POPER BWKEY = <FS_OUT>-BWKEY MATNR = <FS_OUT>-MATNR.
      READ TABLE GT_OUT INTO DATA(LS_OUT3) WITH KEY
      ZTYPE = '消耗' GJAHR = <FS_OUT>-GJAHR POPER = <FS_OUT>-POPER BWKEY = <FS_OUT>-BWKEY MATNR = <FS_OUT>-MATNR.
      IF LS_OUT1-MEINS IS NOT INITIAL.
        <FS_OUT>-MEINS = LS_OUT1-MEINS.
      ELSEIF LS_OUT2-MEINS IS NOT INITIAL.
        <FS_OUT>-MEINS = LS_OUT2-MEINS.
      ELSEIF LS_OUT3-MEINS IS NOT INITIAL.
        <FS_OUT>-MEINS = LS_OUT3-MEINS.
      ENDIF.
      <FS_OUT>-QUANT = LS_OUT1-QUANT + LS_OUT2-QUANT - LS_OUT3-QUANT .
*期末库存减去因标准价格修改进行重新评估价格更改的标准成本:期初+ZU收货+PC重新评估-VN消耗=期末
      SELECT SINGLE KALN1 INTO @DATA(GV_KALN1) FROM MBEW
       WHERE MATNR IN @S_MATNR
         AND BWKEY IN @S_BWKEY.
      SELECT SUM( STVAL ) INTO @DATA(GV_PC) FROM MLDOC
       WHERE KALNR = @GV_KALN1
         AND CATEG = 'PC'
         AND JAHRPER = @GV_JAHRPER.
      <FS_OUT>-STVAL = LS_OUT1-STVAL + LS_OUT2-STVAL - LS_OUT3-STVAL + GV_PC.
      <FS_OUT>-ELM10 = LS_OUT1-ELM10 + LS_OUT2-ELM10 - LS_OUT3-ELM10 .
      <FS_OUT>-ELM11 = LS_OUT1-ELM11 + LS_OUT2-ELM11 - LS_OUT3-ELM11 .
      <FS_OUT>-ELM12 = LS_OUT1-ELM12 + LS_OUT2-ELM12 - LS_OUT3-ELM12 .
      <FS_OUT>-ELM13 = LS_OUT1-ELM13 + LS_OUT2-ELM13 - LS_OUT3-ELM13 .
      <FS_OUT>-ELM14 = LS_OUT1-ELM14 + LS_OUT2-ELM14 - LS_OUT3-ELM14 .
      <FS_OUT>-ELM15 = LS_OUT1-ELM15 + LS_OUT2-ELM15 - LS_OUT3-ELM15 .
      <FS_OUT>-ELM16 = LS_OUT1-ELM16 + LS_OUT2-ELM16 - LS_OUT3-ELM16 .
      <FS_OUT>-ELM17 = LS_OUT1-ELM17 + LS_OUT2-ELM17 - LS_OUT3-ELM17 .
      <FS_OUT>-ELM18 = LS_OUT1-ELM18 + LS_OUT2-ELM18 - LS_OUT3-ELM18 .
      <FS_OUT>-ELM19 = LS_OUT1-ELM19 + LS_OUT2-ELM19 - LS_OUT3-ELM19 .
      <FS_OUT>-ELM = LS_OUT1-ELM + LS_OUT2-ELM - LS_OUT3-ELM .
      <FS_OUT>-TOTAL = <FS_OUT>-STVAL + <FS_OUT>-PRD + <FS_OUT>-KDM.
      SELECT SINGLE PEINH INTO @LV_PEINH
        FROM CKMLCR WHERE KALNR = @<FS_OUT>-KALN1
         AND BDATJ = @S_GJAHR-LOW
         AND POPER = @S_POPER-LOW.
      IF <FS_OUT>-QUANT IS NOT INITIAL.
        <FS_OUT>-PRICE = <FS_OUT>-TOTAL / <FS_OUT>-QUANT *  LV_PEINH.
      ENDIF.
    ENDLOOP.
  ENDIF.
  DELETE GT_OUT WHERE ( NUM = '1' OR NUM = '3' ).
  IF P_R1 = '' AND P_R2 = 'X'.
    DELETE GT_OUT WHERE NUM = '2'.
  ENDIF.
  SORT GT_OUT BY GJAHR POPER BWKEY MATNR NUM .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_DATA .
  PERFORM FRM_LAYOUT.
  PERFORM FRM_FILL_FIELD.
  PERFORM FRM_ALV_DISPLAY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_LAYOUT .
  CLEAR: WA_LAYOUT."它用来定义ALV报表的整体属性
  WA_LAYOUT-CWIDTH_OPT     = 'X'."优化列宽选项是否设置
  WA_LAYOUT-BOX_FNAME      = 'SEL'.
  WA_LAYOUT-INFO_FNAME     = 'CLR'.  "行颜色代码的字段
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_FILL_FIELD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_FILL_FIELD .
  CLEAR:FIELDCAT.REFRESH:FIELDCAT.
  FILL_FIELD 'GJAHR'   '年度' '' '25' '' '' '' '' ''.
  FILL_FIELD 'POPER'   '期间' '' '25' '' '' '' '' ''.
  FILL_FIELD 'BWKEY'   '工厂' '' '25' '' '' '' '' ''.
  FILL_FIELD 'MATNR'   '物料' '' '25' '' '' '' '' ''.
  FILL_FIELD 'MAKTX'   '物料名称' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ZTYPE'   '类别' '' '25' '' '' '' '' ''.
  FILL_FIELD 'QUANT'   '交易数量' '' '25' '' '' '' '' ''.
  FILL_FIELD 'MEINS'   '数量单位' '' '25' '' '' '' '' ''.
  FILL_FIELD 'STVAL'   '初级评估' '' '25' '' '' '' '' ''.
  FILL_FIELD 'PRD'   '价格差异' '' '25' '' '' '' '' ''.
  FILL_FIELD 'KDM'   '汇率差异' '' '25' '' '' '' '' ''.
  FILL_FIELD 'TOTAL'   '实际值' '' '25' '' '' '' '' ''.
  FILL_FIELD 'PRICE'   '价格' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM10'   '直接材料-电芯' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM11'   '直接材料-模组PACK' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM12'   '半成品' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM13'   '产成品' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM14'   '准备工时' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM15'   '直接人工' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM16'   '设备折旧' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM17'   '燃料动力' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM18'   '制造费用' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM19'   '委外加工' '' '25' '' '' '' '' ''.
  FILL_FIELD 'ELM'   '成本构成总和' '' '25' '' '' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_ALV_DISPLAY .
  CLEAR:IS_VARIANT.
*      IS_VARIANT-REPORT = 'ZFIR022'.
*      IS_VARIANT-HANDLE = '1'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM          = SY-REPID
      I_CALLBACK_USER_COMMAND     = 'USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET    = 'PF_STATUS_ZKSSJ'
      IS_LAYOUT_LVC               = WA_LAYOUT
      IT_FIELDCAT_LVC             = FIELDCAT[]
      I_CALLBACK_HTML_TOP_OF_PAGE = 'ALV_TOP_OF_PAGE'
*     it_sort_lvc                 = i_sort[]
      I_DEFAULT                   = 'X'
      I_SAVE                      = 'A'
      IT_EVENTS                   = GT_EVENT[]
      IS_VARIANT                  = IS_VARIANT
    TABLES
      T_OUTTAB                    = GT_OUT[]
    EXCEPTIONS
      OTHERS                      = 2.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PF_STATUS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LT_EXTAB   text
*----------------------------------------------------------------------*
FORM PF_STATUS_ZKSSJ USING LT_EXTAB.
  SET PF-STATUS 'MENU'.
ENDFORM.                    "PF_STATUS
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
      IS_SELFIELD TYPE SLIS_SELFIELD.
ENDFORM.
FORM ALV_TOP_OF_PAGE USING CL_DD TYPE REF TO CL_DD_DOCUMENT.
**form alv_top_of_page using cl_dd type ref to cl_dd_document.
*  DATA: M_P TYPE I.
*  DATA: M_BUFF  TYPE STRING.
*  DATA:LV_MESSAGE TYPE CHAR255.
*
*  M_BUFF = '<html>'.
*  CALL METHOD CL_DD->HTML_INSERT
*    EXPORTING
*      CONTENTS = M_BUFF
*    CHANGING
*      POSITION = M_P.
*
*  CLEAR:LV_MESSAGE.
*  IF S_YEPER-HIGH = S_YEPER-LOW.
*    CONCATENATE S_YEPER-LOW+0(4) '年' S_YEPER-LOW+5(2) '月' '客户余额表' INTO LV_MESSAGE.
*  ELSEIF S_YEPER-HIGH <> S_YEPER-LOW.
*    CONCATENATE S_YEPER-LOW+0(4) '年' S_YEPER-LOW+5(2) '月' '至' S_YEPER-HIGH+0(4) '年' S_YEPER-HIGH+5(2) '月' '客户余额表' INTO LV_MESSAGE.
*  ENDIF.
*
*  M_BUFF = '<p align="center"><span style="font-family: 黑体"><font size="6">' && LV_MESSAGE && '</var></font></span><P>'.
*
*  CALL METHOD CL_DD->HTML_INSERT
*    EXPORTING
*      CONTENTS = M_BUFF
*    CHANGING
*      POSITION = M_P.
ENDFORM.参考文献
你认为这篇文章怎么样?
0
0
0
0
0
0





