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.