• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
^ω^SAp傻X^o^
博客园    首页    新随笔    联系   管理    订阅  订阅
物料期间价值 - 实际成本
*&---------------------------------------------------------------------*
*& Report ZCOR002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zcor002.

INCLUDE zcor002_top.
INCLUDE zcor002_sel.
INCLUDE zcor002_frm.

START-OF-SELECTION .
  PERFORM frm_get_data.     "取数
  PERFORM frm_layout_build."  设置表格样式
  PERFORM frm_field_build. "  建立表头数据
  PERFORM frm_data_out.     "输出ALV
*&---------------------------------------------------------------------*
*&  包含                ZCOR002_TOP
*&---------------------------------------------------------------------*
TABLES: mkpf,mseg,ckmlprkeph .

DATA: BEGIN OF gs_alv,
        sel        TYPE c,
        num        TYPE i,
        gjahr      LIKE ckmlprkeph-bdatj,
        poper      LIKE ckmlprkeph-poper,
        werks      LIKE marc-werks,
        matnr      LIKE marc-matnr,
        maktx      LIKE makt-maktx,
        mmsta      LIKE marc-mmsta,
        sum1       LIKE ckmlkeph-kst001, "初始库存 - 总实际值
        menge1     LIKE mseg-menge,
        kst001_1   LIKE ckmlkeph-kst001,
        kst002_1   LIKE ckmlkeph-kst002,
        kst004_1   LIKE ckmlkeph-kst004,
        kst006_1   LIKE ckmlkeph-kst006,
        kst008_1   LIKE ckmlkeph-kst008,
        sum2       LIKE ckmlkeph-kst001, "本期收据 - 总实际值
        menge2     LIKE mseg-menge,
        kst001_2   LIKE ckmlkeph-kst001,
        kst002_2   LIKE ckmlkeph-kst002,
        kst004_2   LIKE ckmlkeph-kst004,
        kst006_2   LIKE ckmlkeph-kst006,
        kst008_2   LIKE ckmlkeph-kst008,
        sum3       LIKE ckmlkeph-kst001, "本期消耗 - 总实际值
        menge3     LIKE mseg-menge,
        kst001_3   LIKE ckmlkeph-kst001,
        kst002_3   LIKE ckmlkeph-kst002,
        kst004_3   LIKE ckmlkeph-kst004,
        kst006_3   LIKE ckmlkeph-kst006,
        kst008_3   LIKE ckmlkeph-kst008,
        sum4       LIKE ckmlkeph-kst001, "期末库存 - 总实际值
        menge4     LIKE mseg-menge,
        kst001_4   LIKE ckmlkeph-kst001,
        kst002_4   LIKE ckmlkeph-kst002,
        kst004_4   LIKE ckmlkeph-kst004,
        kst006_4   LIKE ckmlkeph-kst006,
        kst008_4   LIKE ckmlkeph-kst008,
        "未分摊
        sum_not    LIKE ckmlkeph-kst001,
        kst001_not LIKE ckmlkeph-kst001,
        kst002_not LIKE ckmlkeph-kst002,
        kst004_not LIKE ckmlkeph-kst004,
        kst006_not LIKE ckmlkeph-kst006,
        kst008_not LIKE ckmlkeph-kst008,
      END OF gs_alv .
DATA gt_alv LIKE TABLE OF gs_alv .

DATA: gs_fieldcat TYPE slis_fieldcat_alv,
      gt_fieldcat TYPE slis_t_fieldcat_alv,
      gs_layout   TYPE slis_layout_alv.
*&---------------------------------------------------------------------*
*&  包含                ZCOR002_SEL
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS p_gjahr LIKE ckmlprkeph-bdatj OBLIGATORY .
PARAMETERS p_poper LIKE ckmlprkeph-poper OBLIGATORY .
SELECT-OPTIONS s_werks FOR mseg-werks .
SELECT-OPTIONS s_matnr FOR mseg-matnr .
SELECTION-SCREEN END OF BLOCK b1 .
*&---------------------------------------------------------------------*
*&  包含                ZCOR002_FRM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       取数
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  DATA: lt_makt TYPE TABLE OF makt,
        ls_makt TYPE makt.

  DATA: BEGIN OF ls_marc,
          matnr LIKE marc-matnr,
          werks LIKE marc-werks,
          mmsta LIKE marc-mmsta,
        END OF ls_marc.
  DATA lt_marc LIKE TABLE OF ls_marc.

  DATA: BEGIN OF ls_mseg,"总数据
          mblnr      LIKE mseg-mblnr,
          mjahr      LIKE mseg-mjahr,
          zeile      LIKE mseg-zeile,
          werks      LIKE mseg-werks,
          matnr      LIKE mseg-matnr,
          budat_mkpf LIKE mseg-budat_mkpf,
          shkzg      LIKE mseg-shkzg,
          menge      LIKE mseg-menge,
          bwart      LIKE mseg-bwart,
        END OF ls_mseg.
  DATA lt_mseg LIKE TABLE OF ls_mseg ."总数据
  FIELD-SYMBOLS <ls_mseg> LIKE ls_mseg."总数据
  TYPES: BEGIN OF ty_mseg,"初始库存、本期收据、本期消耗要用到的类型
           werks TYPE mseg-werks,
           matnr TYPE mseg-matnr,
           menge TYPE mseg-menge,
         END OF ty_mseg.
  DATA: lt_mseg1 TYPE TABLE OF ty_mseg, "初始库存 - 数量
        ls_mseg1 TYPE ty_mseg. "初始库存 - 数量
  DATA: lt_mseg2 TYPE TABLE OF ty_mseg, "本期收据 - 数量
        ls_mseg2 TYPE ty_mseg. "本期收据 - 数量
  DATA: lt_mseg3 TYPE TABLE OF ty_mseg, "本期消耗 - 数量
        ls_mseg3 TYPE ty_mseg. "本期消耗 - 数量
  DATA: lt_mseg4 TYPE TABLE OF ty_mseg, "期末库存 - 数量
        ls_mseg4 TYPE ty_mseg. "期末库存 - 数量
  DATA: lt_mseg_del LIKE TABLE OF ls_mseg, "根据筛选出来的MSEG删除重复项后只保留WERKS MATNR
        ls_mseg_del LIKE ls_mseg.

  DATA: lt_zcot001 LIKE TABLE OF zcot001,
        ls_zcot001 LIKE zcot001.

  "原料
  DATA: BEGIN OF ls_ckmlhd ,
*          kalnr LIKE ckmlhd-kalnr,
          matnr LIKE ckmlhd-matnr,
          bwkey LIKE ckmlhd-bwkey.
      INCLUDE TYPE ckmlprkeph .
  DATA: END OF ls_ckmlhd .
  DATA: lt_ckmlhd LIKE TABLE OF ls_ckmlhd. "总数据
*        ls_ckmlhd LIKE ckmlhd. "总数据
  FIELD-SYMBOLS <ls_ckmlhd> LIKE LINE OF lt_ckmlhd ."总数据
  DATA: lt_ckmlprkeph LIKE TABLE OF ckmlprkeph, "总数据
        ls_ckmlprkeph LIKE ckmlprkeph. "总数据
  DATA: lt_ckmlkeph LIKE TABLE OF ckmlkeph, "总数据
        ls_ckmlkeph LIKE ckmlkeph. "总数据
  TYPES: BEGIN OF ty_ckmlhd,
           kalnr  TYPE ckmlhd-kalnr,
           werks  TYPE mseg-werks,
           matnr  TYPE mseg-matnr,
           kst001 TYPE ckmlkeph-kst001,
           kst002 TYPE ckmlkeph-kst002,
           kst004 TYPE ckmlkeph-kst004,
           kst006 TYPE ckmlkeph-kst006,
           kst008 TYPE ckmlkeph-kst008,
         END OF ty_ckmlhd.
  DATA: lt_ckmlhd1 TYPE HASHED TABLE OF ty_ckmlhd WITH UNIQUE KEY kalnr werks matnr, "初始库存 - 原料、包材、人工、机器、制造费用
        ls_ckmlhd1 TYPE ty_ckmlhd. "初始库存 - 原料、包材、人工、机器、制造费用
  FIELD-SYMBOLS <ls_ckmlhd1> TYPE ty_ckmlhd .
  DATA: lt_ckmlhd2 TYPE HASHED TABLE OF ty_ckmlhd WITH UNIQUE KEY kalnr werks matnr, "本期收据 - 原料、包材、人工、机器、制造费用
        ls_ckmlhd2 TYPE ty_ckmlhd. "本期收据 - 原料、包材、人工、机器、制造费用
  FIELD-SYMBOLS <ls_ckmlhd2> TYPE ty_ckmlhd .
  DATA: lt_ckmlhd3 TYPE HASHED TABLE OF ty_ckmlhd WITH UNIQUE KEY kalnr werks matnr, "本期消耗 - 原料、包材、人工、机器、制造费用
        ls_ckmlhd3 TYPE ty_ckmlhd. "本期消耗 - 原料、包材、人工、机器、制造费用
  FIELD-SYMBOLS <ls_ckmlhd3> TYPE ty_ckmlhd .
  DATA: lt_ckmlhd4 TYPE HASHED TABLE OF ty_ckmlhd WITH UNIQUE KEY kalnr werks matnr, "期末库存 - 原料、包材、人工、机器、制造费用
        ls_ckmlhd4 TYPE ty_ckmlhd. "期末库存 - 原料、包材、人工、机器、制造费用
  FIELD-SYMBOLS <ls_ckmlhd4> TYPE ty_ckmlhd .

  DATA l_num TYPE i VALUE IS INITIAL .

  SELECT *
    INTO TABLE lt_makt
    FROM makt
   WHERE matnr IN s_matnr
     AND spras = 1 .
  SORT lt_makt BY matnr .

  SELECT matnr
         werks
         mmsta
    INTO CORRESPONDING FIELDS OF TABLE lt_marc
    FROM marc
   WHERE matnr IN s_matnr
     AND werks IN s_werks.
  SORT lt_marc BY werks matnr .

  SELECT mblnr
         mjahr
         zeile
         werks
         matnr
         budat_mkpf
         shkzg
         menge
         bwart
    INTO CORRESPONDING FIELDS OF TABLE lt_mseg
    FROM mseg
   WHERE werks IN s_werks
     AND matnr IN s_matnr .

  SELECT *
    INTO TABLE lt_zcot001
    FROM zcot001 .

  SELECT
*         hd~kalnr,
         hd~matnr,
         hd~bwkey,
         ph~*
    INTO CORRESPONDING FIELDS OF TABLE @lt_ckmlhd
    FROM ckmlhd AS hd
   INNER JOIN ckmlprkeph AS ph
      ON hd~kalnr = ph~kalnr
   WHERE hd~matnr IN @s_matnr
     AND hd~bwkey IN @s_werks
     AND ph~bdatj = @p_gjahr
     AND ph~poper = @p_poper
     AND ph~keart = 'H'
     AND ph~prtyp = 'S'
     AND ph~curtp = '10'
     AND ph~untper = ''
     AND ph~kkzst = ''
     AND ph~patnr = ''
     AND ph~dipa = '' .
  SORT lt_ckmlhd BY bwkey matnr .

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE lt_ckmlkeph
    FROM ckmlkeph
     FOR ALL ENTRIES IN lt_ckmlhd
   WHERE kalnr = lt_ckmlhd-kalnr
     AND bdatj = p_gjahr
     AND poper = p_poper
     AND keart = 'H'
     AND curtp = '10'
     AND untper = ''
     AND ptyp = ''
     AND bvalt = ''
     AND kkzst = ''
     AND patnr = ''
     AND dipa = '' .
  SORT lt_ckmlkeph BY kalnr categ .

  APPEND LINES OF lt_mseg TO lt_mseg_del .
  SORT lt_mseg_del BY werks matnr .
  DELETE ADJACENT DUPLICATES FROM lt_mseg_del COMPARING werks matnr .

  "初始库存-数量、本期收据-数量、本期消耗-数量 - 计算
  LOOP AT lt_mseg ASSIGNING <ls_mseg>.
    IF <ls_mseg>-budat_mkpf+0(4) < p_gjahr OR
       <ls_mseg>-budat_mkpf+0(4) = p_gjahr AND "初始库存 - 数量
       <ls_mseg>-budat_mkpf+4(2) < p_poper .
      MOVE-CORRESPONDING <ls_mseg> TO ls_mseg1 .
      IF <ls_mseg>-shkzg = 'S'.
        COLLECT ls_mseg1 INTO lt_mseg1 .
      ELSEIF <ls_mseg>-shkzg = 'H'.
        ls_mseg1-menge = ls_mseg1-menge * -1 .
        COLLECT ls_mseg1 INTO lt_mseg1 .
      ENDIF.
      CLEAR ls_mseg1 .
    ELSEIF
       <ls_mseg>-budat_mkpf+0(4) = p_gjahr AND
       <ls_mseg>-budat_mkpf+4(2) <= p_poper .
      MOVE-CORRESPONDING <ls_mseg> TO ls_mseg2 .
      "本期收据 - 数量
      READ TABLE lt_zcot001 INTO ls_zcot001 WITH KEY bwart = <ls_mseg>-bwart
                                                     shkzg = <ls_mseg>-shkzg
                                                     mark = 'IN'.
      IF sy-subrc = 0 .
        IF <ls_mseg>-shkzg = 'S'.
          COLLECT ls_mseg2 INTO lt_mseg2 .
        ELSEIF <ls_mseg>-shkzg = 'H'.
          ls_mseg2-menge = ls_mseg2-menge * -1 .
          COLLECT ls_mseg2 INTO lt_mseg2 .
        ENDIF.
        CLEAR ls_mseg2 .
      ELSE.
        CLEAR ls_zcot001 .
        READ TABLE lt_zcot001 INTO ls_zcot001 WITH KEY bwart = <ls_mseg>-bwart
                                                     shkzg = ''
                                                     mark = 'IN'.
        IF sy-subrc = 0 .
          IF <ls_mseg>-shkzg = 'S'.
            COLLECT ls_mseg2 INTO lt_mseg2 .
          ELSEIF <ls_mseg>-shkzg = 'H'.
            ls_mseg2-menge = ls_mseg2-menge * -1 .
            COLLECT ls_mseg2 INTO lt_mseg2 .
          ENDIF.
          CLEAR ls_mseg2 .
        ENDIF.
      ENDIF.
      CLEAR ls_zcot001.

      "本期消耗 - 数量
      MOVE-CORRESPONDING <ls_mseg> TO ls_mseg3 .
      READ TABLE lt_zcot001 INTO ls_zcot001 WITH KEY bwart = <ls_mseg>-bwart
                                                     shkzg = <ls_mseg>-shkzg "
                                                     mark = 'OUT'.
      IF sy-subrc = 0 .
        IF <ls_mseg>-shkzg = 'S'.
          COLLECT ls_mseg3 INTO lt_mseg3 .
        ELSEIF <ls_mseg>-shkzg = 'H'.
          ls_mseg3-menge = ls_mseg3-menge * -1 .
          COLLECT ls_mseg3 INTO lt_mseg3 .
        ENDIF.
        CLEAR ls_mseg3 .
      ELSE.
        CLEAR ls_zcot001 .
        READ TABLE lt_zcot001 INTO ls_zcot001 WITH KEY bwart = <ls_mseg>-bwart
                                                     shkzg = ''
                                                     mark = 'IN'.
        IF sy-subrc = 0 .
          IF <ls_mseg>-shkzg = 'S'.
            COLLECT ls_mseg3 INTO lt_mseg3 .
          ELSEIF <ls_mseg>-shkzg = 'H'.
            ls_mseg3-menge = ls_mseg3-menge * -1 .
            COLLECT ls_mseg3 INTO lt_mseg3 .
          ENDIF.
          CLEAR ls_mseg3 .
        ENDIF.
      ENDIF.
      CLEAR ls_zcot001.
    ENDIF.
  ENDLOOP.

  SORT lt_mseg1 BY werks matnr .
  SORT lt_mseg2 BY werks matnr .
  SORT lt_mseg3 BY werks matnr .

  "期末库存数量 - 计算
  LOOP AT lt_mseg_del INTO ls_mseg_del .
    "期初库存数量
    READ TABLE lt_mseg1 INTO ls_mseg1 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      ls_mseg4-menge = ls_mseg1-menge .
    ELSE.
      ls_mseg4-menge = 0 .
    ENDIF.
    "本期收据数量
    READ TABLE lt_mseg2 INTO ls_mseg2 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      ls_mseg4-menge = ls_mseg2-menge .
    ELSE.
      ls_mseg4-menge = ls_mseg4-menge + 0 .
    ENDIF.
    "本期消耗数量
    READ TABLE lt_mseg3 INTO ls_mseg3 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      ls_mseg4-menge = ls_mseg3-menge .
    ELSE.
      ls_mseg4-menge = ls_mseg4-menge - 0 .
    ENDIF.

    APPEND ls_mseg4 TO lt_mseg4 .

    CLEAR: ls_mseg1,ls_mseg2,ls_mseg3,ls_mseg4 .
    CLEAR ls_mseg_del .
  ENDLOOP.

  "原料、包材、人工、机器、制造费用 取值
  LOOP AT lt_ckmlhd ASSIGNING <ls_ckmlhd>.
    "原料
    READ TABLE lt_ckmlkeph WITH KEY kalnr = <ls_ckmlhd>-kalnr  BINARY SEARCH
                                                  TRANSPORTING NO FIELDS .
    IF sy-subrc = 0 .
      LOOP AT lt_ckmlkeph INTO ls_ckmlkeph FROM sy-tabix .
        IF ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND "初始库存 - 原料
            ls_ckmlkeph-categ = 'AB'.
          ls_ckmlhd1-werks = <ls_ckmlhd>-bwkey .
          ls_ckmlhd1-matnr = <ls_ckmlhd>-matnr .
          MOVE-CORRESPONDING ls_ckmlkeph TO ls_ckmlhd1 .
          COLLECT ls_ckmlhd1 INTO lt_ckmlhd1 .
          CLEAR ls_ckmlhd1 .
        ELSEIF ( ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND "本期收据 - 原料
            ls_ckmlkeph-categ = 'PC' ) OR
            ( ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND
            ls_ckmlkeph-categ = 'ZU' ) OR
          ( ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND
            ls_ckmlkeph-categ = 'VP' ) .
          ls_ckmlhd2-werks = <ls_ckmlhd>-bwkey .
          ls_ckmlhd2-matnr = <ls_ckmlhd>-matnr .
          MOVE-CORRESPONDING ls_ckmlkeph TO ls_ckmlhd2 .
          COLLECT ls_ckmlhd2 INTO lt_ckmlhd2 .
          CLEAR ls_ckmlhd2 .
        ELSEIF ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND "本期消耗 - 原料
            ls_ckmlkeph-categ = 'VN' .
          ls_ckmlhd3-werks = <ls_ckmlhd>-bwkey .
          ls_ckmlhd3-matnr = <ls_ckmlhd>-matnr .
          MOVE-CORRESPONDING ls_ckmlkeph TO ls_ckmlhd3 .
          COLLECT ls_ckmlhd3 INTO lt_ckmlhd3 .
          CLEAR ls_ckmlhd3 .
        ELSEIF ls_ckmlkeph-kalnr = <ls_ckmlhd>-kalnr AND "本期消耗 - 原料
            ls_ckmlkeph-categ = 'EB' .
          ls_ckmlhd4-werks = <ls_ckmlhd>-bwkey .
          ls_ckmlhd4-matnr = <ls_ckmlhd>-matnr .
          MOVE-CORRESPONDING ls_ckmlkeph TO ls_ckmlhd4 .
          COLLECT ls_ckmlhd4 INTO lt_ckmlhd4 .
          CLEAR ls_ckmlhd4 .
        ELSE.
          EXIT .
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDLOOP.

  "初始库存 - 原料、包材、人工、机器、制造费用 结果计算.
  LOOP AT lt_ckmlhd1 ASSIGNING <ls_ckmlhd1> .
    "初始库存数量
    READ TABLE lt_mseg1 INTO ls_mseg1 WITH KEY werks = <ls_ckmlhd1>-werks
                                               matnr = <ls_ckmlhd1>-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      READ TABLE lt_ckmlhd INTO ls_ckmlhd WITH KEY bwkey = <ls_ckmlhd1>-werks
                                                   matnr = <ls_ckmlhd1>-matnr
                                                   BINARY SEARCH .
      IF sy-subrc = 0 .
        <ls_ckmlhd1>-kst001 = ls_ckmlhd-kst001 * ls_mseg1-menge .
        <ls_ckmlhd1>-kst002 = ls_ckmlhd-kst002 * ls_mseg1-menge .
        <ls_ckmlhd1>-kst004 = ls_ckmlhd-kst004 * ls_mseg1-menge .
        <ls_ckmlhd1>-kst006 = ls_ckmlhd-kst006 * ls_mseg1-menge .
        <ls_ckmlhd1>-kst008 = ls_ckmlhd-kst008 * ls_mseg1-menge .
      ENDIF.
      CLEAR ls_ckmlhd .
    ENDIF.
    CLEAR ls_mseg1 .
  ENDLOOP.

  "本期收据 - 原料、包材、人工、机器、制造费用 结果计算.
  LOOP AT lt_ckmlhd2 ASSIGNING <ls_ckmlhd2> .
    "初始库存数量
    READ TABLE lt_mseg2 INTO ls_mseg2 WITH KEY werks = <ls_ckmlhd2>-werks
                                               matnr = <ls_ckmlhd2>-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      READ TABLE lt_ckmlhd INTO ls_ckmlhd WITH KEY bwkey = <ls_ckmlhd2>-werks
                                                   matnr = <ls_ckmlhd2>-matnr
                                                   BINARY SEARCH .
      IF sy-subrc = 0 .
        <ls_ckmlhd2>-kst001 = ls_ckmlhd-kst001 * ls_mseg2-menge .
        <ls_ckmlhd2>-kst002 = ls_ckmlhd-kst002 * ls_mseg2-menge .
        <ls_ckmlhd2>-kst004 = ls_ckmlhd-kst004 * ls_mseg2-menge .
        <ls_ckmlhd2>-kst006 = ls_ckmlhd-kst006 * ls_mseg2-menge .
        <ls_ckmlhd2>-kst008 = ls_ckmlhd-kst008 * ls_mseg2-menge .
      ENDIF.
      CLEAR ls_ckmlhd .
    ENDIF.
    CLEAR ls_mseg2 .
  ENDLOOP.

  "本期消耗 - 原料、包材、人工、机器、制造费用 结果计算.
  LOOP AT lt_ckmlhd3 ASSIGNING <ls_ckmlhd3> .
    "初始库存数量
    READ TABLE lt_mseg3 INTO ls_mseg3 WITH KEY werks = <ls_ckmlhd3>-werks
                                               matnr = <ls_ckmlhd3>-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      READ TABLE lt_ckmlhd INTO ls_ckmlhd WITH KEY bwkey = <ls_ckmlhd3>-werks
                                                   matnr = <ls_ckmlhd3>-matnr
                                                   BINARY SEARCH .
      IF sy-subrc = 0 .
        <ls_ckmlhd3>-kst001 = ls_ckmlhd-kst001 * ls_mseg3-menge .
        <ls_ckmlhd3>-kst002 = ls_ckmlhd-kst002 * ls_mseg3-menge .
        <ls_ckmlhd3>-kst004 = ls_ckmlhd-kst004 * ls_mseg3-menge .
        <ls_ckmlhd3>-kst006 = ls_ckmlhd-kst006 * ls_mseg3-menge .
        <ls_ckmlhd3>-kst008 = ls_ckmlhd-kst008 * ls_mseg3-menge .
      ENDIF.
      CLEAR ls_ckmlhd .
    ENDIF.
    CLEAR ls_mseg3 .
  ENDLOOP.

  "期末库存 - 原料、包材、人工、机器、制造费用 结果计算.
  LOOP AT lt_ckmlhd4 ASSIGNING <ls_ckmlhd4> .
    "初始库存数量
    READ TABLE lt_mseg4 INTO ls_mseg4 WITH KEY werks = <ls_ckmlhd4>-werks
                                               matnr = <ls_ckmlhd4>-matnr
                                               BINARY SEARCH .
    IF sy-subrc = 0 .
      READ TABLE lt_ckmlhd INTO ls_ckmlhd WITH KEY bwkey = <ls_ckmlhd4>-werks
                                                   matnr = <ls_ckmlhd4>-matnr
                                                   BINARY SEARCH .
      IF sy-subrc = 0 .
        <ls_ckmlhd4>-kst001 = ls_ckmlhd-kst001 * ls_mseg4-menge .
        <ls_ckmlhd4>-kst002 = ls_ckmlhd-kst002 * ls_mseg4-menge .
        <ls_ckmlhd4>-kst004 = ls_ckmlhd-kst004 * ls_mseg4-menge .
        <ls_ckmlhd4>-kst006 = ls_ckmlhd-kst006 * ls_mseg4-menge .
        <ls_ckmlhd4>-kst008 = ls_ckmlhd-kst008 * ls_mseg4-menge .
      ENDIF.
      CLEAR ls_ckmlhd .
    ENDIF.
    CLEAR ls_mseg4 .
  ENDLOOP.

  SORT lt_ckmlhd1 BY werks matnr .
  SORT lt_ckmlhd2 BY werks matnr .
  SORT lt_ckmlhd3 BY werks matnr .
  SORT lt_ckmlhd4 BY werks matnr .

* 填充ALV
  LOOP AT lt_mseg_del INTO ls_mseg_del .

    l_num = l_num + 1 .
    gs_alv-num = l_num .
    gs_alv-gjahr = p_gjahr ."年度
    gs_alv-poper = p_poper ."期间
    gs_alv-werks = ls_mseg_del-werks ."工厂
    gs_alv-matnr = ls_mseg_del-matnr ."物料编号
    "物料描述
    READ TABLE lt_makt INTO ls_makt WITH KEY matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-maktx = ls_makt-maktx .
      CLEAR ls_makt .
    ENDIF.
    "停用标识
    READ TABLE lt_marc INTO ls_marc WITH KEY werks = ls_mseg_del-werks
                                             matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-mmsta = ls_marc-mmsta .
      CLEAR ls_marc.
    ENDIF.







    "初始库存数量
    READ TABLE lt_mseg1 INTO ls_mseg1 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-menge1 = ls_mseg1-menge .
      CLEAR ls_mseg1 .
    ENDIF.
    "初始库存:原料、包材、人工、机器、制造费用
    READ TABLE lt_ckmlhd1 INTO ls_ckmlhd1 WITH KEY werks = ls_mseg_del-werks
                                                   matnr = ls_mseg_del-matnr .
    IF sy-subrc = 0 .
      gs_alv-kst001_1 = ls_ckmlhd1-kst001 .
      gs_alv-kst002_1 = ls_ckmlhd1-kst002 .
      gs_alv-kst004_1 = ls_ckmlhd1-kst004 .
      gs_alv-kst006_1 = ls_ckmlhd1-kst006 .
      gs_alv-kst008_1 = ls_ckmlhd1-kst008 .
      CLEAR ls_ckmlhd1 .
    ENDIF.
    "初始库存:总实际值
    gs_alv-sum1 = gs_alv-kst001_1 + gs_alv-kst002_1 + gs_alv-kst004_1 + gs_alv-kst006_1 +
                  gs_alv-kst008_1 .





    "本期收据数量
    READ TABLE lt_mseg2 INTO ls_mseg2 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-menge2 = ls_mseg2-menge .
      CLEAR ls_mseg2 .
    ENDIF.
    "本期收据:原料、包材、人工、机器、制造费用
    READ TABLE lt_ckmlhd2 INTO ls_ckmlhd2 WITH KEY werks = ls_mseg_del-werks
                                                   matnr = ls_mseg_del-matnr .
    IF sy-subrc = 0 .
      gs_alv-kst001_2 = ls_ckmlhd2-kst001 .
      gs_alv-kst002_2 = ls_ckmlhd2-kst002 .
      gs_alv-kst004_2 = ls_ckmlhd2-kst004 .
      gs_alv-kst006_2 = ls_ckmlhd2-kst006 .
      gs_alv-kst008_2 = ls_ckmlhd2-kst008 .
      CLEAR ls_ckmlhd2 .
    ENDIF.
    "本期收据:总实际值
    gs_alv-sum2 = gs_alv-kst001_2 + gs_alv-kst002_2 + gs_alv-kst004_2 + gs_alv-kst006_2 +
                  gs_alv-kst008_2 .






    "本期消耗数量
    READ TABLE lt_mseg3 INTO ls_mseg3 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-menge3 = ls_mseg3-menge .
      CLEAR ls_mseg3 .
    ENDIF.
    "本期消耗:原料、包材、人工、机器、制造费用
    READ TABLE lt_ckmlhd3 INTO ls_ckmlhd3 WITH KEY werks = ls_mseg_del-werks
                                                   matnr = ls_mseg_del-matnr .
    IF sy-subrc = 0 .
      gs_alv-kst001_3 = ls_ckmlhd3-kst001 .
      gs_alv-kst002_3 = ls_ckmlhd3-kst002 .
      gs_alv-kst004_3 = ls_ckmlhd3-kst004 .
      gs_alv-kst006_3 = ls_ckmlhd3-kst006 .
      gs_alv-kst008_3 = ls_ckmlhd3-kst008 .
      CLEAR ls_ckmlhd3 .
    ENDIF.
    "本期消耗:总实际值
    gs_alv-sum3 = gs_alv-kst001_3 + gs_alv-kst002_3 + gs_alv-kst004_3 + gs_alv-kst006_3 +
                  gs_alv-kst008_3 .







    "期末库存数量
    READ TABLE lt_mseg4 INTO ls_mseg4 WITH KEY werks = ls_mseg_del-werks
                                               matnr = ls_mseg_del-matnr BINARY SEARCH .
    IF sy-subrc = 0 .
      gs_alv-menge4 = ls_mseg4-menge .
      CLEAR ls_mseg4 .
    ENDIF.
    "期末库存:原料、包材、人工、机器、制造费用
    READ TABLE lt_ckmlhd4 INTO ls_ckmlhd4 WITH KEY werks = ls_mseg_del-werks
                                                   matnr = ls_mseg_del-matnr .
    IF sy-subrc = 0 .
      gs_alv-kst001_4 = ls_ckmlhd4-kst001 .
      gs_alv-kst002_4 = ls_ckmlhd4-kst002 .
      gs_alv-kst004_4 = ls_ckmlhd4-kst004 .
      gs_alv-kst006_4 = ls_ckmlhd4-kst006 .
      gs_alv-kst008_4 = ls_ckmlhd4-kst008 .
      CLEAR ls_ckmlhd4 .
    ENDIF.
    "期末库存:总实际值
    gs_alv-sum4 = gs_alv-kst001_4 + gs_alv-kst002_4 + gs_alv-kst004_4 + gs_alv-kst006_4 +
                  gs_alv-kst008_4 .



    "未分摊
    gs_alv-sum_not = gs_alv-sum1 + gs_alv-sum2 - gs_alv-sum3 - gs_alv-sum4."总实际值

    gs_alv-kst001_not = gs_alv-kst001_1 + gs_alv-kst001_2 -
                        gs_alv-kst001_3 - gs_alv-kst001_4."原料

    gs_alv-kst002_not = gs_alv-kst002_1 + gs_alv-kst002_2 -
                        gs_alv-kst002_3 - gs_alv-kst002_4."包材

    gs_alv-kst004_not = gs_alv-kst004_1 + gs_alv-kst004_2 -
                        gs_alv-kst004_3 - gs_alv-kst004_4."人工

    gs_alv-kst006_not = gs_alv-kst006_1 + gs_alv-kst006_2 -
                        gs_alv-kst006_3 - gs_alv-kst006_4."机器

    gs_alv-kst008_not = gs_alv-kst008_1 + gs_alv-kst008_2 -
                        gs_alv-kst008_3 - gs_alv-kst008_4."制造费用

    APPEND gs_alv TO gt_alv .
    CLEAR gs_alv .
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_LAYOUT_BUILD
*&---------------------------------------------------------------------*
*       "  设置表格样式
*----------------------------------------------------------------------*
FORM frm_layout_build .
  gs_layout-box_fieldname        = 'SEL'.  " 选择模式,在最左端有选择按钮
  gs_layout-colwidth_optimize    = 'X'.    " 自动调整列宽
  gs_layout-zebra                = 'X'.    " 表格斑马线
ENDFORM.                    "frm_layout_build
*&---------------------------------------------------------------------*
*&      Form  FRM_FIELD_BUILD
*&---------------------------------------------------------------------*
*       "  建立表头数据
*----------------------------------------------------------------------*
FORM frm_field_build .
  PERFORM field_set USING 'NUM'  '序号' '序号' '15' '' '' .
  PERFORM field_set USING 'GJAHR'  '年度' '年度' '15' '' '' .
  PERFORM field_set USING 'POPER'  '期间' '期间' '15' '' '' .
  PERFORM field_set USING 'WERKS'  '工厂' '工厂' '15' '' '' .
  PERFORM field_set USING 'MATNR'  '物料编号' '物料编号' '255' '' '' .
  PERFORM field_set USING 'MAKTX'  '物料描述' '物料描述' '255' '' '' .
  PERFORM field_set USING 'MMSTA'  '停用标识' '停用标识' '255' '' '' .

  PERFORM field_set USING 'SUM1'  '初始库存-总实际值' '初始库存-总实际值' '255' '' '' .
  PERFORM field_set USING 'MENGE1'  '初始库存-数量' '初始库存-数量' '255' '' '' .
  PERFORM field_set USING 'KST001_1'  '初始库存-原料' '初始库存-原料' '255' '' '' .
  PERFORM field_set USING 'KST002_1'  '初始库存-包材' '初始库存-包材' '255' '' '' .
  PERFORM field_set USING 'KST004_1'  '初始库存-人工' '初始库存-人工' '255' '' '' .
  PERFORM field_set USING 'KST006_1'  '初始库存-机器' '初始库存-机器' '255' '' '' .
  PERFORM field_set USING 'KST008_1'  '初始库存-制造费用' '初始库存-制造费用' '255' '' '' .

  PERFORM field_set USING 'SUM2'  '本期收据-总实际值' '本期收据-总实际值' '255' '' '' .
  PERFORM field_set USING 'MENGE2'  '本期收据-数量' '本期收据-数量' '255' '' '' .
  PERFORM field_set USING 'KST001_2'  '本期收据-原料' '本期收据-原料' '255' '' '' .
  PERFORM field_set USING 'KST002_2'  '本期收据-包材' '本期收据-包材' '255' '' '' .
  PERFORM field_set USING 'KST004_2'  '本期收据-人工' '本期收据-人工' '255' '' '' .
  PERFORM field_set USING 'KST006_2'  '本期收据-机器' '本期收据-机器' '255' '' '' .
  PERFORM field_set USING 'KST008_2'  '本期收据-制造费用' '本期收据-制造费用' '255' '' '' .

  PERFORM field_set USING 'SUM3'  '本期消耗-总实际值' '本期消耗-总实际值' '255' '' '' .
  PERFORM field_set USING 'MENGE3'  '本期消耗-数量' '本期消耗-数量' '255' '' '' .
  PERFORM field_set USING 'KST001_3'  '本期消耗-原料' '本期消耗-原料' '255' '' '' .
  PERFORM field_set USING 'KST002_3'  '本期消耗-包材' '本期消耗-包材' '255' '' '' .
  PERFORM field_set USING 'KST004_3'  '本期消耗-人工' '本期消耗-人工' '255' '' '' .
  PERFORM field_set USING 'KST006_3'  '本期消耗-机器' '本期消耗-机器' '255' '' '' .
  PERFORM field_set USING 'KST008_3'  '本期消耗-制造费用' '本期消耗-制造费用' '255' '' '' .

  PERFORM field_set USING 'SUM4'  '期末库存-总实际值' '期末库存-总实际值' '255' '' '' .
  PERFORM field_set USING 'MENGE4'  '期末库存-数量' '期末库存-数量' '255' '' '' .
  PERFORM field_set USING 'KST001_4'  '期末库存-原料' '期末库存-原料' '255' '' '' .
  PERFORM field_set USING 'KST002_4'  '期末库存-包材' '期末库存-包材' '255' '' '' .
  PERFORM field_set USING 'KST004_4'  '期末库存-人工' '期末库存-人工' '255' '' '' .
  PERFORM field_set USING 'KST006_4'  '期末库存-机器' '期末库存-机器' '255' '' '' .
  PERFORM field_set USING 'KST008_4'  '期末库存-制造费用' '期末库存-制造费用' '255' '' '' .

  PERFORM field_set USING 'SUM_NOT'  '未分摊-总实际值' '未分摊-总实际值' '255' '' '' .
  PERFORM field_set USING 'KST001_NOT'  '未分摊-原料' '未分摊-原料' '255' '' '' .
  PERFORM field_set USING 'KST002_NOT'  '未分摊-包材' '未分摊-包材' '255' '' '' .
  PERFORM field_set USING 'KST004_NOT'  '未分摊-人工' '未分摊-人工' '255' '' '' .
  PERFORM field_set USING 'KST006_NOT'  '未分摊-机器' '未分摊-机器' '255' '' '' .
  PERFORM field_set USING 'KST008_NOT'  '未分摊-制造费用' '未分摊-制造费用' '255' '' '' .
ENDFORM.                    "FRM_FIELD_BUILD
*&---------------------------------------------------------------------*
*&      Form  FRM_DATA_OUT
*&---------------------------------------------------------------------*
*       输出数据
*----------------------------------------------------------------------*
FORM frm_data_out .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
*     i_callback_pf_status_set = c_cns_pf_status
*     i_callback_user_command  = c_cns_user_command
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat
      i_save             = 'X'
*     i_grid_settings    = ls_gset
    TABLES
      t_outtab           = gt_alv
    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.                    "frm_data_out
*&---------------------------------------------------------------------*
*&      Form  FIELD_SET
*&---------------------------------------------------------------------*
FORM field_set USING p_fieldname
                     p_seltext_l
                     p_seltext_s
                     p_outputlen
                     p_ref_fieldname
                     p_ref_tabname
                         .

  gs_fieldcat-fieldname     = p_fieldname .
  gs_fieldcat-seltext_l     = p_seltext_l .
  gs_fieldcat-seltext_s     = p_seltext_s .
  gs_fieldcat-outputlen     = p_outputlen .
  gs_fieldcat-ref_fieldname = p_ref_fieldname.
  gs_fieldcat-ref_tabname   = p_ref_tabname.
  APPEND gs_fieldcat TO gt_fieldcat.
  CLEAR gs_fieldcat.
ENDFORM.                    "field_set

 

^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^
posted on 2017-03-07 09:16  ^ω^SAP傻X^o^  阅读(1237)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3