*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2019-06-26
*& Program Type : Report
*& Description : 物料报废成本报表
*&---------------------------------------------------------------------*
REPORT ZMMR115 DEFINING DATABASE IOC.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:AFPO,MARA,EKET,AFKO.
TYPE-POOLS:SLIS,T001W.
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
TYPES: BEGIN OF GTS_DATA,
ZITEM TYPE CHAR12, "项 目
PWERK TYPE AFPO-PWERK, "工厂
AUFNR TYPE AFPO-AUFNR, "工单号
MATNR TYPE AFPO-MATNR, "成品项目号
MEINS TYPE AFPO-MEINS, "单位
MEINS_SUB TYPE RESB-MEINS, "子件单位
PSMNG TYPE AFPO-PSMNG, "工单数量
PRDHA TYPE MARA-PRDHA, "系列
MAKTX TYPE MAKT-MAKTX, "项目号说明
MATNR_SUB TYPE RESB-MATNR, "子件项目号
MAKTX_SUB TYPE MAKT-MAKTX, "子件项目号说明
GMNGA TYPE AFRU-GMNGA, "完工数量
STPRS TYPE MBEW-STPRS, "取标准价格
VERPR TYPE MBEW-VERPR, "取移动平均价格
ZCBFL TYPE MBEW-STPRS, "正常报废率
YCBFL TYPE MBEW-STPRS, "异常报废率
SZJBF TYPE MSEG-MENGE, "实际子件报废率
SZJBS TYPE MSEG-MENGE, "实际子件报废数量
ZCBFS TYPE MSEG-MENGE, "正常报废数
YCBFS TYPE MSEG-MENGE, "异常报废数
BFJEJ TYPE MBEW-STPRS, "报废金额小计
ZCBFJ TYPE MBEW-STPRS, "正常报废金额
YCBFJ TYPE MBEW-STPRS, "异常报废金额
PEINH TYPE MBEW-PEINH, "价格单位
VPRSV TYPE MBEW-VPRSV, "价格控制指示符
ZGDCZ TYPE MBEW-STPRS, "产值
AUSCH TYPE RESB-AUSCH, "BOM中的损耗率
BDMNG TYPE RESB-BDMNG, "需求量
BOMYL TYPE RESB-BDMNG, "工单BOM用量
BOMBZ TYPE RESB-BDMNG, "BOM的标准用量
MENGE TYPE MSEG-MENGE, "计划外发料数量
MENGT TYPE MSEG-MENGE, "退料数量
ZSFSL TYPE MSEG-MENGE, "实发数量
ZFFCY TYPE MSEG-MENGE, "发放差异
ZCYBL TYPE MSEG-MENGE, "差异比例
RGEKZ TYPE RESB-RGEKZ, "反冲
AUART TYPE AUFK-AUART, "工单类型
ZADD1 TYPE CHAR10, "原因分析
ZADD2 TYPE CHAR10, "改善措施
ZADD3 TYPE CHAR10, "CAR编号
ZADD4 TYPE CHAR10, "责任人
ZADD5 TYPE CHAR10, "担当人
FLAG TYPE C, "标记
CLR TYPE CHAR4, "可以控制行颜色
END OF GTS_DATA.
DATA: BEGIN OF STATUS_TMP OCCURS 0,
STAT LIKE JEST-STAT,
EXCL LIKE RC27X-FLG_SEL,
END OF STATUS_TMP.
DATA: STATUS_HDR_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE,
STATUS_OPR_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE,
STATUS_CMP_TAB LIKE STATUS_TMP OCCURS 0 WITH HEADER LINE.
TYPES:
BEGIN OF TYP_S_AUFNR,
AUFNR TYPE AUFNR,
END OF TYP_S_AUFNR,
TYP_TS_AUFNR TYPE SORTED TABLE OF TYP_S_AUFNR
WITH NON-UNIQUE KEY AUFNR,
BEGIN OF TYP_S_OBJNR,
AUFNR TYPE AUFNR,
AUFPL TYPE CO_AUFPL,
APLFL TYPE PLNFOLGE,
PLNFL TYPE PLNFOLGE,
OBJNR TYPE J_OBJNR,
END OF TYP_S_OBJNR,
TYP_TS_AUFNR_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
WITH NON-UNIQUE KEY AUFNR OBJNR,
TYP_TS_AUFPL_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR
WITH NON-UNIQUE KEY AUFPL OBJNR,
TYP_TS_OBJNR TYPE SORTED TABLE OF TYP_S_OBJNR,
BEGIN OF TYP_S_VBELN,
VBELN TYPE VBELN,
END OF TYP_S_VBELN,
TYP_TS_VBELN TYPE SORTED TABLE OF TYP_S_VBELN
WITH NON-UNIQUE KEY VBELN.
DATA: YX VALUE 'X'.
DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_HEAD TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_ITEM TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_AFRU TYPE TABLE OF AFRU WITH HEADER LINE.
DATA: GT_MSEG TYPE TABLE OF MSEG WITH HEADER LINE.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS: P_PWERK TYPE AFPO-PWERK MODIF ID C1 OBLIGATORY. "工厂
SELECT-OPTIONS: S_AUFNR FOR AFPO-AUFNR MODIF ID C1 . "工单号
SELECT-OPTIONS: S_MATNR FOR AFPO-MATNR MODIF ID C1 . "产品号码
SELECT-OPTIONS: S_PRDHA FOR MARA-PRDHA MODIF ID C1 . "系列
SELECT-OPTIONS: S_DISPO FOR AFKO-DISPO MODIF ID C1 . "MRP控制员
SELECT-OPTIONS: S_GLTRP FOR AFKO-GLTRP MODIF ID C1 . "工单开始日期
SELECT-OPTIONS: S_GSTRP FOR AFKO-GSTRP MODIF ID C1 . "结束日期
SELECT-OPTIONS: S_FEVOR FOR AFKO-FEVOR MODIF ID C1 . "生产管理员
SELECT-OPTIONS: S_LTRMI FOR AFPO-LTRMI MODIF ID C1 . "工单实际完成日期
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN:
COMMENT 1(20) TEXT-SYS FOR FIELD P_SYST1 MODIF ID C1,
POSITION 33.
PARAMETERS:
P_SYST1 LIKE TJ02T-TXT04 MODIF ID C1,
P_SYSH1 LIKE JEST-STAT NO-DISPLAY.
SELECTION-SCREEN
POSITION 46.
PARAMETERS:
P_EXCL1 LIKE RCOSA-EXCL1 MODIF ID C1.
SELECTION-SCREEN:
COMMENT 40(5) TEXT-EXC FOR FIELD P_EXCL1 MODIF ID C1,
COMMENT 52(3) TEXT-AND FOR FIELD P_SYST2 MODIF ID C1,
POSITION 58.
PARAMETERS:
P_SYST2 LIKE TJ02T-TXT04 MODIF ID C1,
P_SYSH2 LIKE JEST-STAT NO-DISPLAY.
SELECTION-SCREEN
POSITION 71.
PARAMETERS:
P_EXCL2 LIKE RCOSA-EXCL1 MODIF ID C1.
SELECTION-SCREEN:
COMMENT 65(5) TEXT-EXC FOR FIELD P_EXCL2 MODIF ID C1.
SELECTION-SCREEN END OF LINE.
PARAMETERS:
P_SELID LIKE TJ48T-SELID NO-DISPLAY.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME.
PARAMETERS: P_1 RADIOBUTTON GROUP GP1,
P_2 RADIOBUTTON GROUP GP1.
SELECTION-SCREEN END OF BLOCK B2.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA:LTS_OBJNR TYPE TYP_TS_AUFNR_OBJNR.
* APPEND STATUS TO IMPORTED TABLE FOR HEADER SELECTION
PERFORM FILL_STATUS_TABLE
TABLES STATUS_HDR_TAB
USING P_SYST1
P_SYSH1
P_EXCL1
P_SYST2
P_SYSH2
P_EXCL2.
IF STATUS_HDR_TAB[] IS NOT INITIAL.
CLEAR LTS_OBJNR[] .
SELECT AUFNR OBJNR FROM AUFK
INTO CORRESPONDING FIELDS OF TABLE LTS_OBJNR[]
WHERE WERKS = P_PWERK
AND AUFNR IN S_AUFNR
.
PERFORM REDUCE_AUFNR_OBJNR_BY_STATUS
TABLES STATUS_HDR_TAB
USING P_SELID
CHANGING LTS_OBJNR[].
ENDIF.
IF LTS_OBJNR[] IS NOT INITIAL.
IF P_1 IS NOT INITIAL.
CLEAR GT_DATA_HEAD[].
SELECT
AFPO~PWERK
AFPO~AUFNR
AFPO~MATNR
AFPO~MEINS
AFPO~PSMNG
AUFK~AUART
MARA~PRDHA
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_HEAD[]
FROM AFPO
INNER JOIN AFKO ON AFPO~AUFNR = AFKO~AUFNR
INNER JOIN MARA ON AFPO~MATNR = MARA~MATNR
INNER JOIN AUFK ON AFPO~AUFNR = AUFK~AUFNR
FOR ALL ENTRIES IN LTS_OBJNR[]
WHERE AFPO~AUFNR = LTS_OBJNR-AUFNR
AND AFPO~PWERK = P_PWERK
AND AFPO~AUFNR IN S_AUFNR
AND AFPO~MATNR IN S_MATNR
AND AFPO~LTRMI IN S_LTRMI
AND AFKO~DISPO IN S_DISPO
AND AFKO~GLTRP IN S_GLTRP
AND AFKO~GSTRP IN S_GSTRP
AND AFKO~FEVOR IN S_FEVOR
AND MARA~PRDHA IN S_PRDHA
.
LOOP AT GT_DATA_HEAD.
SELECT SINGLE MAKTX INTO GT_DATA_HEAD-MAKTX FROM MAKT
WHERE MATNR = GT_DATA_HEAD-MATNR
.
CLEAR GT_AFRU[] .
SELECT GMNGA INTO CORRESPONDING FIELDS OF TABLE GT_AFRU[] FROM AFRU
WHERE AUFNR = GT_DATA_HEAD-AUFNR
AND STOKZ = ''
AND STZHL = ''
.
CLEAR GT_DATA_HEAD-GMNGA .
LOOP AT GT_AFRU.
GT_DATA_HEAD-GMNGA = GT_DATA_HEAD-GMNGA + GT_AFRU-GMNGA .
CLEAR GT_AFRU .
ENDLOOP.
SELECT SINGLE STPRS VERPR VPRSV PEINH INTO ( GT_DATA_HEAD-STPRS , GT_DATA_HEAD-VERPR , GT_DATA_HEAD-VPRSV , GT_DATA_HEAD-PEINH ) FROM MBEW
WHERE MATNR = GT_DATA_HEAD-MATNR
.
IF GT_DATA_HEAD-VPRSV = 'V'.
GT_DATA_HEAD-STPRS = GT_DATA_HEAD-VERPR .
ENDIF.
GT_DATA_HEAD-ZGDCZ = GT_DATA_HEAD-PSMNG * GT_DATA_HEAD-STPRS .
GT_DATA_HEAD-CLR = 'C310'.
GT_DATA_HEAD-FLAG = 'X'.
MODIFY GT_DATA_HEAD .
CLEAR GT_DATA_HEAD .
ENDLOOP.
ENDIF.
CLEAR GT_DATA_ITEM[].
SELECT
AFPO~PWERK
AFPO~AUFNR
AFPO~MATNR
AFPO~PSMNG
AUFK~AUART
MARA~PRDHA
RESB~MATNR AS MATNR_SUB
RESB~MEINS
RESB~AUSCH
RESB~BDMNG
RESB~RGEKZ
INTO CORRESPONDING FIELDS OF TABLE GT_DATA_ITEM[]
FROM AFPO
INNER JOIN AFKO ON AFPO~AUFNR = AFKO~AUFNR
INNER JOIN MARA ON AFPO~MATNR = MARA~MATNR
INNER JOIN AUFK ON AFPO~AUFNR = AUFK~AUFNR
INNER JOIN RESB ON AFPO~AUFNR = RESB~AUFNR
WHERE AFPO~PWERK = P_PWERK
AND AFPO~AUFNR IN S_AUFNR
AND AFPO~MATNR IN S_MATNR
AND AFPO~LTRMI IN S_LTRMI
AND AFKO~DISPO IN S_DISPO
AND AFKO~GLTRP IN S_GLTRP
AND AFKO~GSTRP IN S_GSTRP
AND AFKO~FEVOR IN S_FEVOR
AND MARA~PRDHA IN S_PRDHA
.
LOOP AT GT_DATA_ITEM.
SELECT SINGLE MAKTX INTO GT_DATA_ITEM-MAKTX FROM MAKT
WHERE MATNR = GT_DATA_ITEM-MATNR
.
SELECT SINGLE MAKTX INTO GT_DATA_ITEM-MAKTX_SUB FROM MAKT
WHERE MATNR = GT_DATA_ITEM-MATNR_SUB
.
SELECT SINGLE STPRS VERPR VPRSV PEINH INTO ( GT_DATA_ITEM-STPRS , GT_DATA_ITEM-VERPR , GT_DATA_ITEM-VPRSV , GT_DATA_ITEM-PEINH ) FROM MBEW
WHERE MATNR = GT_DATA_ITEM-MATNR_SUB
.
IF GT_DATA_ITEM-VPRSV = 'V'.
GT_DATA_ITEM-STPRS = GT_DATA_ITEM-VERPR .
ENDIF.
*不含损耗率的子件数量
IF 100 + GT_DATA_ITEM-AUSCH <> 0.
GT_DATA_ITEM-BOMYL = GT_DATA_ITEM-BDMNG / ( 100 + GT_DATA_ITEM-AUSCH ) / 100 .
ENDIF.
*BOM的标准用量
CLEAR GT_DATA_HEAD .
READ TABLE GT_DATA_HEAD WITH KEY PWERK = GT_DATA_ITEM-PWERK AUFNR = GT_DATA_ITEM-AUFNR .
IF GT_DATA_HEAD-PSMNG <> 0.
GT_DATA_ITEM-BOMBZ = GT_DATA_ITEM-BOMYL / GT_DATA_HEAD-PSMNG .
ENDIF.
*计划外发料数量
CLEAR GT_MSEG[] .
SELECT MENGE INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
WHERE BWART = '261'
AND VGART_MKPF = 'WA'
AND WERKS = GT_DATA_ITEM-PWERK
AND MATNR = GT_DATA_ITEM-MATNR_SUB
AND AUFNR = GT_DATA_ITEM-AUFNR
.
LOOP AT GT_MSEG.
GT_DATA_ITEM-MENGE = GT_DATA_ITEM-MENGE + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
*退料数量
CLEAR GT_MSEG[] .
SELECT MENGE INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[] FROM MSEG
WHERE BWART = '262'
AND WERKS = GT_DATA_ITEM-PWERK
AND MATNR = GT_DATA_ITEM-MATNR_SUB
AND AUFNR = GT_DATA_ITEM-AUFNR
.
LOOP AT GT_MSEG.
GT_DATA_ITEM-MENGT = GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
*实发数量
GT_DATA_ITEM-ZSFSL = GT_DATA_ITEM-BDMNG + GT_DATA_ITEM-MENGE .
*发放差异
GT_DATA_ITEM-ZFFCY = GT_DATA_ITEM-ZSFSL + GT_DATA_ITEM-BDMNG .
*差异比例
IF GT_DATA_ITEM-BDMNG <> 0.
GT_DATA_ITEM-ZCYBL = GT_DATA_ITEM-ZFFCY / GT_DATA_ITEM-BDMNG .
ENDIF.
*产值
GT_DATA_ITEM-ZGDCZ = GT_DATA_ITEM-PSMNG * GT_DATA_ITEM-STPRS .
*正常报废数
GT_DATA_ITEM-ZCBFS = GT_DATA_ITEM-AUSCH * GT_DATA_ITEM-BOMYL .
*异常报废数
GT_DATA_ITEM-YCBFS = GT_DATA_ITEM-ZSFSL - GT_DATA_ITEM-BDMNG .
*正常报废金额
GT_DATA_ITEM-ZCBFJ = GT_DATA_ITEM-ZCBFS * GT_DATA_ITEM-STPRS .
*异常报废金额
GT_DATA_ITEM-YCBFJ = GT_DATA_ITEM-YCBFS * GT_DATA_ITEM-STPRS .
*报废金额小计
GT_DATA_ITEM-BFJEJ = GT_DATA_ITEM-ZCBFJ + GT_DATA_ITEM-YCBFJ .
*正常报废率-产值计
IF GT_DATA_ITEM-ZGDCZ <> 0.
GT_DATA_ITEM-ZCBFL = GT_DATA_ITEM-ZCBFJ / GT_DATA_ITEM-ZGDCZ .
ENDIF.
*异常报废率-产值计
IF GT_DATA_ITEM-ZGDCZ <> 0.
GT_DATA_ITEM-YCBFL = GT_DATA_ITEM-YCBFJ / GT_DATA_ITEM-ZGDCZ .
ENDIF.
*实际子件报废数量
GT_DATA_ITEM-SZJBS = GT_DATA_ITEM-ZSFSL - GT_DATA_ITEM-BOMYL .
*实际子件报废率-数量计
IF GT_DATA_ITEM-BOMYL <> 0.
GT_DATA_ITEM-SZJBF = GT_DATA_ITEM-SZJBS / GT_DATA_ITEM-BOMYL .
ENDIF.
MODIFY GT_DATA_ITEM .
CLEAR GT_DATA_ITEM .
ENDLOOP.
CLEAR GT_DATA[] .
IF P_1 IS NOT INITIAL.
APPEND LINES OF GT_DATA_HEAD[] TO GT_DATA[] .
APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
SORT GT_DATA[] BY PWERK MATNR AUFNR FLAG DESCENDING .
ELSE .
SORT GT_DATA[] BY PRDHA .
APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING PRDHA.
LOOP AT GT_DATA.
CLEAR GT_DATA-GMNGA .
CLEAR GT_DATA-SZJBS .
CLEAR GT_DATA-ZCBFS .
CLEAR GT_DATA-YCBFS .
CLEAR GT_DATA-BFJEJ .
CLEAR GT_DATA-ZCBFJ .
CLEAR GT_DATA-YCBFJ .
CLEAR GT_DATA-ZGDCZ .
CLEAR GT_DATA-BOMYL .
CLEAR GT_DATA-BDMNG .
CLEAR GT_DATA-MENGE .
CLEAR GT_DATA-MENGT .
CLEAR GT_DATA-ZSFSL .
CLEAR GT_DATA-ZFFCY .
CLEAR GT_DATA-ZCBFL .
CLEAR GT_DATA-YCBFL .
CLEAR GT_DATA-SZJBF .
CLEAR GT_DATA-ZCYBL .
LOOP AT GT_DATA_ITEM WHERE PRDHA = GT_DATA-PRDHA.
GT_DATA-GMNGA = GT_DATA-GMNGA + GT_DATA_ITEM-GMNGA.
GT_DATA-SZJBS = GT_DATA-SZJBS + GT_DATA_ITEM-SZJBS.
GT_DATA-ZCBFS = GT_DATA-ZCBFS + GT_DATA_ITEM-ZCBFS.
GT_DATA-YCBFS = GT_DATA-YCBFS + GT_DATA_ITEM-YCBFS.
GT_DATA-BFJEJ = GT_DATA-BFJEJ + GT_DATA_ITEM-BFJEJ.
GT_DATA-ZCBFJ = GT_DATA-ZCBFJ + GT_DATA_ITEM-ZCBFJ.
GT_DATA-YCBFJ = GT_DATA-YCBFJ + GT_DATA_ITEM-YCBFJ.
GT_DATA-ZGDCZ = GT_DATA-ZGDCZ + GT_DATA_ITEM-ZGDCZ.
GT_DATA-BOMYL = GT_DATA-BOMYL + GT_DATA_ITEM-BOMYL.
GT_DATA-BDMNG = GT_DATA-BDMNG + GT_DATA_ITEM-BDMNG.
GT_DATA-MENGE = GT_DATA-MENGE + GT_DATA_ITEM-MENGE.
GT_DATA-MENGT = GT_DATA-MENGT + GT_DATA_ITEM-MENGT.
GT_DATA-ZSFSL = GT_DATA-ZSFSL + GT_DATA_ITEM-ZSFSL.
GT_DATA-ZFFCY = GT_DATA-ZFFCY + GT_DATA_ITEM-ZFFCY.
CLEAR GT_DATA_ITEM .
ENDLOOP.
GT_DATA-ZITEM = '系 列 小 计' .
*正常报废率-产值计
IF GT_DATA-ZGDCZ <> 0.
GT_DATA-ZCBFL = GT_DATA-ZCBFJ / GT_DATA-ZGDCZ .
ENDIF.
*异常报废率-产值计
IF GT_DATA-ZGDCZ <> 0.
GT_DATA-YCBFL = GT_DATA-YCBFJ / GT_DATA-ZGDCZ .
ENDIF.
*实际子件报废率-数量计
IF GT_DATA-BOMYL <> 0.
GT_DATA-SZJBF = GT_DATA-SZJBS / GT_DATA-BOMYL .
ENDIF.
*差异比例
IF GT_DATA-BDMNG <> 0.
GT_DATA-ZCYBL = GT_DATA-ZFFCY / GT_DATA-BDMNG .
ENDIF.
MODIFY GT_DATA .
CLEAR GT_DATA .
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FILL_STATUS_TABLE
*&---------------------------------------------------------------------*
FORM FILL_STATUS_TABLE TABLES STATUS_TAB STRUCTURE STATUS_HDR_TAB
USING SYST1 LIKE TJ02T-TXT04
SYSH1 LIKE JEST-STAT
EXCL1 LIKE RCOSA-EXCL1
SYST2 LIKE TJ02T-TXT04
SYSH2 LIKE JEST-STAT
EXCL2 LIKE RCOSA-EXCL1.
DATA STATUS_TMP LIKE STATUS_HDR_TAB.
* Append status from selection screen to imported status table
IF NOT SYSH1 IS INITIAL.
STATUS_TMP-STAT = SYSH1.
STATUS_TMP-EXCL = EXCL1.
COLLECT STATUS_TMP INTO STATUS_TAB.
ELSEIF NOT SYST1 IS INITIAL.
CALL FUNCTION 'STATUS_TEXT_CONVERSION'
EXPORTING
LANGUAGE = SY-LANGU
TXT04 = SYST1
IMPORTING
STATUS_NUMBER = STATUS_TMP-STAT
EXCEPTIONS
INSUFFICIENT_INPUT = 1
NOT_FOUND = 2
OBJECT_NOT_FOUND = 3
WRONG_MODE = 4
OTHERS = 5.
IF SY-SUBRC EQ 0.
STATUS_TMP-EXCL = EXCL1.
COLLECT STATUS_TMP INTO STATUS_TAB.
ENDIF.
ENDIF.
IF NOT SYSH2 IS INITIAL.
STATUS_TMP-STAT = SYSH2.
STATUS_TMP-EXCL = EXCL2.
COLLECT STATUS_TMP INTO STATUS_TAB.
ELSEIF NOT SYST2 IS INITIAL.
CALL FUNCTION 'STATUS_TEXT_CONVERSION'
EXPORTING
LANGUAGE = SY-LANGU
TXT04 = SYST2
IMPORTING
STATUS_NUMBER = STATUS_TMP-STAT
EXCEPTIONS
INSUFFICIENT_INPUT = 1
NOT_FOUND = 2
OBJECT_NOT_FOUND = 3
WRONG_MODE = 4
OTHERS = 5.
IF SY-SUBRC EQ 0.
STATUS_TMP-EXCL = EXCL2.
COLLECT STATUS_TMP INTO STATUS_TAB.
ENDIF.
ENDIF.
ENDFORM. " FILL_STATUS_TABLE
*&---------------------------------------------------------------------*
*& Form REDUCE_AUFNR_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
FORM REDUCE_AUFNR_OBJNR_BY_STATUS
TABLES STATUS_TAB STRUCTURE STATUS_HDR_TAB
USING SELID LIKE P_SELID
CHANGING CTS_OBJNR TYPE TYP_TS_OBJNR.
* Statusobjekte
DATA:
OBJNR_TAB LIKE JSTO_PRE OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS:
<LS_OBJNR> TYPE TYP_S_OBJNR.
CHECK NOT SELID IS INITIAL
OR NOT STATUS_TAB[] IS INITIAL.
* preread
LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
OBJNR_TAB-OBJNR = <LS_OBJNR>-OBJNR.
APPEND OBJNR_TAB.
ENDLOOP.
CALL FUNCTION 'STATUS_PRE_READ'
TABLES
JSTO_PRE_TAB = OBJNR_TAB.
DATA OBJECTS_DELETED.
PERFORM REDUCE_OBJNR_BY_STATUS
TABLES OBJNR_TAB
STATUS_TAB
USING SELID
CHANGING OBJECTS_DELETED.
IF OBJECTS_DELETED = YX.
* Alle Aufträge entfernen, deren OBJNR nicht mehr in der Tabelle
* OBJNR_TAB enthalten ist.
IF OBJNR_TAB[] IS INITIAL.
REFRESH CTS_OBJNR[].
ELSE.
SORT OBJNR_TAB BY OBJNR.
LOOP AT CTS_OBJNR[] ASSIGNING <LS_OBJNR>.
READ TABLE OBJNR_TAB
WITH KEY OBJNR = <LS_OBJNR>-OBJNR
BINARY SEARCH.
IF SY-SUBRC <> 0.
DELETE CTS_OBJNR[].
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM. " REDUCE_AUFNR_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
*& Form REDUCE_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
FORM REDUCE_OBJNR_BY_STATUS
TABLES OBJNR_TAB STRUCTURE OBJNR_TAB
STATUS_TAB STRUCTURE STATUS_HDR_TAB
USING SELID LIKE P_SELID
CHANGING OBJECTS_DELETED.
DATA OBJNR_CNT LIKE SY-DBCNT.
CLEAR OBJECTS_DELETED.
CHECK NOT OBJNR_TAB[] IS INITIAL.
DESCRIBE TABLE OBJNR_TAB LINES OBJNR_CNT.
* Statusprüfung gegen Status in Statustabelle
LOOP AT STATUS_TAB.
IF OBJNR_TAB[] IS INITIAL.
EXIT.
ELSE.
* Alle Objektnummern, bei denen der geforderte Status (nicht) sitzt,
* werden aus der Tabelle OBJNR_TAB gelöscht.
CALL FUNCTION 'STATUS_CHECK_MULTI'
EXPORTING
STATUS = STATUS_TAB-STAT
FLG_EXCLUDE = STATUS_TAB-EXCL
TABLES
OBJECTS = OBJNR_TAB.
ENDIF.
ENDLOOP.
* Statusprüfung gegen das Selektionsschema
IF NOT SELID IS INITIAL.
LOOP AT OBJNR_TAB.
DATA FLG_STATUS_OK TYPE C. "Statusprüfung OK
CALL FUNCTION 'STATUS_CHECK_BY_SELSCHEM'
EXPORTING
OBJNR = OBJNR_TAB-OBJNR
SELID = SELID
IMPORTING
FULLFILL = FLG_STATUS_OK
EXCEPTIONS
NO_STAT_SCHEME = 01
NO_STAT_TAB = 02.
IF SY-SUBRC IS INITIAL
AND FLG_STATUS_OK IS INITIAL.
DELETE OBJNR_TAB.
ENDIF.
ENDLOOP.
ENDIF.
DESCRIBE TABLE OBJNR_TAB LINES SY-DBCNT.
IF SY-DBCNT <> OBJNR_CNT.
OBJECTS_DELETED = YX.
ENDIF.
ENDFORM. " REDUCE_OBJNR_BY_STATUS
*&---------------------------------------------------------------------*
*& Form val_req_status
*&---------------------------------------------------------------------*
* F4-Help to select system status by text, providing also code
*----------------------------------------------------------------------*
* -->I_DYNPF Name of dynpro field
* -->C_TXT04 Status short text
* -->C_STAT Status code
*----------------------------------------------------------------------*
FORM VAL_REQ_STATUS USING I_DYNPF
CHANGING C_TXT04 LIKE TJ02T-TXT04
C_STAT LIKE JEST-STAT.
TYPES: BEGIN OF TY_VALUE,
ISTAT TYPE J_ISTAT,
TXT04 TYPE J_TXT04,
TXT30 TYPE J_TXT30,
END OF TY_VALUE.
DATA: L_VALUE TYPE DYNFIELDVALUE,
L_REPID TYPE SY-REPID,
LS_DYNP TYPE DYNPREAD,
LS_TJ02 TYPE TJ02,
LS_VALUE TYPE TJ02T,
LS_RETURN TYPE DDSHRETVAL,
LT_DYNP TYPE STANDARD TABLE OF DYNPREAD,
LT_TJ02 TYPE STANDARD TABLE OF TJ02,
LT_VALUE TYPE STANDARD TABLE OF TJ02T,
LT_RETURN TYPE STANDARD TABLE OF DDSHRETVAL.
* personal value key
DATA: L_PVALKEY TYPE DDSHPVKEY.
* Get current value from screen
LS_DYNP-FIELDNAME = I_DYNPF.
APPEND LS_DYNP TO LT_DYNP.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SY-REPID
DYNUMB = SY-DYNNR
TABLES
DYNPFIELDS = LT_DYNP
EXCEPTIONS
OTHERS = 0.
READ TABLE LT_DYNP INTO LS_DYNP INDEX 1.
* Get all possible values
SELECT * FROM TJ02 INTO TABLE LT_TJ02
WHERE NODIS = SPACE.
IF LT_TJ02 IS NOT INITIAL.
SELECT * FROM TJ02T INTO TABLE LT_VALUE
FOR ALL ENTRIES IN LT_TJ02
WHERE ISTAT = LT_TJ02-ISTAT
AND SPRAS = SY-LANGU.
ENDIF.
IF LINES( LT_TJ02 ) <> LINES( LT_VALUE ).
* Not all status available in current language, try in german
* as in FORM value_state(saplcoss)
LOOP AT LT_TJ02 INTO LS_TJ02.
READ TABLE LT_VALUE INTO LS_VALUE WITH KEY ISTAT = LS_TJ02-ISTAT.
CHECK SY-SUBRC <> 0.
SELECT SINGLE * FROM TJ02T INTO LS_VALUE
WHERE ISTAT = LS_TJ02-ISTAT
AND SPRAS = 'D'.
IF SY-SUBRC = 0.
APPEND LS_VALUE TO LT_VALUE.
ENDIF.
ENDLOOP.
ENDIF.
SORT LT_VALUE BY ISTAT.
* Call own F4-help, not showing internal status number
L_VALUE = LS_DYNP-FIELDVALUE.
L_REPID = 'PPIO_ENTRY'.
* fill key for personal value list
L_PVALKEY = SY-UNAME.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
DDIC_STRUCTURE = 'TJ02T'
RETFIELD = 'TXT04'
PVALKEY = L_PVALKEY
VALUE = L_VALUE
VALUE_ORG = 'S'
CALLBACK_PROGRAM = L_REPID
CALLBACK_FORM = 'VAL_REQ_STATUS_CALLBACK'
TABLES
VALUE_TAB = LT_VALUE
RETURN_TAB = LT_RETURN.
* Get selectect value and internal status number
READ TABLE LT_RETURN INTO LS_RETURN WITH KEY FIELDNAME = 'ISTAT'.
IF SY-SUBRC = 0.
READ TABLE LT_VALUE WITH KEY ISTAT = LS_RETURN-FIELDVAL
INTO LS_VALUE.
CHECK SY-SUBRC = 0.
C_TXT04 = LS_VALUE-TXT04.
C_STAT = LS_VALUE-ISTAT.
ELSE.
CLEAR: C_TXT04, C_STAT.
ENDIF.
ENDFORM. "val_req_status
*&---------------------------------------------------------------------*
*& Form SYSTEM_STATE_CHECK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_P_SYCP2 text
*----------------------------------------------------------------------*
FORM SYSTEM_STATE_CHECK
USING I_DIALOG TYPE FLAG
CHANGING C_STATE LIKE TJ02T-TXT04
C_STATE_NR LIKE JEST-STAT.
DATA: L_STATE LIKE C_STATE,
LS_TJ02T TYPE TJ02T,
LT_TJ02T TYPE STANDARD TABLE OF TJ02T.
IF C_STATE IS INITIAL.
CLEAR C_STATE_NR.
ENDIF.
CHECK NOT C_STATE IS INITIAL.
* Get all possible values
SELECT * FROM TJ02T INTO TABLE LT_TJ02T "#EC CI_GENBUFF
WHERE TXT04 = C_STATE
AND SPRAS = SY-LANGU.
IF SY-SUBRC <> 0.
* If not found, try in german
* (see function module STATUS_TEXT_CONVERSION)
SELECT * FROM TJ02T INTO TABLE LT_TJ02T "#EC CI_GENBUFF
WHERE TXT04 = C_STATE
AND SPRAS = 'D'.
IF SY-SUBRC <> 0.
* If not found, try with uppercase letters
L_STATE = C_STATE.
TRANSLATE L_STATE TO UPPER CASE. "#EC TRANSLANG
SELECT * FROM TJ02T INTO TABLE LT_TJ02T "#EC CI_GENBUFF
WHERE TXT04 = L_STATE
AND SPRAS = SY-LANGU.
IF SY-SUBRC <> 0.
* If not found, try in german
* (see function module STATUS_TEXT_CONVERSION)
SELECT * FROM TJ02T INTO TABLE LT_TJ02T "#EC CI_GENBUFF
WHERE TXT04 = L_STATE
AND SPRAS = 'D'.
IF SY-SUBRC <> 0.
* If not found, give up with error message
CLEAR C_STATE_NR.
MESSAGE E249(BS) WITH C_STATE SY-LANGU 'D'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* Check if value is unambiguous
IF LINES( LT_TJ02T ) = 1.
* Take over found values
READ TABLE LT_TJ02T INTO LS_TJ02T INDEX 1.
C_STATE = LS_TJ02T-TXT04.
C_STATE_NR = LS_TJ02T-ISTAT.
ELSE.
* Check if internal status number was already provided by F4-help
IF C_STATE_NR IS NOT INITIAL.
READ TABLE LT_TJ02T INTO LS_TJ02T WITH KEY ISTAT = C_STATE_NR.
IF SY-SUBRC = 0.
* Internal status number already there, exit
EXIT.
ENDIF.
ENDIF.
* Value is ambiguous, F4-help must be used
CLEAR C_STATE_NR.
IF NOT I_DIALOG IS INITIAL.
MESSAGE E054(COIS) WITH C_STATE.
ENDIF.
ENDIF.
ENDFORM. " SYSTEM_STATE_CHECK
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
CLEAR S_LAYOUT.
S_LAYOUT-ZEBRA = 'X'.
S_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
S_LAYOUT-INFO_FIELDNAME = 'CLR'. "行颜色代码的字段
* s_layout-box_fieldname = 'BOX'.
PERFORM FRM_FILL_FIELD .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
IS_LAYOUT = S_LAYOUT
IT_FIELDCAT = GT_FIELDCAT
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
TABLES
T_OUTTAB = GT_DATA[].
ENDFORM.
FORM FRM_FILL_FIELD .
DATA: WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
DEFINE FILL_FIELD.
wa_fieldcat-fieldname = &1.
wa_fieldcat-seltext_l = &2.
* IF wa_fieldcat-fieldname = 'MSLJH' or wa_fieldcat-fieldname = 'WCBJH'.
* wa_fieldcat-EMPHASIZE = 'C600'. "设置字段的颜色
* ENDIF.
*
* IF wa_fieldcat-fieldname = 'MSLMB' or wa_fieldcat-fieldname = 'WCBMB'.
* wa_fieldcat-EMPHASIZE = 'C710'. "设置字段的颜色
* ENDIF.
IF wa_fieldcat-fieldname = 'PLNBEZ' OR wa_fieldcat-fieldname = 'MATNR' .
wa_fieldcat-ref_tabname = 'MARA'.
wa_fieldcat-ref_fieldname = 'MATNR'.
ENDIF.
IF wa_fieldcat-fieldname = 'ARKTX' OR wa_fieldcat-fieldname = 'WAKTX' .
wa_fieldcat-ref_tabname = 'VBAP'.
wa_fieldcat-ref_fieldname = 'ARKTX'.
ENDIF.
IF wa_fieldcat-fieldname = 'AUFNR' .
wa_fieldcat-ref_tabname = 'AUFK'.
wa_fieldcat-ref_fieldname = 'AUFNR'.
ENDIF.
APPEND wa_fieldcat TO gt_fieldcat.
CLEAR wa_fieldcat.
END-OF-DEFINITION.
IF P_1 IS NOT INITIAL.
FILL_FIELD :
'PWERK' '工厂',
'AUFNR' '工单号',
'PRDHA' '系列',
'MATNR' '成品项目号',
'MAKTX' '项目号说明',
'MATNR_SUB' '子件项目号',
'MAKTX_SUB' '子件项目号说明',
'MEINS' '单位',
'PSMNG' '工单数量',
'GMNGA' '完工数量',
'STPRS' '单价',
'PEINH' '价格单位',
'ZCBFL' '正常报废率-产值计',
'YCBFL' '异常报废率-产值计',
'SZJBF' '实际子件报废率-数量计',
'SZJBS' '实际子件报废数量',
'ZCBFS' '正常报废数',
'YCBFS' '异常报废数',
'BFJEJ' '报废金额小计',
'ZCBFJ' '正常报废金额',
'YCBFJ' '异常报废金额',
'ZGDCZ' '产值',
'AUSCH' '损耗率基准',
'BOMYL' '工单BOM用量',
'BOMBZ' '各子件用量',
'BDMNG' '计划数量',
'MENGE' '超领数量',
'MENGT' '退料数量',
'ZSFSL' '实发数量',
'ZFFCY' '发放差异',
'ZCYBL' '差异比例',
'RGEKZ' '反冲',
'AUART' '工单类型',
'ZADD1' '原因分析',
'ZADD2' '改善措施',
'ZADD3' 'CAR编号',
'ZADD4' '责任人',
'ZADD5' '担当人',
'FLAG' '抬头行'.
ELSE .
FILL_FIELD :
'ZITEM' '项 目',
'PRDHA' '系列',
'PSMNG' '工单数量',
'ZCBFL' '正常报废率-产值计',
'YCBFL' '异常报废率-产值计',
'SZJBF' '实际子件报废率-数量计',
'SZJBS' '实际子件报废数量',
'ZCBFS' '正常报废数',
'YCBFS' '异常报废数',
'BFJEJ' '报废金额小计',
'ZCBFJ' '正常报废金额',
'YCBFJ' '异常报废金额',
'ZGDCZ' '产值',
'BOMYL' '订单BOM用量',
'BDMNG' '计划数量',
'MENGE' '超领数量',
'MENGT' '退料数量',
'ZSFSL' '实发数量',
'ZFFCY' '发放差异',
'ZCYBL' '差异比例'.
ENDIF.
ENDFORM.
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
IS_SELFIELD TYPE SLIS_SELFIELD.
DATA: REF TYPE REF TO CL_GUI_ALV_GRID.
DATA : LV_STABLE TYPE LVC_S_STBL. "刷新稳定性
RANGES: L_WERKS FOR T001W-WERKS.
RANGES: L_MATNR FOR MARA-MATNR.
DATA:L_BUKRS TYPE T001K-BUKRS.
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF.
CALL METHOD REF->CHECK_CHANGED_DATA.
CASE I_UCOMM.
WHEN '&IC1'."表示双击
WHEN 'POST_T'.
ENDCASE.
CALL METHOD REF->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
ENDFORM.
INITIALIZATION .
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST1.
PERFORM VAL_REQ_STATUS USING 'P_SYST1' CHANGING P_SYST1 P_SYSH1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_SYST2.
PERFORM VAL_REQ_STATUS USING 'P_SYST2' CHANGING P_SYST2 P_SYSH2.
AT SELECTION-SCREEN ON P_SYST1.
PERFORM SYSTEM_STATE_CHECK USING YX
CHANGING P_SYST1
P_SYSH1.
AT SELECTION-SCREEN ON P_SYST2.
PERFORM SYSTEM_STATE_CHECK USING YX
CHANGING P_SYST2
P_SYSH2.
AT SELECTION-SCREEN.
PERFORM SCREEN_SETTING.
START-OF-SELECTION.
PERFORM FOM_GETDATA .
PERFORM FRM_DISPLAY.
ABAP开发笔记——2019.07.16
最新推荐文章于 2024-05-29 15:33:55 发布