SAP-月度材料消耗表

  1. 程序说明

2.1程序说明

选择汇总时,输出报表如下:

选择明细时,输出报表如下:

程序实现

2.2.1         "选择汇总信息输出

      WHEN P_RD1.
        PERFORM FRM_GET_DATA.
        PERFORM FRM_PROCESS_DATA.
        PERFORM FRM_ALV_DIS.
 
2.2.2"获取物料凭证抬头信息

  SELECT MBLNR MJAHR BUDAT INTO CORRESPONDING FIELDS OF TABLE GT_MKPF
    FROM MKPF
  WHERE BUDAT IN S_BUDAT.

  DESCRIBE TABLE GT_MKPF LINES G_LINX.
  IF G_LINX <> 0.
    SORT GT_MKPF BY MBLNR MJAHR.
   
2.2.3 "根据物料抬头数据获取物料凭证明细数据

    SELECT MBLNR MJAHR ZEILE BWART MATNR WERKS LGORT CHARG MENGE MEINS AUFNR
      INTO CORRESPONDING FIELDS OF TABLE GT_MSEG
      FROM MSEG
      FOR ALL ENTRIES IN GT_MKPF
      WHERE MBLNR = GT_MKPF-MBLNR
      AND MJAHR = GT_MKPF-MJAHR
      AND BWART IN ('261','262','Z61','Z62')
      AND WERKS = P_WERKS
    AND MATNR IN S_MATNR.

    DESCRIBE TABLE GT_MSEG LINES G_LINX.
    IF G_LINX <> 0.
      SORT GT_MSEG BY AUFNR.
  
2.2.4    "获取生产订单数据

      SELECT AK~AUFNR AP~MATNR AP~PSAMG AP~PSMNG AP~WEMNG
        AK~STLTY AK~STLNR AK~STLAL AK~SDATV
        INTO CORRESPONDING FIELDS OF TABLE GT_AFPO
        FROM AFKO AS AK INNER JOIN AFPO AS AP
        ON AK~AUFNR = AP~AUFNR
        FOR ALL ENTRIES IN GT_MSEG
      WHERE AK~AUFNR = GT_MSEG-AUFNR.

      DESCRIBE TABLE GT_AFPO LINES G_LINX.
      IF G_LINX <> 0.
        SORT GT_AFPO BY STLTY STLNR.
       
2.2.5 "获取BOM数据

        SELECT SK~STLTY SK~STLNR SK~BMENG
          SP~DATUV SP~IDNRK SP~MEINS SP~MENGE
          INTO CORRESPONDING FIELDS OF TABLE GT_STPO
          FROM STKO AS SK INNER JOIN STPO AS SP
          ON SK~STLTY = SP~STLTY AND SK~STLNR = SP~STLNR
          FOR ALL ENTRIES IN GT_AFPO
          WHERE SK~STLTY = GT_AFPO-STLTY
        AND SK~STLNR = GT_AFPO-STLNR.

        SORT GT_STPO BY STLTY STLNR IDNRK.
      ENDIF.

      SORT GT_MSEG BY MATNR.
      
2.2.6"获取物料描述数据

      SELECT MT~MATNR MT~MAKTX INTO CORRESPONDING FIELDS OF TABLE GT_MAKT
        FROM MAKT AS MT INNER JOIN MARA AS MA
        ON MT~MATNR = MA~MATNR
        FOR ALL ENTRIES IN GT_MSEG
        WHERE MT~MATNR = GT_MSEG-MATNR
        AND MT~SPRAS = SY-LANGU
      AND MA~MATKL IN S_MATKL.
    ENDIF.
  ENDIF.

2.2.7"整理数据用以输出

  LOOP AT GT_MSEG.
    CASE GT_MSEG-BWART.
      WHEN '262' OR 'Z62'.
        GT_MSEG-MENGE = GT_MSEG-MENGE * -1.
    ENDCASE.
    GT_ITAB-WERKS = GT_MSEG-WERKS.
    GT_ITAB-MATNR = GT_MSEG-MATNR.
    GT_ITAB-MENGE = GT_MSEG-MENGE.
    GT_ITAB-MEINS = GT_MSEG-MEINS.
    GT_ITAB-AUFNR = GT_MSEG-AUFNR.

    COLLECT GT_ITAB.
    CLEAR:GT_MSEG,GT_ITAB.
  ENDLOOP.

  SORT GT_AFPO BY AUFNR.
  SORT GT_MAKT BY MATNR.

  LOOP AT GT_ITAB.
    CLEAR:GT_AFPO.
    READ TABLE GT_AFPO WITH KEY AUFNR = GT_ITAB-AUFNR BINARY SEARCH.

    CLEAR:GT_STPO.
    READ TABLE GT_STPO WITH KEY STLTY = GT_AFPO-STLTY STLNR = GT_AFPO-STLNR IDNRK = GT_ITAB-MATNR BINARY SEARCH.
    IF GT_STPO-BMENG <> 0.
      GT_ITAB-WEMNG = ( GT_AFPO-PSAMG + GT_AFPO-WEMNG ) * GT_STPO-MENGE / GT_STPO-BMENG.
    ENDIF.

    GT_ITAB-MENGE_CY = GT_ITAB-MENGE - GT_ITAB-WEMNG.

    MOVE-CORRESPONDING GT_ITAB TO GT_SUMOT.
    CLEAR:GT_SUMOT-AUFNR.
    CLEAR:GT_MAKT.
    READ TABLE GT_MAKT WITH KEY MATNR = GT_ITAB-MATNR BINARY SEARCH.
    IF SY-SUBRC = 0.
      GT_SUMOT-MAKTX = GT_MAKT-MAKTX.

      COLLECT GT_SUMOT.
    ENDIF.

    CLEAR:GT_SUMOT,GT_ITAB.
  ENDLOOP.


2.2.8* ALV输出字段准备

  PERFORM FRM_BUILDCAT.
ORM FRM_BUILDCAT .
  FREE GT_FIELDCAT.

  M_ALV_FIELDCAT 'WERKS'             '工厂'                      ''  ' '.
  M_ALV_FIELDCAT 'MATNR'             '子物料编号'                      ''  ' '.
  M_ALV_FIELDCAT 'MAKTX'             '子物料描述'                      ''  ' '.
  M_ALV_FIELDCAT 'WEMNG'             '标准用量'                      ''  ' '.
  M_ALV_FIELDCAT 'MEINS'             '单位'                      ''  ' '.
  M_ALV_FIELDCAT 'MENGE'             '实际领用数量'                      ''  ' '.
  M_ALV_FIELDCAT 'MENGE_CY'             '差异'                      ''  ' '.

* ALV输出布局
  PERFORM FRM_BUILD_LAYOUT.


2.2.9* ALV输出

  PERFORM FRM_DISPLAY_BY_LIST.
FORM FRM_DISPLAY_BY_LIST .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = G_REPID
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      IT_SORT_LVC              = IT_SORT
      IS_VARIANT               = GS_VARIANT
      "I_HTML_HEIGHT_TOP  = 60
      I_SAVE                   = 'U'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'FRM_SET_PF_STATUS'
      IT_EVENTS                = GT_EVENTS[]
    TABLES
      T_OUTTAB                 = GT_SUMOT[].
ENDFORM. " FRM_DISPLAY_BY_LIST

     
2.2.10   "选择明细数据输出

      WHEN OTHERS.
        PERFORM FRM_GET_DATADEL.
        PERFORM FRM_PROCESS_DATADEL.
        PERFORM FRM_ALV_DISDEL.

  REFRESH:GT_DETEL.

2.2.11"获取物料凭证抬头数据

  SELECT MBLNR MJAHR BUDAT INTO CORRESPONDING FIELDS OF TABLE GT_MKPF
    FROM MKPF
  WHERE BUDAT IN S_BUDAT.

  DESCRIBE TABLE GT_MKPF LINES G_LINX.
  IF G_LINX <> 0.
    SORT GT_MKPF BY MBLNR MJAHR.

2.2.12"获取物料凭证明细数据

    SELECT MBLNR MJAHR ZEILE BWART MATNR WERKS LGORT CHARG MENGE MEINS AUFNR
      INTO CORRESPONDING FIELDS OF TABLE GT_MSEG
      FROM MSEG
      FOR ALL ENTRIES IN GT_MKPF
      WHERE MBLNR = GT_MKPF-MBLNR
      AND MJAHR = GT_MKPF-MJAHR
      AND BWART IN ('261','262','Z61','Z62')
      AND WERKS = P_WERKS
    AND MATNR IN S_MATNR.

    DESCRIBE TABLE GT_MSEG LINES G_LINX.
    IF G_LINX <> 0.
      SORT GT_MSEG BY AUFNR.

2.2.13"获取生产订单数据

      SELECT AK~AUFNR AP~MATNR AP~PSAMG AP~PSMNG AP~WEMNG
        AK~STLTY AK~STLNR AK~STLAL AK~SDATV
        INTO CORRESPONDING FIELDS OF TABLE GT_AFPO
        FROM AFKO AS AK INNER JOIN AFPO AS AP
        ON AK~AUFNR = AP~AUFNR
        FOR ALL ENTRIES IN GT_MSEG
      WHERE AK~AUFNR = GT_MSEG-AUFNR.

      DESCRIBE TABLE GT_AFPO LINES G_LINX.
      IF G_LINX <> 0.
        SORT GT_AFPO BY STLTY STLNR.

2.2.14"获取BOM数据

        SELECT SK~STLTY SK~STLNR SK~BMENG
          SP~DATUV SP~IDNRK SP~MEINS SP~MENGE
          INTO CORRESPONDING FIELDS OF TABLE GT_STPO
          FROM STKO AS SK INNER JOIN STPO AS SP
          ON SK~STLTY = SP~STLTY AND SK~STLNR = SP~STLNR
          FOR ALL ENTRIES IN GT_AFPO
          WHERE SK~STLTY = GT_AFPO-STLTY
        AND SK~STLNR = GT_AFPO-STLNR.

        SORT GT_STPO BY STLTY STLNR IDNRK.
      ENDIF.

      SORT GT_MSEG BY MATNR.

2.2.15"获取物料描述数据

      SELECT MT~MATNR MT~MAKTX INTO CORRESPONDING FIELDS OF TABLE GT_MAKT
        FROM MAKT AS MT INNER JOIN MARA AS MA
        ON MT~MATNR = MA~MATNR
        FOR ALL ENTRIES IN GT_MSEG
        WHERE MT~MATNR = GT_MSEG-MATNR
        AND MT~SPRAS = SY-LANGU
      AND MA~MATKL IN S_MATKL.

      SORT GT_MSEG BY MBLNR MJAHR ZEILE.

2.2.16"获取领料单明细

      SELECT ZK~WERKS ZK~DEPMT ZP~ZISNO ZP~ZISNI ZP~MENGE ZP~SMENG ZP~MEINS ZP~MJAHR ZP~MBLNR ZP~ZIELE
        INTO CORRESPONDING FIELDS OF TABLE GT_ZTINP
        FROM ZTINK AS ZK INNER JOIN ZTINP AS ZP
        ON ZK~ZISNO = ZP~ZISNO
        FOR ALL ENTRIES IN GT_MSEG
        WHERE ZP~MBLNR = GT_MSEG-MBLNR
        AND ZP~MJAHR = GT_MSEG-MJAHR
        AND ZP~ZIELE = GT_MSEG-ZEILE
      AND ZK~DEPMT IN S_DEPMT.

2.2.17"获取生产退料数据

      SELECT ZK~WERKS ZK~DEPMT ZP~ZTLNO ZP~ZTLNI ZP~MENGE ZP~SMENG ZP~MEINS ZP~MJAHR ZP~MBLNR ZP~ZIELE
        INTO CORRESPONDING FIELDS OF TABLE GT_ZTTLP
        FROM ZTTLK AS ZK INNER JOIN ZTTLP AS ZP
        ON ZK~ZTLNO = ZP~ZTLNO
        FOR ALL ENTRIES IN GT_MSEG
        WHERE ZP~MBLNR = GT_MSEG-MBLNR
        AND ZP~MJAHR = GT_MSEG-MJAHR
        AND ZP~ZIELE = GT_MSEG-ZEILE
      AND ZK~DEPMT IN S_DEPMT.


      SORT GT_AFPO BY MATNR.

      SELECT MT~MATNR MT~MAKTX INTO CORRESPONDING FIELDS OF TABLE GT_MAKT_H
        FROM MAKT AS MT
        FOR ALL ENTRIES IN GT_AFPO
        WHERE MT~MATNR = GT_AFPO-MATNR
      AND MT~SPRAS = SY-LANGU.


    ENDIF.
  ENDIF.
  SORT GT_MSEG BY WERKS MATNR.

  SORT GT_ZTINP BY MJAHR MBLNR ZIELE.
  SORT GT_ZTTLP BY MJAHR MBLNR ZIELE.

2.2.18"对材料损耗明细数据进行处理

  LOOP AT GT_MSEG.
    CASE GT_MSEG-BWART.
      WHEN '262' OR 'Z62'.
        GT_MSEG-MENGE = GT_MSEG-MENGE * -1.
    ENDCASE.
    GT_DETEL-WERKS = GT_MSEG-WERKS.
    GT_DETEL-MATNR = GT_MSEG-MATNR.
    GT_DETEL-MENGE = GT_MSEG-MENGE.
    GT_DETEL-MEINS = GT_MSEG-MEINS.
    GT_DETEL-AUFNR = GT_MSEG-AUFNR.

    CLEAR:GT_ZTINP.
    READ TABLE GT_ZTINP WITH KEY MJAHR = GT_MSEG-MJAHR MBLNR = GT_MSEG-MBLNR ZIELE = GT_MSEG-ZEILE BINARY SEARCH.
    IF SY-SUBRC = 0.
      GT_DETEL-DEPMT = GT_ZTINP-DEPMT.
    ELSE.

      CLEAR:GT_ZTTLP.
      READ TABLE GT_ZTTLP WITH KEY MJAHR = GT_MSEG-MJAHR MBLNR = GT_MSEG-MBLNR ZIELE = GT_MSEG-ZEILE BINARY SEARCH.
      GT_DETEL-DEPMT = GT_ZTINP-DEPMT.
    ENDIF.

    COLLECT GT_DETEL.

*    IF GT_DETEL-DEPMT IS NOT INITIAL.
*      COLLECT GT_DETEL.
*    ENDIF.

    CLEAR:GT_MSEG,GT_DETEL.
  ENDLOOP.

  SORT GT_AFPO BY AUFNR.
  SORT GT_MAKT BY MATNR.
  SORT GT_STPO BY STLTY STLNR IDNRK.
  SORT GT_MAKT_H BY MATNR.

  LOOP AT GT_DETEL.
    CLEAR:GT_AFPO.
    READ TABLE GT_AFPO WITH KEY AUFNR = GT_DETEL-AUFNR BINARY SEARCH.

    CLEAR:GT_STPO.
    READ TABLE GT_STPO WITH KEY STLTY = GT_AFPO-STLTY STLNR = GT_AFPO-STLNR IDNRK = GT_ITAB-MATNR BINARY SEARCH.
    IF GT_STPO-BMENG <> 0.
      GT_DETEL-WEMNG = ( GT_AFPO-PSAMG + GT_AFPO-WEMNG ) * GT_STPO-MENGE / GT_STPO-BMENG.
    ENDIF.

    GT_DETEL-MENGE_CY = GT_DETEL-MENGE - GT_DETEL-WEMNG.

    GT_DETEL-MATNR_H = GT_AFPO-MATNR.
    GT_DETEL-PSMNG = GT_AFPO-PSMNG.
    GT_DETEL-PSAMG = GT_AFPO-PSAMG + GT_AFPO-WEMNG.

    CLEAR:GT_MAKT.
    READ TABLE GT_MAKT WITH KEY MATNR = GT_DETEL-MATNR BINARY SEARCH.
    IF SY-SUBRC = 0.
      GT_DETEL-MAKTX = GT_MAKT-MAKTX.

      CLEAR:GT_MAKT_H.
      READ TABLE GT_MAKT_H WITH KEY MATNR = GT_DETEL-MATNR_H BINARY SEARCH.
      GT_DETEL-MAKTX_H = GT_MAKT_H-MAKTX.

      MODIFY GT_DETEL.
    ELSE.
      DELETE GT_DETEL.  "物料组选择
    ENDIF.

    CLEAR:GT_DETEL.
  ENDLOOP.


2.2.19" 输出明细数据

* ALV输出字段准备
  PERFORM FRM_BUILDCATDEL.

* ALV输出布局
  PERFORM FRM_BUILD_LAYOUTDEL.

* ALV输出
  PERFORM FRM_DISPLAY_BY_LISTDEL.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_BUILDCATDEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BUILDCATDEL .
  FREE GT_FIELDCAT.

  M_ALV_FIELDCAT 'WERKS'             '工厂'                      ''  ' '.
  M_ALV_FIELDCAT 'MATNR_H'             '母项物料编号'                      ''  ' '.
  M_ALV_FIELDCAT 'MAKTX_H'             '母项物料描述'                      ''  ' '.
  M_ALV_FIELDCAT 'DEPMT'             '车间'                      ''  ' '.
  M_ALV_FIELDCAT 'AUFNR'             '生产订单'                      ''  ' '.
  M_ALV_FIELDCAT 'PSMNG'             '计划数量'                      ''  ' '.
  M_ALV_FIELDCAT 'PSAMG'             '入库数量'                      ''  ' '.

  M_ALV_FIELDCAT 'MATNR'             '子物料编号'                      ''  ' '.
  M_ALV_FIELDCAT 'MAKTX'             '子物料描述'                      ''  ' '.
  M_ALV_FIELDCAT 'WEMNG'             '标准用量'                      ''  ' '.
  M_ALV_FIELDCAT 'MEINS'             '单位'                      ''  ' '.
  M_ALV_FIELDCAT 'MENGE'             '实际领用数量'                      ''  ' '.
  M_ALV_FIELDCAT 'MENGE_CY'             '差异'                      ''  ' '.


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_BUILD_LAYOUTDEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_BUILD_LAYOUTDEL .
  CLEAR: GS_LAYOUT.

  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_VARIANT-REPORT = SY-REPID.
  G_REPID = SY-REPID.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISPLAY_BY_LISTDEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_BY_LISTDEL .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = G_REPID
      IS_LAYOUT_LVC            = GS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT
      IT_SORT_LVC              = IT_SORT
      IS_VARIANT               = GS_VARIANT
      "I_HTML_HEIGHT_TOP  = 60
      I_SAVE                   = 'U'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMANDDEL'
      I_CALLBACK_PF_STATUS_SET = 'FRM_SET_PF_STATUSDEL'
      IT_EVENTS                = GT_EVENTS[]
    TABLES
      T_OUTTAB                 = GT_DETEL[].
ENDFORM.

 

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值