*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2019-06-26
*& Program Type : Report
*& Description : 工单领料查询报表
*&---------------------------------------------------------------------*
REPORT ZPPR002H DEFINING DATABASE IOC.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:AFPO,MARA,EKET,AFKO,TJ30T,JCDS,CRHD,RESB.
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, "工单号
VERID TYPE AFPO-VERID, "生产版本
MATNR TYPE AFPO-MATNR, "成品项目号
FEVOR TYPE MARC-FEVOR, "生产管理员
TXT TYPE T024F-TXT, "生产管理员描述
MEINS TYPE AFPO-MEINS, "单位
MEINS_SUB TYPE RESB-MEINS, "子件单位
PSMNG TYPE AFPO-PSMNG, "工单数量
WEMNG TYPE AFPO-WEMNG, "交货数量
EXTWG TYPE MARA-EXTWG, "系列
VTEXT TYPE T179T-VTEXT, "系列描述
MAKTX TYPE MAKT-MAKTX, "项目号说明
VORNR TYPE AFVC-VORNR, "项目号说明
RSNUM TYPE RESB-RSNUM, "预留号
RSPOS TYPE RESB-RSPOS, "预留项目
MATNR_SUB TYPE RESB-MATNR, "子件项目号
MTART TYPE MARA-MTART, "子件物料类型
MAKTX_SUB TYPE MAKT-MAKTX, "子件项目号说明
GMNGA TYPE AFRU-GMNGA, "确认数量
STPRS TYPE MBEW-STPRS, "取标准价格
VERPR TYPE MBEW-VERPR, "移动平均价格/周期单价
ZPLP1 TYPE MBEW-ZPLP1, "计划价格1
ARBID TYPE AFVC-ARBID, "资源的对象 ID
STAND TYPE CRCO-KOSTL, "管理部门成本中心
STEXT TYPE CSKT-KTEXT, "管理部门
GSTRI TYPE AFKO-GSTRI, "工单第一次报工日期
GLTRI TYPE AFKO-GLTRI, "工单入库完成日期
UDATE TYPE JCDS-UDATE, "工单TECO日期
ZCBFL TYPE ZSTP01, "正常报废率
ZCBFL_T TYPE STRING, "正常报废率
YCBFL TYPE ZSTP01, "异常报废率
YCBFL_T TYPE STRING, "异常报废率
SZJBF TYPE MSEG-MENGE, "实际子件报废率
SZJBFT TYPE CHAR10, "实际子件报废率
SZJBS TYPE MSEG-MENGE, "实际子件报废数量
ZCBFS TYPE MSEG-MENGE, "正常报废数
YCBFS TYPE MSEG-MENGE, "异常报废数
BZBFS TYPE MSEG-MENGE, "标准报废数
BFJEJ TYPE ZSTPRS01, "报废金额小计
ZCBFJ TYPE ZSTPRS01, "正常报废金额
YCBFJ TYPE ZSTPRS01, "异常报废金额
PEINH TYPE MBEW-PEINH, "价格单位
VPRSV TYPE MBEW-VPRSV, "价格控制指示符
ZGDCZ TYPE ZSTPRS, "产值
AUSCH TYPE RESB-AUSCH, "BOM中的损耗率
AUSCHT TYPE CHAR10, "BOM中的损耗率
BDMNG TYPE ZBDMNG, "需求量
BOMYL TYPE RESB-BDMNG, "目标用量(不含废品率)
BOMBZ TYPE ZBDMNG, "各子件用量(不含废品率)
FMENG TYPE RESB-FMENG, "固定数量
SHKZG TYPE RESB-SHKZG, "借方/贷方标识
STLNR TYPE RESB-STLNR, "BOM展开号
WERKS TYPE RESB-WERKS, "子件工厂
ERFME TYPE RESB-ERFME, "条目单位
ERFMG TYPE RESB-ERFMG, "工单需求数
RSART TYPE RESB-RSART, "记录类型
MENGE TYPE MSEG-MENGE, "计划外发料数量
MENGE_T TYPE MSEG-MENGE, "计划外发料数量
MENGE_J TYPE MSEG-MENGE, "计划外发料数量
MENGT TYPE MSEG-MENGE, "退料数量
ZSFSL TYPE MSEG-MENGE, "实发数量
ZFFCY TYPE MSEG-MENGE, "发放差异(实际VS 计划)
ZCYBL TYPE MSEG-MENGE, "差异比例
ZCYBLT TYPE CHAR10, "差异比例
STTXT TYPE BSVX-STTXT, "工单状态
ZTTXT TYPE BSVX-STTXT, "自定义用户状态
RGEKZ TYPE RESB-RGEKZ, "反冲
AUART TYPE AUFK-AUART, "工单类型
OBJNR TYPE AUFK-OBJNR, "对象号
ZADD1 TYPE CHAR10, "原因分析
ZADD2 TYPE CHAR10, "改善措施
ZADD3 TYPE CHAR10, "CAR编号
ZADD4 TYPE CHAR10, "责任人
ZADD5 TYPE CHAR10, "担当人
ZJHDJ TYPE ZCURR5, "计划单价
SOLLKOST TYPE KKBCS_OUT-SOLLKOST_G, "目标成本
SOLLKOSTL TYPE KKBCS_OUT-SOLLKOST_G, "目标成本(不含废品率)
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_DATA_ITEM_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_DATA_ITEM_C 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.
DATA: GT_AFVC TYPE TABLE OF AFVC WITH HEADER LINE.
DATA: GT_CRHD TYPE TABLE OF CRHD WITH HEADER LINE.
DATA: GT_T499S TYPE TABLE OF T499S WITH HEADER LINE.
DATA: GT_CKMLCR TYPE TABLE OF CKMLCR WITH HEADER LINE.
DATA: LV_DATUM TYPE SYST_DATUM .
DATA: LV_DATUA TYPE SYST_DATUM .
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS: S_PWERK FOR AFPO-PWERK MODIF ID C1 . "工厂
SELECT-OPTIONS: S_AUFNR FOR AFPO-AUFNR MODIF ID C1 . "工单号
SELECT-OPTIONS: S_MATNR FOR AFPO-MATNR MODIF ID C1 . "产品号码
SELECT-OPTIONS: S_MATNS FOR RESB-MATNR MODIF ID C1 . "子件物料
SELECT-OPTIONS: S_EXTWG FOR MARA-EXTWG 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_STAND FOR CRHD-STAND MODIF ID C1 . "管理部门成本中心
SELECT-OPTIONS: S_LTRMI FOR AFPO-LTRMI MODIF ID C1 . "工单实际完成日期
SELECT-OPTIONS: S_UDATE FOR JCDS-UDATE MODIF ID C1 . "TECO日期
SELECT-OPTIONS: S_TXT04 FOR TJ30T-TXT04 MODIF ID C1 DEFAULT 'ZINI'. "自定义用户状态
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.
PARAMETERS: CH_01 AS CHECKBOX DEFAULT ''MODIF ID C1.
PARAMETERS: CH_02 AS CHECKBOX DEFAULT ''MODIF ID C1.
PARAMETERS: CH_03 AS CHECKBOX DEFAULT ''MODIF ID C1.
SELECTION-SCREEN END OF BLOCK B2.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
IF CH_02 IS NOT INITIAL AND CH_03 IS NOT INITIAL.
MESSAGE '只显示超领数据 / 只显示领料数小于计划数 只能选其一!' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA: LV_CKMLHD TYPE CKMLHD.
DATA: LV_MBEW TYPE MBEW.
DATA: LV_COST TYPE COST.
DATA: LV_CSSL TYPE CSSL.
DATA: GT_CKMLCR TYPE TABLE OF CKMLCR WITH HEADER LINE.
DATA:LTS_OBJNR TYPE TYP_TS_AUFNR_OBJNR.
DATA:LINE TYPE BSVX-STTXT.
DATA:GS_AFKO TYPE AFKO.
DATA: MATNR_L TYPE MATNR.
DATA: GT_JSTO TYPE TABLE OF JSTO WITH HEADER LINE.
DATA: GT_JEST TYPE TABLE OF JEST WITH HEADER LINE.
DATA: GT_TJ30 TYPE TABLE OF TJ30 WITH HEADER LINE.
DATA: GT_TJ30T TYPE TABLE OF TJ30T WITH HEADER LINE.
DATA: GT_MARM TYPE TABLE OF MARM WITH HEADER LINE.
DATA: FLAG TYPE C.
* 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
.
CLEAR LTS_OBJNR[] .
SELECT AUFNR OBJNR FROM AUFK
INTO CORRESPONDING FIELDS OF TABLE LTS_OBJNR[]
WHERE WERKS IN S_PWERK
AND AUFNR IN S_AUFNR
.
IF STATUS_HDR_TAB[] IS NOT INITIAL.
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~VERID
AFPO~AUFNR
AFPO~MATNR
AFPO~MEINS
AFPO~PSMNG
AFPO~WEMNG
AUFK~AUART
AUFK~OBJNR
MARA~EXTWG
AFKO~FEVOR
AFKO~GSTRI
AFKO~GLTRI
AFKO~AUFPL
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 IN S_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~EXTWG IN S_EXTWG
.
*------------------------------------------------------------------------------
* 自定义用户状态
*------------------------------------------------------------------------------
LOOP AT S_TXT04.
TRANSLATE S_TXT04-LOW TO UPPER CASE.
TRANSLATE S_TXT04-HIGH TO UPPER CASE.
MODIFY S_TXT04 .
ENDLOOP.
LOOP AT GT_DATA_HEAD.
CLEAR FLAG .
* OBJNR TYPE AUFK-OBJNR, "对象号
* STTXT TYPE BSVX-STTXT, "工单状态
* ZTTXT TYPE BSVX-STTXT, "自定义用户状态
CLEAR GT_JSTO .
SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_JSTO FROM JSTO
WHERE OBJNR = GT_DATA_HEAD-OBJNR
.
CLEAR GT_JEST[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_JEST[] FROM JEST
WHERE OBJNR = GT_DATA_HEAD-OBJNR
AND INACT = ''
.
IF GT_JEST[] IS NOT INITIAL.
CLEAR GT_TJ30[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_TJ30[] FROM TJ30
FOR ALL ENTRIES IN GT_JEST[]
WHERE ESTAT = GT_JEST-STAT
AND STSMA = GT_JSTO-STSMA
.
ENDIF.
IF GT_TJ30[] IS NOT INITIAL.
LOOP AT GT_TJ30.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_TJ30T FROM TJ30T
WHERE STSMA = GT_TJ30-STSMA
AND ESTAT = GT_TJ30-ESTAT
* AND SPRAS = 1
.
IF GT_TJ30T-TXT04 NOT IN S_TXT04.
FLAG = 'X'.
EXIT .
ELSE .
IF GT_DATA_HEAD-ZTTXT IS INITIAL.
GT_DATA_HEAD-ZTTXT = GT_TJ30T-TXT04 .
ELSE .
GT_DATA_HEAD-ZTTXT = GT_DATA_HEAD-ZTTXT && ';' && GT_TJ30T-TXT04 .
ENDIF.
ENDIF.
CLEAR GT_TJ30 .
CLEAR GT_TJ30T .
ENDLOOP.
ELSE .
IF S_TXT04 IS NOT INITIAL.
FLAG = 'X'.
ENDIF.
ENDIF.
* DATA: GT_JSTO TYPE TABLE OF JSTO WITH HEADER LINE.
* DATA: GT_JEST TYPE TABLE OF JEST WITH HEADER LINE.
IF FLAG IS INITIAL.
MODIFY GT_DATA_HEAD .
ELSE .
DELETE GT_DATA_HEAD .
ENDIF.
CLEAR GT_DATA_HEAD .
ENDLOOP.
*------------------------------------------------------------------------------
* 自定义用户状态
*------------------------------------------------------------------------------
LOOP AT GT_DATA_HEAD.
SELECT SINGLE MAKTX INTO GT_DATA_HEAD-MAKTX FROM MAKT
WHERE MATNR = GT_DATA_HEAD-MATNR
.
*取工单状态文本
CLEAR LINE .
CALL FUNCTION 'STATUS_TEXT_EDIT'
EXPORTING
CLIENT = SY-MANDT
OBJNR = GT_DATA_HEAD-OBJNR
SPRAS = SY-LANGU
IMPORTING
LINE = LINE
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS. "
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
SEARCH LINE FOR 'CLSD'.
IF SY-SUBRC = 0.
GT_DATA_HEAD-STTXT = '订单已关闭'.
ELSE.
GT_DATA_HEAD-STTXT = LINE .
ENDIF.
*工单TECO日期:
*如果工单状态含有TECO,则通过对象号 AFUK-OBJNR 到表 JCDS 取出 INACT 激活状态为空,
*状态码为 I0045 并按日期倒排排序,其中第一条数据的日期 UDATE 即为工单TECO日期
IF GT_DATA_HEAD-STTXT CS 'TECO'.
SELECT SINGLE MAX( UDATE ) INTO GT_DATA_HEAD-UDATE FROM JCDS
WHERE OBJNR = GT_DATA_HEAD-OBJNR
AND STAT = 'I0045'
.
ENDIF.
SELECT SINGLE EWBEZ INTO GT_DATA_HEAD-VTEXT FROM TWEWT
WHERE EXTWG = GT_DATA_HEAD-EXTWG
.
GT_DATA_HEAD-CLR = 'C310'.
GT_DATA_HEAD-FLAG = 'X'.
* SELECT SINGLE FEVOR INTO GT_DATA_HEAD-FEVOR FROM MARC
* WHERE MATNR = GT_DATA_HEAD-MATNR
* AND WERKS = GT_DATA_HEAD-PWERK
* .
SELECT SINGLE TXT INTO GT_DATA_HEAD-TXT FROM T024F
WHERE WERKS = GT_DATA_HEAD-PWERK
AND FEVOR = GT_DATA_HEAD-FEVOR
.
*最后一道工序
CLEAR GS_AFKO .
SELECT SINGLE AUFPL INTO CORRESPONDING FIELDS OF GS_AFKO FROM AFKO
WHERE AUFNR = GT_DATA_HEAD-AUFNR
.
* SELECT MAX( AFVC~VORNR ) INTO GT_DATA_HEAD-VORNR FROM AFVC
* WHERE AFVC~AUFPL = GS_AFKO-AUFPL
* .
*报工数
CLEAR GT_AFVC[].
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_AFVC[] FROM AFVC
WHERE AFVC~AUFPL = GS_AFKO-AUFPL
.
SORT GT_AFVC[] BY VORNR DESCENDING .
READ TABLE GT_AFVC INDEX 1 .
GT_DATA_HEAD-VORNR = GT_AFVC-VORNR .
GT_DATA_HEAD-ARBID = GT_AFVC-ARBID .
CLEAR GT_CRHD[].
SELECT * INTO TABLE GT_CRHD[] FROM CRHD
FOR ALL ENTRIES IN GT_AFVC[]
WHERE OBJTY = 'A'
AND OBJID = GT_AFVC-ARBID
AND WERKS = GT_AFVC-WERKS
AND BEGDA <= SY-DATUM
AND ENDDA >= SY-DATUM
.
IF GT_CRHD[] IS NOT INITIAL.
CLEAR GT_T499S[].
SELECT
T499S~STAND
INTO CORRESPONDING FIELDS OF TABLE GT_T499S[]
FROM ADRC
INNER JOIN T499S ON ADRC~ADDRNUMBER = T499S~ADDRNUM
FOR ALL ENTRIES IN GT_CRHD[]
WHERE T499S~WERKS = GT_CRHD-WERKS
AND T499S~STAND = GT_CRHD-STAND
AND ADRC~SORT1 <> 'PUBLIC'
.
READ TABLE GT_T499S INDEX 1 .
GT_DATA_HEAD-STAND = GT_T499S-STAND .
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = GT_DATA_HEAD-STAND
IMPORTING
OUTPUT = GT_DATA_HEAD-STAND.
SELECT SINGLE KTEXT INTO GT_DATA_HEAD-STEXT FROM CSKT
WHERE KOSTL = GT_DATA_HEAD-STAND
AND SPRAS = SY-LANGU
.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GT_DATA_HEAD-STAND
IMPORTING
OUTPUT = GT_DATA_HEAD-STAND.
CLEAR GT_AFRU[] .
SELECT GMNGA INTO CORRESPONDING FIELDS OF TABLE GT_AFRU[] FROM AFRU
WHERE AUFNR = GT_DATA_HEAD-AUFNR
AND VORNR = GT_DATA_HEAD-VORNR
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.
CLEAR GT_CKMLCR[] .
SELECT
CKMLCR~KALNR
CKMLCR~BDATJ
CKMLCR~POPER
CKMLCR~UNTPER
CKMLCR~CURTP
CKMLCR~STPRS
CKMLCR~PVPRS
CKMLCR~VPRSV
CKMLCR~PEINH
INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR[]
FROM CKMLCR
INNER JOIN CKMLHD ON CKMLCR~KALNR = CKMLHD~KALNR
WHERE CKMLHD~MATNR = GT_DATA_HEAD-MATNR
AND CKMLHD~BWKEY = GT_DATA_HEAD-PWERK
.
IF GT_DATA_HEAD-UDATE IS NOT INITIAL .
LV_DATUM = GT_DATA_HEAD-UDATE .
ELSE .
LV_DATUM = SY-DATUM .
ENDIF.
LOOP AT GT_CKMLCR.
LV_DATUA = GT_CKMLCR-BDATJ && GT_CKMLCR-POPER .
IF LV_DATUA(6) > LV_DATUM.
DELETE GT_CKMLCR .
ENDIF.
CLEAR GT_CKMLCR .
ENDLOOP.
SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
READ TABLE GT_CKMLCR INDEX 1 .
GT_DATA_HEAD-STPRS = GT_CKMLCR-STPRS .
GT_DATA_HEAD-VERPR = GT_CKMLCR-PVPRS .
GT_DATA_HEAD-VPRSV = GT_CKMLCR-VPRSV .
GT_DATA_HEAD-PEINH = GT_CKMLCR-PEINH .
IF GT_DATA_HEAD-VPRSV = 'V'.
* GT_DATA_HEAD-STPRS = GT_DATA_HEAD-ZPLP1 .
GT_DATA_HEAD-STPRS = GT_DATA_HEAD-VERPR .
ENDIF.
* FEVOR TYPE MARC-FEVOR, "生产管理员
* TXT TYPE T024F-TXT, "生产管理员描述
MODIFY GT_DATA_HEAD .
CLEAR GT_DATA_HEAD .
CLEAR GT_CKMLCR.
ENDLOOP.
DELETE GT_DATA_HEAD[] WHERE UDATE NOT IN S_UDATE .
* ENDIF.
IF GT_DATA_HEAD[] IS NOT INITIAL.
CLEAR GT_DATA_ITEM[].
SELECT
AFPO~PWERK
AFPO~VERID
AFPO~AUFNR
AFPO~MATNR
AFPO~PSMNG
* AFPO~WEMNG
AUFK~AUART
AUFK~OBJNR
MARA~EXTWG
RESB~MATNR AS MATNR_SUB
RESB~MEINS
RESB~AUSCH
RESB~BDMNG
RESB~RGEKZ
RESB~RSNUM
RESB~RSPOS
RESB~FMENG
RESB~SHKZG
RESB~STLNR
RESB~WERKS
RESB~ERFME
RESB~ERFMG
RESB~RSART
AFKO~FEVOR
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
FOR ALL ENTRIES IN GT_DATA_HEAD[]
WHERE AFPO~AUFNR = GT_DATA_HEAD-AUFNR
AND AFPO~PWERK = GT_DATA_HEAD-PWERK
AND AFPO~MATNR = GT_DATA_HEAD-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~EXTWG IN S_EXTWG
AND RESB~MATNR IN S_MATNS
AND ( RESB~XLOEK = '' OR RESB~ENMNG <> '0.000')
* AND RESB~MATNR = 'H218-1-P067.A000.X4'
* AND RESB~MATNR = 'RP-PA648-023.A001-T'
.
ENDIF.
DELETE GT_DATA_ITEM[] WHERE MATNR_SUB CS '-FU' .
CLEAR GT_DATA_ITEM_A[].
LOOP AT GT_DATA_ITEM WHERE MATNR_SUB CS '-XO'
OR MATNR_SUB CS '-X0'.
SELECT SINGLE STLNR INTO GT_DATA_ITEM_A-STLNR FROM MAST
WHERE MATNR = GT_DATA_ITEM-MATNR_SUB
AND WERKS = GT_DATA_ITEM-WERKS
.
APPEND GT_DATA_ITEM_A .
CLEAR GT_DATA_ITEM_A .
DELETE GT_DATA_ITEM .
CLEAR GT_DATA_ITEM .
ENDLOOP.
LOOP AT GT_DATA_ITEM.
READ TABLE GT_DATA_ITEM_A WITH KEY STLNR = GT_DATA_ITEM-STLNR .
IF SY-SUBRC = 0.
DELETE GT_DATA_ITEM .
ENDIF.
CLEAR GT_DATA_ITEM .
ENDLOOP.
GT_DATA_ITEM_C[] = GT_DATA_ITEM[].
SORT GT_DATA_ITEM_C[] BY AUFNR MATNR_SUB RSPOS FMENG .
DELETE ADJACENT DUPLICATES FROM GT_DATA_ITEM_C[] COMPARING AUFNR MATNR_SUB.
LOOP AT GT_DATA_ITEM_C.
*计划外发料数量
CLEAR GT_MSEG[] .
SELECT
MSEG~MENGE
MSEG~RSNUM
MSEG~RSPOS
MSEG~BWART
MSEG~AUFNR
MSEG~MBLNR
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
FROM MSEG
* INNER JOIN MATDOC
* ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
WHERE MSEG~BWART IN ( '261','262' )
* AND VGART_MKPF = 'WA'
* AND RSNUM = ''
AND MSEG~MATNR = GT_DATA_ITEM_C-MATNR_SUB
AND MSEG~AUFNR = GT_DATA_ITEM_C-AUFNR
* AND MSEG~RSART = GT_DATA_ITEM_C-RSART
* AND MATDOC~CANCELLED = ''
* AND MATDOC~SMBLN = ''
.
CLEAR GT_DATA_ITEM_C-MENGE_J .
LOOP AT GT_MSEG WHERE RSNUM = '' AND BWART = '261'.
GT_DATA_ITEM_C-MENGE_J = GT_DATA_ITEM_C-MENGE_J + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
CLEAR GT_DATA_ITEM_C-MENGE_T .
LOOP AT GT_MSEG WHERE RSNUM = '' AND BWART = '262'.
GT_DATA_ITEM_C-MENGE_T = GT_DATA_ITEM_C-MENGE_T + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
MODIFY GT_DATA_ITEM_C.
CLEAR GT_DATA_ITEM_C .
ENDLOOP.
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
.
CLEAR GT_DATA_HEAD .
READ TABLE GT_DATA_HEAD WITH KEY
AUFNR = GT_DATA_ITEM-AUFNR
PWERK = GT_DATA_ITEM-PWERK
MATNR = GT_DATA_ITEM-MATNR
.
* IF GT_DATA_ITEM-MATNR_SUB = 'KW0103-20.A001'.
* BREAK-POINT .
* ENDIF.
* IF GT_DATA_HEAD-UDATE IS NOT INITIAL AND GT_DATA_HEAD-UDATE(6) <> SY-DATUM(6).
CLEAR GT_CKMLCR[] .
SELECT
CKMLCR~KALNR
CKMLCR~BDATJ
CKMLCR~POPER
CKMLCR~UNTPER
CKMLCR~CURTP
CKMLCR~STPRS
CKMLCR~PVPRS
CKMLCR~VPRSV
CKMLCR~PEINH
INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR[]
FROM CKMLCR
INNER JOIN CKMLHD ON CKMLCR~KALNR = CKMLHD~KALNR
WHERE CKMLHD~MATNR = GT_DATA_ITEM-MATNR_SUB
AND CKMLHD~BWKEY = GT_DATA_ITEM-WERKS
.
IF GT_DATA_HEAD-UDATE IS NOT INITIAL .
LV_DATUM = GT_DATA_HEAD-UDATE .
GT_DATA_ITEM-UDATE = GT_DATA_HEAD-UDATE .
ELSE .
LV_DATUM = SY-DATUM .
ENDIF.
LOOP AT GT_CKMLCR.
LV_DATUA = GT_CKMLCR-BDATJ && GT_CKMLCR-POPER .
IF LV_DATUA(6) > LV_DATUM.
DELETE GT_CKMLCR .
ENDIF.
CLEAR GT_CKMLCR .
ENDLOOP.
SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
READ TABLE GT_CKMLCR INDEX 1 .
GT_DATA_ITEM-STPRS = GT_CKMLCR-STPRS .
GT_DATA_ITEM-VERPR = GT_CKMLCR-PVPRS .
GT_DATA_ITEM-VPRSV = GT_CKMLCR-VPRSV .
GT_DATA_ITEM-PEINH = GT_CKMLCR-PEINH .
IF GT_DATA_ITEM-VPRSV = 'V'.
* GT_DATA_ITEM-STPRS = GT_DATA_ITEM-ZPLP1 .
GT_DATA_ITEM-STPRS = GT_DATA_ITEM-VERPR .
ENDIF.
CLEAR GT_CKMLCR.
GT_DATA_ITEM-STAND = GT_DATA_HEAD-STAND .
GT_DATA_ITEM-STEXT = GT_DATA_HEAD-STEXT .
* a)判断基本单位RESB- MEINS(也就是报表单位这一列的值 ) 与 工单用料单位RESB- ERFME不一致时:
* 取出工单需求数RESB-ERFMG;
* 从表MARM根据子件编码+工单用料单位RESB- ERFME 取数计数器MARM-UMREZ 和 分母 MARM-UMREN;
* 计划数量 = (工单需求数RESB-ERFMG * 计数器MARM-UMREZ)除以 分母 MARM-UMREN
*
* b) 如两个单位一致时:
* 计划数量 = 工单需求数RESB-ERFMG
IF GT_DATA_ITEM-MEINS = GT_DATA_ITEM-ERFME.
GT_DATA_ITEM-BDMNG = GT_DATA_ITEM-ERFMG .
ELSE.
CLEAR GT_MARM.
SELECT SINGLE UMREZ UMREN INTO CORRESPONDING FIELDS OF GT_MARM FROM MARM
WHERE MATNR = GT_DATA_ITEM-MATNR_SUB
AND MEINH = GT_DATA_ITEM-ERFME.
IF SY-SUBRC = 0 AND GT_MARM-UMREN <> 0.
GT_DATA_ITEM-BDMNG = GT_DATA_ITEM-ERFMG * GT_MARM-UMREZ / GT_MARM-UMREN.
ENDIF.
ENDIF.
*MARM-UMREZ 和 分母 MARM-UMREN;
IF GT_DATA_ITEM-SHKZG = 'S'.
GT_DATA_ITEM-BDMNG = GT_DATA_ITEM-BDMNG * -1 .
ENDIF.
IF GT_DATA_ITEM-AUART = 'ZPP2' AND GT_DATA_ITEM-MATNR = GT_DATA_ITEM-MATNR_SUB .
GT_DATA_ITEM-AUSCH = 0.
ENDIF.
*不含损耗率的子件数量
IF 100 + GT_DATA_ITEM-AUSCH <> 0.
GT_DATA_ITEM-BOMYL = GT_DATA_ITEM-BDMNG / ( ( 100 + GT_DATA_ITEM-AUSCH ) / 100 ) .
ELSE .
GT_DATA_ITEM-BOMYL = GT_DATA_ITEM-BDMNG.
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.
*BOMYL 计算逻辑 在原基础上 乘以(交货数量WEMNG/工单数量PSMNG).
IF GT_DATA_ITEM-PSMNG <> 0.
GT_DATA_ITEM-BOMYL = GT_DATA_ITEM-BOMYL * GT_DATA_HEAD-WEMNG / GT_DATA_HEAD-PSMNG .
ENDIF.
IF GT_DATA_ITEM-SHKZG <> 'S'.
*预留发料数量
CLEAR GT_MSEG[] .
SELECT
MSEG~MENGE
MSEG~AUFNR
MSEG~MBLNR
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
FROM MSEG
* INNER JOIN MATDOC
* ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
WHERE MSEG~BWART = '261'
AND MSEG~RSNUM = GT_DATA_ITEM-RSNUM
AND MSEG~RSPOS = GT_DATA_ITEM-RSPOS
AND MSEG~MATNR = GT_DATA_ITEM-MATNR_SUB
AND MSEG~AUFNR = GT_DATA_ITEM-AUFNR
AND MSEG~RSART = GT_DATA_ITEM-RSART
* AND MATDOC~CANCELLED = ''
* AND MATDOC~SMBLN = ''
.
* SELECT T1~MENGE,T1~MJAHR,T1~ZEILE
* INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
* FROM MSEG AS T1
* WHERE T1~BWART = '261'
* AND T1~RSNUM = GT_DATA_ITEM-RSNUM
* AND T1~RSPOS = GT_DATA_ITEM-RSPOS
* AND T1~MATNR = GT_DATA_ITEM-MATNR_SUB
* AND T1~AUFNR = GT_DATA_ITEM-AUFNR
* AND NOT EXISTS ( SELECT * FROM MSEG AS T2
* WHERE T2~SJAHR = T1~MJAHR
* AND T2~SMBLN = T1~MBLNR
* AND T2~SMBLP = T1~ZEILE ).
CLEAR GT_DATA_ITEM-MENGE_J .
LOOP AT GT_MSEG .
GT_DATA_ITEM-MENGE_J = GT_DATA_ITEM-MENGE_J + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
*退料数量
CLEAR GT_MSEG[] .
SELECT
MSEG~MENGE
MSEG~AUFNR
MSEG~MBLNR
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
FROM MSEG
* INNER JOIN MATDOC
* ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
WHERE MSEG~BWART = '262'
AND MSEG~RSNUM = GT_DATA_ITEM-RSNUM
AND MSEG~RSPOS = GT_DATA_ITEM-RSPOS
AND MSEG~MATNR = GT_DATA_ITEM-MATNR_SUB
AND MSEG~AUFNR = GT_DATA_ITEM-AUFNR
AND MSEG~RSART = GT_DATA_ITEM-RSART
* AND MATDOC~CANCELLED = ''
* AND MATDOC~SMBLN = ''
.
LOOP AT GT_MSEG.
GT_DATA_ITEM-MENGT = GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
*计划外合并
READ TABLE GT_DATA_ITEM_C WITH KEY
AUFNR = GT_DATA_ITEM-AUFNR
MATNR_SUB = GT_DATA_ITEM-MATNR_SUB
RSPOS = GT_DATA_ITEM-RSPOS
.
CLEAR GT_DATA_ITEM-MENGE .
IF SY-SUBRC = 0.
GT_DATA_ITEM-MENGE_J = GT_DATA_ITEM-MENGE_J + GT_DATA_ITEM_C-MENGE_J.
GT_DATA_ITEM-MENGT = GT_DATA_ITEM-MENGT + GT_DATA_ITEM_C-MENGE_T.
GT_DATA_ITEM-MENGE = GT_DATA_ITEM_C-MENGE_J - GT_DATA_ITEM_C-MENGE_T .
ENDIF.
ELSE .
*预留发料数量
CLEAR GT_MSEG[] .
SELECT MSEG~MENGE
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
FROM MSEG
* INNER JOIN MATDOC
* ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
WHERE MSEG~BWART = '532'
* AND RSNUM = GT_DATA_ITEM-RSNUM
* AND RSPOS = GT_DATA_ITEM-RSPOS
AND MSEG~MATNR = GT_DATA_ITEM-MATNR_SUB
AND MSEG~AUFNR = GT_DATA_ITEM-AUFNR
AND MSEG~RSART = GT_DATA_ITEM-RSART
* AND MATDOC~CANCELLED = ''
* AND MATDOC~SMBLN = ''
.
CLEAR GT_DATA_ITEM-MENGE_J .
LOOP AT GT_MSEG .
GT_DATA_ITEM-MENGE_J = GT_DATA_ITEM-MENGE_J + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
*退料数量
CLEAR GT_MSEG[] .
SELECT MSEG~MENGE
INTO CORRESPONDING FIELDS OF TABLE GT_MSEG[]
FROM MSEG
* INNER JOIN MATDOC
* ON MSEG~MBLNR = MATDOC~MBLNR AND MSEG~MJAHR = MATDOC~MJAHR AND MSEG~ZEILE = MATDOC~ZEILE
WHERE MSEG~BWART = '531'
* AND RSNUM = GT_DATA_ITEM-RSNUM
* AND RSPOS = GT_DATA_ITEM-RSPOS
AND MSEG~MATNR = GT_DATA_ITEM-MATNR_SUB
AND MSEG~AUFNR = GT_DATA_ITEM-AUFNR
AND MSEG~RSART = GT_DATA_ITEM-RSART
* AND MATDOC~CANCELLED = ''
* AND MATDOC~SMBLN = ''
.
LOOP AT GT_MSEG.
GT_DATA_ITEM-MENGT = GT_DATA_ITEM-MENGT + GT_MSEG-MENGE .
CLEAR GT_MSEG .
ENDLOOP.
ENDIF.
DATA LV_AFKO TYPE AFKO .
DATA LV_AFVC TYPE AFVC .
DATA LV_CRHD TYPE CRHD .
CLEAR AFKO .
SELECT SINGLE * INTO LV_AFKO FROM AFKO
WHERE AUFNR = GT_DATA_ITEM-AUFNR
.
CLEAR LV_AFVC .
SELECT SINGLE * INTO LV_AFVC FROM AFVC
WHERE AUFPL = LV_AFKO-AUFPL
.
CLEAR LV_CRHD .
SELECT SINGLE * INTO LV_CRHD FROM CRHD
WHERE OBJID = LV_AFVC-ARBID
.
*实发数量(发料数量 - 退料数量)
GT_DATA_ITEM-ZSFSL = GT_DATA_ITEM-MENGE_J - GT_DATA_ITEM-MENGT .
*发放差异(实际VS 计划)
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 * 100 / GT_DATA_ITEM-BDMNG .
GT_DATA_ITEM-ZCYBLT = GT_DATA_ITEM-ZCYBL && '%' .
ENDIF.
*产值
* GT_DATA_ITEM-ZGDCZ = GT_DATA_ITEM-PSMNG * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.
IF LV_CRHD-ARBPL <> 'H001S'.
*实际子件报废数量
GT_DATA_ITEM-SZJBS = GT_DATA_ITEM-ZSFSL - GT_DATA_ITEM-BOMYL .
ENDIF.
*标准报废数
GT_DATA_ITEM-BZBFS = GT_DATA_ITEM-AUSCH * '0.01' * GT_DATA_ITEM-BOMYL .
IF GT_DATA_ITEM-SZJBS <= GT_DATA_ITEM-BZBFS.
*正常报废数
GT_DATA_ITEM-ZCBFS = GT_DATA_ITEM-SZJBS .
ELSE .
*正常报废数
GT_DATA_ITEM-ZCBFS = GT_DATA_ITEM-BZBFS .
*异常报废数
GT_DATA_ITEM-YCBFS = GT_DATA_ITEM-SZJBS - GT_DATA_ITEM-BZBFS .
ENDIF.
IF LV_CRHD-ARBPL = 'H001S'.
CLEAR GT_DATA-ZCBFS .
CLEAR GT_DATA-YCBFS .
ENDIF.
*正常报废金额
GT_DATA_ITEM-ZCBFJ = GT_DATA_ITEM-ZCBFS * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.
* IF GT_DATA_ITEM-ZCBFJ < 0.
* CLEAR GT_DATA_ITEM-ZCBFJ .
* ENDIF.
*异常报废金额
GT_DATA_ITEM-YCBFJ = GT_DATA_ITEM-YCBFS * GT_DATA_ITEM-STPRS / GT_DATA_ITEM-PEINH.
* IF GT_DATA_ITEM-YCBFJ < 0.
* CLEAR GT_DATA_ITEM-YCBFJ .
* ENDIF.
*报废金额小计
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.
* IF GT_DATA_ITEM-SZJBS < 0.
* CLEAR GT_DATA_ITEM-SZJBS .
* ENDIF.
*实际子件报废率-数量计
IF GT_DATA_ITEM-BOMYL <> 0.
IF GT_DATA_ITEM-AUART = 'ZPP2' AND GT_DATA_ITEM-MATNR = GT_DATA_ITEM-MATNR_SUB .
GT_DATA_ITEM-SZJBF = 0 .
GT_DATA_ITEM-AUSCHT = 0 .
ELSE.
GT_DATA_ITEM-SZJBF = GT_DATA_ITEM-SZJBS * 100 / GT_DATA_ITEM-BOMYL .
GT_DATA_ITEM-AUSCHT = GT_DATA_ITEM-AUSCH && '%' .
ENDIF.
GT_DATA_ITEM-SZJBFT = GT_DATA_ITEM-SZJBF && '%' .
ENDIF.
SELECT SINGLE EWBEZ INTO GT_DATA_ITEM-VTEXT FROM TWEWT
WHERE EXTWG = GT_DATA_ITEM-EXTWG
.
IF GT_DATA_ITEM-SHKZG = 'S'.
CLEAR GT_DATA_ITEM-MENGT .
ENDIF.
* GT_DATA_ITEM-AUSCHT = GT_DATA_ITEM-AUSCH && '%' .
* SELECT SINGLE FEVOR INTO GT_DATA_ITEM-FEVOR FROM MARC
* WHERE MATNR = GT_DATA_ITEM-MATNR
* AND WERKS = GT_DATA_ITEM-PWERK
* .
SELECT SINGLE TXT INTO GT_DATA_ITEM-TXT FROM T024F
WHERE WERKS = GT_DATA_ITEM-PWERK
AND FEVOR = GT_DATA_ITEM-FEVOR
.
MODIFY GT_DATA_ITEM .
CLEAR GT_DATA_ITEM .
ENDLOOP.
*炮筒料处理
DELETE GT_DATA_ITEM[] WHERE FMENG IS NOT INITIAL AND ZSFSL IS INITIAL .
* LOOP AT GT_DATA_HEAD.
* CLEAR GT_DATA_HEAD-BFJEJ.
* CLEAR GT_DATA_HEAD-ZCBFJ.
* CLEAR GT_DATA_HEAD-YCBFJ.
* CLEAR GT_DATA_HEAD-ZGDCZ.
* LOOP AT GT_DATA_ITEM WHERE PWERK = GT_DATA_HEAD-PWERK AND MATNR = GT_DATA_HEAD-MATNR AND AUFNR = GT_DATA_HEAD-AUFNR.
* GT_DATA_HEAD-BFJEJ = GT_DATA_HEAD-BFJEJ + GT_DATA_ITEM-BFJEJ .
* GT_DATA_HEAD-ZCBFJ = GT_DATA_HEAD-ZCBFJ + GT_DATA_ITEM-ZCBFJ .
* GT_DATA_HEAD-YCBFJ = GT_DATA_HEAD-YCBFJ + GT_DATA_ITEM-YCBFJ .
** GT_DATA_HEAD-ZGDCZ = GT_DATA_HEAD-ZGDCZ + GT_DATA_ITEM-ZGDCZ .
* CLEAR GT_DATA_ITEM .
* ENDLOOP.
*
**产值:交货数量 * 单价 / 价格单位
* GT_DATA_HEAD-ZGDCZ = GT_DATA_HEAD-WEMNG * GT_DATA_HEAD-STPRS / GT_DATA_HEAD-PEINH .
*
**正常报废率-产值计
* IF GT_DATA_HEAD-ZGDCZ <> 0.
* GT_DATA_HEAD-ZCBFL = GT_DATA_HEAD-ZCBFJ * 100 / GT_DATA_HEAD-ZGDCZ .
* GT_DATA_HEAD-ZCBFL_T = GT_DATA_HEAD-ZCBFL && '%' .
* ENDIF.
*
**异常报废率-产值计
* IF GT_DATA_HEAD-ZGDCZ <> 0.
* GT_DATA_HEAD-YCBFL = GT_DATA_HEAD-YCBFJ * 100 / GT_DATA_HEAD-ZGDCZ .
* GT_DATA_HEAD-YCBFL_T = GT_DATA_HEAD-YCBFL && '%' .
* ENDIF.
*
* MODIFY GT_DATA_HEAD .
* CLEAR GT_DATA_HEAD .
* 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_ITEM[] BY EXTWG .
* APPEND LINES OF GT_DATA_ITEM[] TO GT_DATA[] .
* DELETE ADJACENT DUPLICATES FROM GT_DATA[] COMPARING EXTWG.
*
* LOOP AT GT_DATA.
* CLEAR GT_DATA-GMNGA .
* CLEAR GT_DATA-WEMNG .
* 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-ZCBFL_T.
* CLEAR GT_DATA-YCBFL .
* CLEAR GT_DATA-YCBFL_T.
* CLEAR GT_DATA-SZJBF .
* CLEAR GT_DATA-SZJBFT .
* CLEAR GT_DATA-ZCYBL .
* CLEAR GT_DATA-ZCYBLT .
* CLEAR GT_DATA-PSMNG .
*
* LOOP AT GT_DATA_ITEM WHERE EXTWG = GT_DATA-EXTWG.
*
* 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.
*
* LOOP AT GT_DATA_HEAD WHERE EXTWG = GT_DATA-EXTWG .
* GT_DATA-WEMNG = GT_DATA-WEMNG + GT_DATA_HEAD-WEMNG .
* GT_DATA-PSMNG = GT_DATA-PSMNG + GT_DATA_HEAD-PSMNG .
* GT_DATA-ZCBFJ = GT_DATA-ZCBFJ + GT_DATA_HEAD-ZCBFJ .
* GT_DATA-YCBFJ = GT_DATA-YCBFJ + GT_DATA_HEAD-YCBFJ .
* GT_DATA-ZGDCZ = GT_DATA-ZGDCZ + GT_DATA_HEAD-ZGDCZ .
* ENDLOOP.
*
* GT_DATA-ZITEM = '系 列 小 计' .
*
**正常报废率-产值计
* IF GT_DATA-ZGDCZ <> 0.
* GT_DATA-ZCBFL = GT_DATA-ZCBFJ * 100 / GT_DATA-ZGDCZ .
* GT_DATA-ZCBFL_T = GT_DATA-ZCBFL && '%' .
* ENDIF.
*
**异常报废率-产值计
* IF GT_DATA-ZGDCZ <> 0.
* GT_DATA-YCBFL = GT_DATA-YCBFJ * 100 / GT_DATA-ZGDCZ .
* GT_DATA-YCBFL_T = GT_DATA-YCBFL && '%' .
* ENDIF.
*
**实际子件报废率-数量计
* IF GT_DATA-BOMYL <> 0.
*
* IF GT_DATA-AUART = 'ZPP2' AND GT_DATA-MATNR = GT_DATA-MATNR_SUB .
* GT_DATA-SZJBF = 0 .
* ELSE.
* GT_DATA-SZJBF = GT_DATA-SZJBS * 100 / GT_DATA-BOMYL .
* ENDIF.
*
* GT_DATA-SZJBFT = GT_DATA-SZJBF && '%' .
* ENDIF.
*
**差异比例
* IF GT_DATA-BDMNG <> 0.
* GT_DATA-ZCYBL = GT_DATA-ZFFCY * 100 / GT_DATA-BDMNG .
* GT_DATA-ZCYBLT = GT_DATA-ZCYBL && '%' .
* ENDIF.
*
* MODIFY GT_DATA .
* CLEAR GT_DATA .
* ENDLOOP.
*
* ENDIF.
LOOP AT GT_DATA .
IF GT_DATA-AUART = 'ZPP2'.
CLEAR GT_DATA-ZGDCZ.
ENDIF.
*以ZPPR015字段“子件项目号”为CKMLHD-MATNR +“子件工厂”为CKMLHD-BWKEY得到KALNR。
*再以KALNR+"工单TECO日期">=OPER到CKMLCR得到最近价格CKMLCR-STPRS,CKMLCR-STPRS除以CKMLCR-PEINH算出单个价格
*如果上述都取价失败,取MBEW-VERPR移动均价;
CLEAR LV_CKMLHD .
SELECT SINGLE * INTO LV_CKMLHD FROM CKMLHD
WHERE MATNR = GT_DATA-MATNR_SUB
AND BWKEY = GT_DATA-WERKS
.
CLEAR GT_CKMLCR[] .
SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_CKMLCR FROM CKMLCR
WHERE KALNR = LV_CKMLHD-KALNR
AND BDATJ <= GT_DATA-UDATE(4)
AND POPER <= GT_DATA-UDATE+4(2)
.
SORT GT_CKMLCR[] BY BDATJ DESCENDING POPER DESCENDING .
READ TABLE GT_CKMLCR INDEX 1 .
GT_DATA-ZJHDJ = GT_CKMLCR-STPRS / GT_CKMLCR-PEINH .
IF GT_DATA-ZJHDJ IS INITIAL .
CLEAR LV_MBEW .
SELECT SINGLE * INTO LV_MBEW FROM MBEW
WHERE MATNR = GT_DATA-MATNR_SUB
AND BWKEY = GT_DATA-WERKS
AND ZPLD1 <= GT_DATA-UDATE
.
IF LV_MBEW-ZPLP1 IS NOT INITIAL .
GT_DATA-ZJHDJ = LV_MBEW-VERPR.
ENDIF.
ENDIF.
IF GT_DATA-MATNR_SUB IS NOT INITIAL.
* 目标成本=目标用量(不含废品率)*(1+损耗率基准)*单价
GT_DATA-SOLLKOST = GT_DATA-BOMYL * ( 1 + GT_DATA-AUSCH ) * GT_DATA-ZJHDJ .
* 目标成本(不含废品率)=目标用量(不含废品率)*单价
GT_DATA-SOLLKOSTL = GT_DATA-BOMYL * GT_DATA-ZJHDJ .
ENDIF.
SELECT SINGLE MTART INTO GT_DATA-MTART FROM MARA
WHERE MATNR = GT_DATA-MATNR_SUB
.
* 'PWERK' '工厂',
* 'AUFNR' '工单号',
* 'VERID' '生产版本',
* 'EXTWG' '系列',
* 'VTEXT' '系列描述',
* 'MATNR' '成品项目号',
* 'MAKTX' '项目号说明',
* 'FEVOR' '生产管理员',
* 'TXT' '生产管理员描述',
* 'RSNUM' '预留号',
* 'RSPOS' '预留项目',
* 'FMENG' '固定数量',
* 'MATNR_SUB' '子件项目号',
* 'MAKTX_SUB' '子件项目号说明',
* 'WERKS' '子件工厂',
* 'MEINS' '单位',
* 'PSMNG' '工单数量',
* 'WEMNG' '交货数量',
* 'GSTRI' '工单第一次报工日期',
* 'GLTRI' '工单入库完成日期',
* 'UDATE' '工单TECO日期',
*
** 'GMNGA' '确认数量',
** 'STPRS' '单价',
** 'PEINH' '价格单位',
* 'ZCBFL_T' '正常报废率-产值计',
* 'YCBFL_T' '异常报废率-产值计',
* 'SZJBFT' '实际子件报废率-数量计',
* 'SZJBS' '实际子件报废数量',
* 'ZCBFS' '正常报废数',
* 'YCBFS' '异常报废数',
* 'BFJEJ' '报废金额小计',
* 'ZCBFJ' '正常报废金额',
* 'YCBFJ' '异常报废金额',
* 'ZGDCZ' '产值',
* 'AUSCHT' '损耗率基准',
* 'BOMYL' '目标用量(不含废品率)',
* 'BOMBZ' '各子件用量(不含废品率)',
* 'BDMNG' '计划数量',
* 'MENGE' '超领数量(实际VS 计划)',
* 'MENGT' '退料数量',
* 'ZSFSL' '实发数量',
* 'ZFFCY' '发放差异(实际VS 计划)',
* 'ZCYBLT' '差异比例',
* 'STTXT' '工单状态',
* 'ZTTXT' '自定义用户状态',
* 'RGEKZ' '反冲',
* 'AUART' '工单类型',
* 'ZADD1' '原因分析',
* 'ZADD2' '改善措施',
* 'ZADD3' 'CAR编号',
* 'STAND' '单号-管理部门成本中心',
* 'STEXT' '管理部门',
* 'ZADD4' '责任人',
* 'ZADD5' '担当人',
* 'FLAG' '抬头行'.
MODIFY GT_DATA .
CLEAR GT_DATA .
ENDLOOP.
ENDIF.
DELETE GT_DATA[] WHERE STAND NOT IN S_STAND .
IF CH_01 IS NOT INITIAL.
DELETE GT_DATA[] WHERE MTART <> 'Z004' .
ENDIF.
IF CH_02 IS NOT INITIAL.
DELETE GT_DATA[] WHERE MENGE <= 0 .
ENDIF.
IF CH_03 IS NOT INITIAL.
DELETE GT_DATA[] WHERE MENGE >= 0 .
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' '工单号',
'VERID' '生产版本',
'EXTWG' '系列',
'VTEXT' '系列描述',
'MATNR' '成品项目号',
'MAKTX' '项目号说明',
'FEVOR' '生产管理员',
'TXT' '生产管理员描述',
'RSNUM' '预留号',
'RSPOS' '预留项目',
'FMENG' '固定数量',
'MTART' '子件物料类型',
'MATNR_SUB' '子件项目号',
'MAKTX_SUB' '子件项目号说明',
'WERKS' '子件工厂',
'MEINS' '单位',
'PSMNG' '工单数量',
'WEMNG' '交货数量',
'GSTRI' '工单第一次报工日期',
'GLTRI' '工单入库完成日期',
'UDATE' '工单TECO日期',
* 'GMNGA' '确认数量',
* 'STPRS' '单价',
* 'PEINH' '价格单位',
'ZCBFL_T' '正常报废率-产值计',
'YCBFL_T' '异常报废率-产值计',
'SZJBFT' '实际子件报废率-数量计',
'SZJBS' '实际子件报废数量',
'ZCBFS' '正常报废数',
'YCBFS' '异常报废数',
'BFJEJ' '报废金额小计',
'ZCBFJ' '正常报废金额',
'YCBFJ' '异常报废金额',
'ZGDCZ' '产值',
'AUSCHT' '损耗率基准',
'BOMYL' '目标用量(不含废品率)',
'BOMBZ' '各子件用量(不含废品率)',
'BDMNG' '计划数量',
'MENGE' '超领数量(实际VS 计划)',
'MENGT' '退料数量',
'ZSFSL' '实发数量',
'ZFFCY' '发放差异(实际VS 计划)',
'ZCYBLT' '差异比例',
'STTXT' '工单状态',
'ZTTXT' '自定义用户状态',
'RGEKZ' '反冲',
'AUART' '工单类型',
'ZADD1' '原因分析',
'ZADD2' '改善措施',
'ZADD3' 'CAR编号',
'STAND' '单号-管理部门成本中心',
'STEXT' '管理部门',
'ZADD4' '责任人',
'ZADD5' '担当人',
'SOLLKOST' '目标成本',
'SOLLKOSTL' '目标成本(不含废品率)'.
* 'FLAG' '抬头行'.
* ELSE .
* FILL_FIELD :
* 'ZITEM' '项 目',
* 'EXTWG' '系列',
* 'VTEXT' '系列描述',
* 'PSMNG' '工单数量',
* 'WEMNG' '交货数量',
** 'GMNGA' '确认数量',
* 'ZCBFL_T' '正常报废率-产值计',
* 'YCBFL_T' '异常报废率-产值计',
* 'SZJBFT' '实际子件报废率-数量计',
* 'SZJBS' '实际子件报废数量',
* 'ZCBFS' '正常报废数',
* 'YCBFS' '异常报废数',
* 'BFJEJ' '报废金额小计',
* 'ZCBFJ' '正常报废金额',
* 'YCBFJ' '异常报废金额',
* 'ZGDCZ' '产值',
* 'BOMYL' '订单BOM用量',
* 'BDMNG' '计划数量',
* 'MENGE' '超领数量(实际VS 计划)',
* 'MENGT' '退料数量',
* 'ZSFSL' '实发数量',
* 'GSTRI' '工单第一次报工日期',
* 'GLTRI' '工单入库完成日期',
* 'UDATE' '工单TECO日期',
* 'STAND' '单号-管理部门成本中心',
* 'STEXT' '管理部门',
* 'ZFFCY' '发放差异(实际VS 计划)',
* 'SOLLKOST' '目标成本',
* 'SOLLKOSTL' '目标成本(不含废品率)',
* 'ZCYBLT' '差异比例'.
*
*
* 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'."表示双击
IF IS_SELFIELD-FIELDNAME = 'AUFNR' .
CHECK IS_SELFIELD-TABINDEX > 0.
CLEAR GT_DATA .
READ TABLE GT_DATA INDEX IS_SELFIELD-TABINDEX.
SET PARAMETER ID 'ANR' FIELD GT_DATA-AUFNR.
CALL TRANSACTION 'CO03' AND SKIP FIRST SCREEN.
ELSE .
MESSAGE '请选择有效字段!'TYPE 'S' DISPLAY LIKE 'W'.
ENDIF .
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.