*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2019-05-23
*& Program Type : Report
*& Description : 标准成本明细报表
*&---------------------------------------------------------------------*
REPORT ZFIR127.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:MARA,STKO,MARC,STPO,MAST,STKOB,KEKO.
TYPE-POOLS:SLIS,T001W.
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA:TOPMAT LIKE CSTMAT .
DATA:DSTST LIKE CSDATA-XFELD .
DATA:STB LIKE STPOX OCCURS 0 WITH HEADER LINE .
DATA:MATCAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE .
DATA:GT_MARD LIKE MARD OCCURS 0 WITH HEADER LINE .
DATA:GT_MSKA LIKE MSKA OCCURS 0 WITH HEADER LINE .
DATA:E_MT61D LIKE MT61D .
DATA:E_MDKP LIKE MDKP .
DATA:MDPSX LIKE MDPS OCCURS 0 WITH HEADER LINE .
DATA:MDEZX LIKE MDEZ OCCURS 0 WITH HEADER LINE .
DATA:MDSUX LIKE MDSU OCCURS 0 WITH HEADER LINE .
DATA:MRP_ITEMS LIKE BAPI_MRP_ITEMS OCCURS 0 WITH HEADER LINE .
DATA:MRP_IND_LINES LIKE BAPI_MRP_IND_LINES OCCURS 0 WITH HEADER LINE .
TYPES: BEGIN OF GTS_DATA,
WERKS TYPE STPOX-WERKS, "供货工厂
WERKS_C TYPE STPOX-WERKS, "工厂
WERKS_F TYPE STPOX-WERKS, "工厂
TTIDX TYPE STPOX-TTIDX, "在类别表内的索引
MATNR TYPE CSCMAT-MATNR, "父项物料
MATNR_F TYPE CSCMAT-MATNR, "父项物料
MAKTX TYPE MAKT-MAKTX, "描述
STLAN TYPE STPOX-STLAN, "BOM用途
STLAL TYPE STPOX-STLAL, "可选BOM
BMENG TYPE STKO-BMENG, "基本数量
STUFE TYPE STPOX-STUFE, "层次
STUSX TYPE CHAR20, "层次
POSNR TYPE STPOX-POSNR, "项目号
IDNRK TYPE STPOX-IDNRK, "子项物料
OJTXP TYPE STPOX-OJTXP, "描述
MNGLG TYPE ZCURR01, "BOM用量
MNGBF TYPE ZCURR01, "含报废率用量
MMEIN TYPE STPOX-MMEIN, "单位
VPRSV TYPE MBEW-VPRSV, "价格控制
AUSCH TYPE STPOX-AUSCH, "组件报废
WERTN_CL TYPE ZCURR01, "材料
WERTN_RG TYPE ZCURR01, "人工
WERTN_JQ TYPE ZCURR01, "机器
WERTN_WX TYPE ZCURR01, "外协
WERTN_HJ TYPE ZCURR01, "成本合计
CELLCOLOR TYPE LVC_T_SCOL, "单元格颜色
END OF GTS_DATA.
TYPES: BEGIN OF GTS_RUN,
WERTN TYPE CKIS-WERTN, "供货工厂
LSTAR TYPE CKIS-LSTAR, "工厂
TYPPS TYPE CKIS-TYPPS, "工厂
LOSGR TYPE KEKO-LOSGR, "在类别表内的索引
END OF GTS_RUN.
DATA: GT_DATA TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GT_RUN TYPE TABLE OF GTS_RUN WITH HEADER LINE.
DATA: GT_DATA_A TYPE TABLE OF GTS_DATA WITH HEADER LINE.
DATA: GV_TOP TYPE SDYDO_TEXT_ELEMENT.
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS: S_KLVAR FOR KEKO-KLVAR DEFAULT 'ZPC1' .
SELECT-OPTIONS: S_WERKS FOR MARC-WERKS MODIF ID C1 . "工厂
SELECT-OPTIONS: S_MATNR FOR MARC-MATNR MODIF ID C1 . "物料
PARAMETERS: P_KADAT LIKE KEKO-KADAT OBLIGATORY. "成本核算日期起于
SELECTION-SCREEN END OF BLOCK B1.
*&---------------------------------------------------------------------*
*& Form SCREEN_SETTING
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM SCREEN_SETTING .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_GETDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_GETDATA .
DATA : BEGIN OF USEDTAB OCCURS 100.
INCLUDE STRUCTURE STPOV.
DATA : END OF USEDTAB.
DATA : BEGIN OF EQUICAT OCCURS 100.
INCLUDE STRUCTURE CSCEQUI.
DATA : END OF EQUICAT.
DATA : BEGIN OF KNDCAT OCCURS 100.
INCLUDE STRUCTURE CSCKND.
DATA : END OF KNDCAT.
DATA : BEGIN OF MATCAT OCCURS 100.
INCLUDE STRUCTURE CSCMAT.
DATA : END OF MATCAT.
DATA : BEGIN OF STDCAT OCCURS 100.
INCLUDE STRUCTURE CSCSTD.
DATA : END OF STDCAT.
DATA : BEGIN OF TPLCAT OCCURS 100.
INCLUDE STRUCTURE CSCTPL.
DATA : END OF TPLCAT.
DATA LV_KADAT_L TYPE KEKO-KADAT .
DATA LV_KADAT_H TYPE KEKO-KADAT .
LV_KADAT_L = P_KADAT(6) && '01'.
LV_KADAT_H = P_KADAT(6) && '26'.
LV_KADAT_H = LV_KADAT_H + 7.
LV_KADAT_H = LV_KADAT_H(6) && '01'.
LV_KADAT_H = LV_KADAT_H - 1.
DATA GT_KEKO TYPE TABLE OF KEKO WITH HEADER LINE .
DATA GT_MARC TYPE TABLE OF MARC WITH HEADER LINE .
DATA GT_CKIS TYPE TABLE OF CKIS WITH HEADER LINE .
DATA GT_MBEW TYPE TABLE OF MBEW WITH HEADER LINE .
DATA GS_MAST TYPE MAST .
DATA LV_STUFE TYPE STPOX-STUFE .
DATA LV_SUBRC TYPE SYST-SUBRC .
DATA LV_TABIX TYPE SYST-TABIX .
CLEAR GT_MARC[].
SELECT MATNR WERKS INTO CORRESPONDING FIELDS OF TABLE GT_MARC[] FROM MARC
WHERE WERKS IN S_WERKS
AND MATNR IN S_MATNR
.
CLEAR GT_DATA[].
LOOP AT GT_MARC .
CLEAR STB[] .
CLEAR MATCAT[] .
CLEAR TOPMAT .
CLEAR DSTST .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01'
DATUV = SY-DATUM "通常为系统的当前日期
MTNRV = GT_MARC-MATNR "要展开BOM的物料
MEHRS = 'X' " x表示多层展开﹐space表示只展开第一层
WERKS = GT_MARC-WERKS "工厂
STLAL = '1'
RNDKZ = '1'
IMPORTING
TOPMAT = TOPMAT
DSTST = DSTST
TABLES
STB = STB "展开的BOM存放在该内表
MATCAT = MATCAT "下面含有元件的物料存放在该内表
EXCEPTIONS
ALT_NOT_FOUND = 1
CALL_INVALID = 2
MATERIAL_NOT_FOUND = 3
MISSING_AUTHORIZATION = 4
NO_BOM_FOUND = 5
NO_PLANT_DATA = 6
NO_SUITABLE_BOM_FOUND = 7
CONVERSION_ERROR = 8
OTHERS = 9.
*----------------------------------------------------------------------------------------------<
GT_DATA-WERKS = GT_MARC-WERKS .
GT_DATA-IDNRK = GT_MARC-MATNR .
GT_DATA-MATNR = GT_MARC-MATNR .
GT_DATA-STUSX = 'TOP' .
SELECT SINGLE MEINS INTO GT_DATA-MMEIN FROM MARA
WHERE MATNR = GT_DATA-TTIDX.
SELECT SINGLE MAKTX INTO GT_DATA-OJTXP FROM MAKT
WHERE MATNR = GT_DATA-MATNR
.
APPEND GT_DATA .
CLEAR GT_DATA .
*----------------------------------------------------------------------------------------------<
LOOP AT STB WHERE SANKA IS NOT INITIAL .
GT_DATA-WERKS_C = GT_MARC-WERKS .
GT_DATA-WERKS = STB-WERKS .
GT_DATA-TTIDX = STB-TTIDX .
GT_DATA-MATNR = GT_MARC-MATNR .
GT_DATA-STLAN = STB-STLAN .
GT_DATA-STUFE = STB-STUFE .
GT_DATA-POSNR = STB-POSNR .
GT_DATA-IDNRK = STB-IDNRK .
GT_DATA-OJTXP = STB-OJTXP .
GT_DATA-MNGLG = STB-MNGLG .
GT_DATA-MMEIN = STB-MMEIN .
GT_DATA-AUSCH = STB-AUSCH .
* GT_DATA-MATKL = STB-MATKL .
APPEND GT_DATA .
CLEAR GT_DATA .
CLEAR STB .
ENDLOOP.
CLEAR GT_MARC .
ENDLOOP.
GT_DATA_A[] = GT_DATA[].
LOOP AT GT_DATA.
DO GT_DATA-STUFE TIMES.
GT_DATA-STUSX = GT_DATA-STUSX && '.'.
ENDDO.
GT_DATA-STUSX = GT_DATA-STUSX && GT_DATA-STUFE.
*验证物料是否有BOM
SELECT SINGLE BMENG INTO GT_DATA-BMENG FROM STKO
WHERE STLTY = STB-STLTY
AND STLNR = STB-STLNR
AND STLAL = STB-STLAL
.
SELECT SINGLE MAKTX INTO GT_DATA-MAKTX FROM MAKT
WHERE MATNR = GT_DATA-MATNR
.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF GS_MAST FROM MAST
WHERE MATNR = GT_DATA-IDNRK
AND WERKS = GT_DATA-WERKS
* AND STLAN = GT_DATA-STLAN
.
IF SY-SUBRC = 0.
* KEKO 和 CKIS 连起来
*BOM展开,取 TYPPS = E 的金额 WERTN / LOSGR 。判断活动类型 LSTAR = 1000 ,
*金额填到“人工”列,如果LSTAR=2000,金额填到“机器”列;
*BOM展开,取 TYPPS = L 的金额 WERTN / LOSGR 。金额填到“ 外协 ”列;
CLEAR GT_RUN[].
SELECT
KEKO~LOSGR
CKIS~WERTN
CKIS~LSTAR
CKIS~TYPPS
INTO CORRESPONDING FIELDS OF TABLE GT_RUN[]
FROM CKIS
INNER JOIN KEKO ON CKIS~BZOBJ = KEKO~BZOBJ
AND CKIS~KALNR = KEKO~KALNR
AND CKIS~KALKA = KEKO~KALKA
AND CKIS~KADKY = KEKO~KADKY
AND CKIS~TVERS = KEKO~TVERS
AND CKIS~BWVAR = KEKO~BWVAR
AND CKIS~KKZMA = KEKO~KKZMA
WHERE KEKO~KADAT >= LV_KADAT_L
AND KEKO~KADAT <= LV_KADAT_H
AND KEKO~BWKEY = GT_DATA-WERKS
AND KEKO~MATNR = GT_DATA-IDNRK
AND CKIS~LSTAR IN ( '1000' , '2000' )
AND CKIS~TYPPS IN ( 'E' , 'L' )
AND KEKO~KLVAR IN S_KLVAR
.
CLEAR GT_KEKO.
SELECT SINGLE * INTO CORRESPONDING FIELDS OF GT_KEKO FROM KEKO
WHERE MATNR = GT_DATA-IDNRK
AND BWKEY = GT_DATA-WERKS
.
*BOM用量、BOM用量(含损耗)现在的基础上除以LOSGR
IF GT_RUN-LOSGR <> 0.
GT_DATA-MNGLG = GT_DATA-MNGLG / GT_RUN-LOSGR.
ENDIF.
LOOP AT GT_RUN.
IF GT_RUN-TYPPS = 'E'.
IF GT_RUN-LSTAR = '1000'. "人工
IF GT_RUN-LOSGR <> 0.
GT_DATA-WERTN_RG = GT_DATA-WERTN_RG + ( GT_RUN-WERTN / GT_RUN-LOSGR ) .
ENDIF.
ELSEIF GT_RUN-LSTAR = '2000'."机器
IF GT_RUN-LOSGR <> 0.
GT_DATA-WERTN_JQ = GT_DATA-WERTN_JQ + ( GT_RUN-WERTN / GT_RUN-LOSGR ) .
ENDIF.
ENDIF.
ELSEIF GT_RUN-TYPPS = 'L'.
IF GT_RUN-LOSGR <> 0.
GT_DATA-WERTN_WX = GT_DATA-WERTN_WX + ( GT_RUN-WERTN / GT_RUN-LOSGR ) .
ENDIF.
ENDIF.
CLEAR GT_RUN.
ENDLOOP.
ELSE.
* CALL FUNCTION 'CS_WHERE_USED_MAT'
* EXPORTING
* DATUB = SY-DATUM
* DATUV = SY-DATUM
* MATNR = GT_DATA-IDNRK
* WERKS = GT_DATA-WERKS
* STLTP = 'M'
* TABLES
* WULTB = USEDTAB
* EQUICAT = EQUICAT
* KNDCAT = KNDCAT
* MATCAT = MATCAT
* STDCAT = STDCAT
* TPLCAT = TPLCAT
* EXCEPTIONS
* CALL_INVALID = 1
* MATERIAL_NOT_FOUND = 2
* NO_WHERE_USED_REC_FOUND = 3
* NO_WHERE_USED_REC_SELECTED = 4
* NO_WHERE_USED_REC_VALID = 5
* OTHERS = 6.
*
* LOOP AT USEDTAB WHERE POSTP NE 'F' AND ( SUMFG = ' ' OR SUMFG = 'x' ) .
* GT_DATA-MATNR_F = USEDTAB-MATNR .
* GT_DATA-WERKS_F = USEDTAB-WERKS .
* EXIT.
* CLEAR USEDTAB.
* ENDLOOP.
*
* REFRESH : USEDTAB,EQUICAT,KNDCAT,MATCAT,STDCAT,TPLCAT.
*取上层物料
LV_TABIX = SY-TABIX .
CLEAR LV_STUFE.
CLEAR LV_SUBRC.
WHILE ( LV_STUFE <> GT_DATA-STUFE - 1 OR LV_STUFE IS INITIAL ) AND LV_TABIX <> 1.
CLEAR GT_DATA_A.
LV_TABIX = LV_TABIX - 1.
READ TABLE GT_DATA_A INDEX LV_TABIX .
LV_STUFE = GT_DATA_A-STUFE .
ENDWHILE.
GT_DATA-MATNR_F = GT_DATA_A-IDNRK .
*BOM展开,对于没有BOM的物料,TYPPS <> E 且 TYPPS <> L,取的金额 WERTN / LOSGR 。
*其中物料是 MATNR 、工厂 BWKEY 、金额是 WERTN 、成本核算批量 LOSGR 。金额填到列“材料”;
CLEAR GT_RUN[].
SELECT
KEKO~LOSGR
CKIS~WERTN
CKIS~LSTAR
CKIS~TYPPS
INTO CORRESPONDING FIELDS OF TABLE GT_RUN[]
FROM CKIS
INNER JOIN KEKO ON CKIS~BZOBJ = KEKO~BZOBJ
AND CKIS~KALNR = KEKO~KALNR
AND CKIS~KALKA = KEKO~KALKA
AND CKIS~KADKY = KEKO~KADKY
AND CKIS~TVERS = KEKO~TVERS
AND CKIS~BWVAR = KEKO~BWVAR
AND CKIS~KKZMA = KEKO~KKZMA
WHERE KEKO~KADAT >= LV_KADAT_L
AND KEKO~KADAT <= LV_KADAT_H
AND KEKO~BWKEY = GT_DATA-WERKS
AND KEKO~MATNR = GT_DATA_A-IDNRK
AND CKIS~MATNR = GT_DATA-IDNRK
AND CKIS~TYPPS <> 'E'
AND CKIS~TYPPS <> 'L'
AND KEKO~KLVAR IN S_KLVAR
.
LOOP AT GT_RUN.
IF GT_RUN-LOSGR <> 0. "材料
GT_DATA-WERTN_CL = GT_DATA-WERTN_CL + ( GT_RUN-WERTN / GT_RUN-LOSGR ) .
ENDIF.
CLEAR GT_RUN.
ENDLOOP.
CLEAR GT_RUN.
READ TABLE GT_RUN INDEX 1 .
*BOM用量、BOM用量(含损耗)现在的基础上除以LOSGR
IF GT_RUN-LOSGR <> 0.
GT_DATA-MNGLG = GT_DATA-MNGLG / GT_RUN-LOSGR.
ENDIF.
ENDIF.
.
*含报废率用量 =BOM用量*(1+组件报废)
GT_DATA-MNGBF = GT_DATA-MNGLG * ( 1 + ( GT_DATA-AUSCH * '0.01') ) .
GT_DATA-WERTN_HJ = GT_DATA-WERTN_CL + GT_DATA-WERTN_RG + GT_DATA-WERTN_JQ + GT_DATA-WERTN_WX . "合计
SELECT SINGLE VPRSV INTO GT_DATA-VPRSV FROM MBEW
WHERE MATNR = GT_DATA-IDNRK
AND BWKEY = GT_DATA-WERKS
.
MODIFY GT_DATA.
CLEAR GT_DATA.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& 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-COLTAB_FIELDNAME = 'CELLCOLOR'. "单元格颜色内表字段
* 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_SAVE = 'U'
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.
FILL_FIELD :
* 'WERKS_C' '工厂',
'MATNR' '父项物料',
'MAKTX' '描述',
* 'STLAN' 'BOM用途',
* 'BMENG' '基本数量',
* 'STUFE' '层次',
'STUSX' '层次',
'POSNR' '项目号',
* 'MATNR_F' '父项物料',
'IDNRK' '子项物料',
'OJTXP' '描述',
'WERTN_CL' '材料',
'WERTN_RG' '人工',
'WERTN_JQ' '机器',
'WERTN_WX' '外协',
'WERTN_HJ' '成本合计',
'WERKS' '子件工厂',
'MNGLG' 'BOM用量',
'MNGBF' 'BOM用量(含损耗)',
'MMEIN' '单位',
'AUSCH' '组件报废率',
'VPRSV' '价格控制'.
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.
PERFORM SCREEN_SETTING.
START-OF-SELECTION.
PERFORM FOM_GETDATA .
PERFORM FRM_DISPLAY.
基于BOM结构的标准成本明细批量查询报表
最新推荐文章于 2024-11-08 09:35:37 发布