************************************************************************ *Module : CO * ************************************************************************ *T_CODE : ZCO005 * *Creator : DENGHAIBO * *Create Date : 20.08.2018 09:09:28 * *TYPE : Report Program * *Description : 产品标准成本计算报表 * ************************************************************************ ************************************************************************ * 变更履历 * *--------- ------------- ---------- ---------------------------------* * 序号 时间 更改者 描述 * *--------- ------------- ---------- ---------------------------------* * New 20.08.2018 09:09:28 DENGHAIBO 程序创建 * ************************************************************************ REPORT zcor005. TABLES: keko,mara,mvke ,mast,stpo,stko . *&---------------------------------------------------------------------* * ALV全局变量 *&---------------------------------------------------------------------* DATA: gt_fcat TYPE lvc_t_fcat, " FIELDCAT gs_layout TYPE lvc_s_layo, " ALV layout gs_variant TYPE disvariant. " ALV Variant gs_layout-cwidth_opt = abap_true. " ALV 控制: 优化列宽度 gs_layout-zebra = abap_true. " ALV 控制: 斑马显示效果 gs_variant-report = sy-repid. " ABAP 程序名称 *&---------------------------------------------------------------------* * 全局变量 *&---------------------------------------------------------------------* TYPES: BEGIN OF ty_alv, werks TYPE keko-werks, " 工厂 matnr TYPE keko-matnr, " 物料 maktx TYPE makt-maktx, " 物料描述 mvgr5 TYPE mvke-mvgr5, " 单品/套装描述 bezei TYPE tvm5t-bezei, " 单品/套装 描述 mtart TYPE mara-mtart, " 物料类型 mtbez TYPE t134t-mtbez, " 物料类型 描述 spart TYPE mara-spart, " 品牌 vtext TYPE tspat-vtext, " 品牌 描述 mvgr2 TYPE mvke-mvgr2, " 系列 beze TYPE tvm2t-bezei, " 系列 描述 kst TYPE keph-kst001, " 标准成本 = A+B+C kst001 TYPE keph-kst001, " 原料(A) kst002 TYPE keph-kst002, " 包材(B) kst468 TYPE keph-kst001, " 制费合计C kst004 TYPE keph-kst004, " 人工 kst006 TYPE keph-kst006, " 机器 kst008 TYPE keph-kst008, " 制费 matnr1 TYPE ckis-matnr, " 包材明细 matnr2 TYPE ckis-matnr, " 分装 stufe TYPE histu, " 层次(在多层 BOM 展开中) wertn TYPE ckis-wertn, " 包材成本价 menge TYPE ckis-menge, " 包材数量 menge1 TYPE ckis-menge, " BOM分装基本数量 meeht TYPE ckis-meeht, " 单位 matkl TYPE t023t-matkl, " 物料组 wgbez TYPE t023t-wgbez, " 物料组描述 stnum TYPE keko-stnum, " 物料单 stlan TYPE keko-stlan, " BOM用途 stalt TYPE keko-stalt, " 可选的BOM plnnr TYPE keko-plnnr, " 配方组 text1 TYPE mkal-text1, " 生产工厂 bwkey TYPE keko-bwkey, " 估价范围 kadky TYPE keko-kadky, " 成本核算日期 kalnr TYPE keko-kalnr, " 成本估算号 kstar TYPE ckis-kstar, " 成本要素 aldat TYPE keko-aldat, " 成本核算数量结构日期 END OF ty_alv. DATA: gt_alv TYPE TABLE OF ty_alv. DATA: gt_matnr TYPE TABLE OF ty_alv. DATA: gs_alv TYPE ty_alv. FIELD-SYMBOLS: <fs_alv> TYPE ty_alv. FIELD-SYMBOLS: <fs_matnr> TYPE ty_alv. DATA: p_kadky_start TYPE keko-kadky. DATA: p_kadky_end TYPE keko-kadky. DATA: p_monat1 TYPE bkpf-monat. *&---------------------------------------------------------------------* * SELECTION-SCREEN *&---------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t1. PARAMETERS: p_gjahr TYPE bkpf-gjahr OBLIGATORY DEFAULT sy-datum+0(4), " 会计年度 p_monat TYPE bkpf-monat OBLIGATORY DEFAULT sy-datum+4(2). " 会计期间 SELECT-OPTIONS: s_werks FOR keko-werks, " 公司代码 s_matnr FOR keko-matnr, " 物料 s_mtart FOR mara-mtart NO INTERVALS NO-EXTENSION, " 物料类型 s_spart FOR mara-spart NO INTERVALS NO-EXTENSION, " 品牌 s_mvgr2 FOR mvke-mvgr2 NO INTERVALS NO-EXTENSION. " 系列 SELECTION-SCREEN END OF BLOCK b1. *&---------------------------------------------------------------------* * AT SELECTION-SCREEN. *&---------------------------------------------------------------------* AT SELECTION-SCREEN. " 月份区间 p_kadky_start = p_gjahr && p_monat && '01'. p_monat1 = p_monat + 1. p_kadky_end = p_gjahr && p_monat1 && '01'. p_kadky_end = p_kadky_end - 1. *&---------------------------------------------------------------------* * INITIALIZATION(初始化) *&---------------------------------------------------------------------* INITIALIZATION. *&---------------------------------------------------------------------* * START-OF-SELECTION *&---------------------------------------------------------------------* START-OF-SELECTION. PERFORM frm_get_matnr. " 取物料 PERFORM frm_get_data. " 取数 PERFORM set_fcat_alv. " ALV字段 PERFORM frm_alv_display. " ALV显示 *&---------------------------------------------------------------------* *& Form FRM_GET_MATNR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_get_matnr. SELECT DISTINCT keko~werks, " 工厂 keko~matnr, " 物料 mara~mtart, " 物料类型 mara~spart, " 品牌 mvke~mvgr2, " 系列 keko~stnum, " 物料单 keko~stalt " 可选的BOM FROM keko INNER JOIN mvke ON mvke~matnr = keko~matnr AND mvke~vkorg = keko~werks INNER JOIN mara ON mara~matnr = keko~matnr INTO CORRESPONDING FIELDS OF TABLE @gt_matnr WHERE keko~werks IN @s_werks " 公司代码 AND keko~kadky BETWEEN @p_kadky_start AND @p_kadky_end AND keko~matnr IN @s_matnr " 物料 AND mara~mtart IN @s_mtart " 物料类型 AND mara~spart IN @s_spart " 品牌 AND mvke~mvgr2 IN @s_mvgr2. " 系列 DATA: lt_stpox LIKE stpox OCCURS 0 WITH HEADER LINE. DATA: ls_stpox LIKE stpox. DATA: ls_cstmat LIKE cstmat. LOOP AT gt_matnr ASSIGNING <fs_matnr>. IF <fs_matnr>-matnr IS NOT INITIAL. CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' EXPORTING aufsw = ' ' "确定并输入订单层级和通道 capid = 'ZP01' "固定值 datuv = p_kadky_start "创建BOM时输入的有效起始日期 ehndl = '1' "BOM 帮助字段 复选框 mbwls = ' ' "读取物料估价 emeng = '1' " 所需数量 mtnrv = <fs_matnr>-matnr "要展开的物料 mehrs = 'X' "是否多级展开BOM mmory = '1' "是否启用内存 werks = <fs_matnr>-werks "创建物料时输入的工厂 rndkz = '1' stlal = <fs_matnr>-stalt IMPORTING topmat = ls_cstmat TABLES stb = lt_stpox "输出 EXCEPTIONS material_not_found = 4 no_plant_data = 8 no_bom_found = 12 no_suitable_bom_found = 16 alt_not_found = 24 missing_authorization = 28 conversion_error = 36. ENDIF. DATA: lv_matnr TYPE keko-matnr. " 分装往下行赋值 DATA: lv_menge1 TYPE ckis-menge. " 分装往下行赋值 IF lt_stpox[] IS INITIAL. APPEND <fs_matnr> TO gt_alv. ELSE. LOOP AT lt_stpox INTO ls_stpox WHERE mtart = 'ZDBC' OR mtart = 'ZHAL'. IF ls_stpox-mtart = 'ZHAL'. lv_matnr = ls_stpox-idnrk. lv_menge1 = ls_stpox-menge. ENDIF. gs_alv-matnr2 = lv_matnr. gs_alv-menge1 = lv_menge1. gs_alv-matnr = <fs_matnr>-matnr. " 物料 gs_alv-mvgr2 = <fs_matnr>-mvgr2. " 系列 gs_alv-spart = <fs_matnr>-spart. " 品牌 gs_alv-matnr1 = ls_stpox-idnrk. " BOM 组件 gs_alv-stufe = ls_stpox-stufe. gs_alv-stlan = ls_stpox-stlan. " BOM 用途 gs_alv-stalt = ls_stpox-stlal. " 可选的 BOM gs_alv-werks = ls_stpox-werks. " 工厂 APPEND gs_alv TO gt_alv. CLEAR gs_alv. ENDLOOP. REFRESH lt_stpox. ENDIF. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_get_data . IF gt_alv IS NOT INITIAL. SELECT makt~maktx, " 物料描述 makt~matnr FROM makt INTO TABLE @DATA(lt_makt) FOR ALL ENTRIES IN @gt_alv WHERE matnr = @gt_alv-matnr AND spras = '1'. SORT lt_makt BY matnr. SELECT mvke~matnr, mvke~mvgr5, tvm5t~bezei " 单品/套装描述 FROM tvm5t INNER JOIN mvke ON tvm5t~mvgr5 = mvke~mvgr5 INTO TABLE @DATA(lt_tvm5t) FOR ALL ENTRIES IN @gt_alv WHERE mvke~matnr = @gt_alv-matnr. SORT lt_tvm5t BY matnr mvgr5. SELECT t134t~mtbez, " 物料类型描述 mara~mtart, mara~matnr FROM t134t INNER JOIN mara ON mara~mtart = t134t~mtart INTO TABLE @DATA(lt_t134t) FOR ALL ENTRIES IN @gt_alv WHERE mara~matnr = @gt_alv-matnr AND t134t~spras = '1'. SORT lt_t134t BY matnr mtart. SELECT tspat~vtext, " 品牌 描述 mara~spart, mara~matnr FROM tspat INNER JOIN mara ON mara~spart = tspat~spart INTO TABLE @DATA(lt_tspat) FOR ALL ENTRIES IN @gt_alv WHERE mara~matnr = @gt_alv-matnr AND tspat~spras = '1'. SORT lt_tspat BY matnr spart. SELECT mvke~matnr, mvke~mvgr2, tvm2t~bezei " 系列 FROM tvm2t INNER JOIN mvke ON tvm2t~mvgr2 = mvke~mvgr2 INTO TABLE @DATA(lt_tvm2t) FOR ALL ENTRIES IN @gt_alv WHERE mvke~matnr = @gt_alv-matnr AND mvke~mvgr2 = @gt_alv-mvgr2 AND tvm2t~spras = '1'. SORT lt_tvm2t BY matnr mvgr2. SELECT mara~matnr, mara~matkl, t023t~wgbez " 物料组描述 FROM mara INNER JOIN t023t ON t023t~matkl = mara~matkl INTO TABLE @DATA(lt_t023t) FOR ALL ENTRIES IN @gt_alv WHERE mara~matnr = @gt_alv-matnr1 AND t023t~spras = '1'. SORT lt_t023t BY matnr. SELECT keko~matnr, " 物料 keko~plnnr, " keko~stnum, " 物料单 keko~kadky, " 成本核算日期 keko~kalnr, " 成本估算号 - 产品成本核算 keph~kst001, " 原料 keph~kst002, " 包材 keph~kst004, " 人工 keph~kst006, " 机器 keph~kst008, mkal~text1 FROM keko INNER JOIN keph ON keph~kalnr = keko~kalnr AND keph~kadky = keko~kadky INNER JOIN mkal ON mkal~matnr = keko~matnr AND mkal~werks = keko~werks INTO TABLE @DATA(lt_keph) FOR ALL ENTRIES IN @gt_alv WHERE keko~matnr = @gt_alv-matnr AND keko~werks = @gt_alv-werks " 公司代码 AND keko~kadky BETWEEN @p_kadky_start AND @p_kadky_end AND keph~kkzst <> 'X'. SORT lt_keph BY matnr. SELECT keko~matnr, keko~kadky, " 成本核算日期 keko~kalnr, " 成本估算号 - 产品成本核算 ckis~matnr AS matnr1, ckis~wertn, ckis~menge, ckis~meeht, ckis~kstar FROM keko INNER JOIN ckis ON ckis~kalnr = keko~kalnr AND ckis~kadky = keko~kadky INTO TABLE @DATA(lt_ckis) WHERE keko~kadky BETWEEN @p_kadky_start AND @p_kadky_end AND ckis~kstar IN ( '5001010101','5001010200' ). SORT lt_ckis BY matnr matnr1. LOOP AT gt_alv ASSIGNING <fs_alv>. " 物料描述 READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-maktx = ls_makt-maktx. ENDIF. " 物料组 描述 READ TABLE lt_t023t INTO DATA(ls_t023t) WITH KEY matnr = <fs_alv>-matnr1 BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-wgbez = ls_t023t-wgbez. <fs_alv>-matkl = ls_t023t-matkl. ENDIF. " 单品/套装描述 READ TABLE lt_tvm5t INTO DATA(ls_tvm5t) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-bezei = ls_tvm5t-bezei. ENDIF. " 物料类型描述 READ TABLE lt_t134t INTO DATA(ls_t134t) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-mtbez = ls_t134t-mtbez. ENDIF. " 品牌 描述 READ TABLE lt_tspat INTO DATA(ls_tspat) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-vtext = ls_tspat-vtext. ENDIF. " 系列 READ TABLE lt_tvm2t INTO DATA(ls_tvm2t) WITH KEY matnr = <fs_alv>-matnr mvgr2 = <fs_alv>-mvgr2 BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-beze = ls_tvm2t-bezei. ENDIF. " 原料(A) 包材(B) 人工 机器 制费 READ TABLE lt_keph INTO DATA(ls_keph) WITH KEY matnr = <fs_alv>-matnr BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-kst001 = ls_keph-kst001. <fs_alv>-kst002 = ls_keph-kst002. <fs_alv>-kst004 = ls_keph-kst004. <fs_alv>-kst006 = ls_keph-kst006. <fs_alv>-kst008 = ls_keph-kst008. <fs_alv>-plnnr = ls_keph-plnnr. <fs_alv>-text1 = ls_keph-text1. <fs_alv>-stnum = ls_keph-stnum. ENDIF. " 制费合计C <fs_alv>-kst468 = <fs_alv>-kst004 + <fs_alv>-kst006 + <fs_alv>-kst008. " 标准成本 = A+B+C <fs_alv>-kst = <fs_alv>-kst001 + <fs_alv>-kst002 + <fs_alv>-kst468. " 包材成本价 IF <fs_alv>-stufe = '1'. READ TABLE lt_ckis INTO DATA(ls_ckis) WITH KEY matnr = <fs_alv>-matnr matnr1 = <fs_alv>-matnr1 BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-wertn = ls_ckis-wertn. <fs_alv>-menge = ls_ckis-menge. <fs_alv>-meeht = ls_ckis-meeht. ENDIF. ELSEIF <fs_alv>-stufe = '2'. READ TABLE lt_ckis INTO DATA(ls_ckis1) WITH KEY matnr = <fs_alv>-matnr2 matnr1 = <fs_alv>-matnr1 BINARY SEARCH. IF sy-subrc = 0. <fs_alv>-wertn = ls_ckis1-wertn * <fs_alv>-menge1 / 1000. <fs_alv>-menge = ls_ckis1-menge * <fs_alv>-menge1 / 1000. <fs_alv>-meeht = ls_ckis1-meeht. ENDIF. ENDIF. " 物料编码去前导零 <fs_alv>-matnr = | { <fs_alv>-matnr ALPHA = OUT } |. <fs_alv>-matnr1 = | { <fs_alv>-matnr1 ALPHA = OUT } |. ENDLOOP. LOOP AT gt_alv ASSIGNING <fs_alv> WHERE matkl = '30101'. IF sy-subrc = 0. DELETE gt_alv INDEX sy-tabix. ENDIF. ENDLOOP. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form SET_FCAT_ALV *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM set_fcat_alv . DATA: ls_fcat LIKE LINE OF gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'WERKS'. ls_fcat-scrtext_l = '工厂'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MATNR'. ls_fcat-scrtext_l = '物料编码'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MAKTX'. ls_fcat-scrtext_l = '物料描述'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'BEZEI'. ls_fcat-scrtext_l = '单品/套装描述'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MTBEZ'. ls_fcat-scrtext_l = '物料类型'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'VTEXT'. ls_fcat-scrtext_l = '品牌'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'BEZE'. ls_fcat-scrtext_l = '系列'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST'. ls_fcat-scrtext_l = '标准成本'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST001'. ls_fcat-scrtext_l = '原料'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST002'. ls_fcat-scrtext_l = '包材'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST468'. ls_fcat-scrtext_l = '制费合计'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST004'. ls_fcat-scrtext_l = '人工'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST006'. ls_fcat-scrtext_l = '机器'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'KST008'. ls_fcat-scrtext_l = '制费'. APPEND ls_fcat TO gt_fcat. * CLEAR ls_fcat. * ls_fcat-fieldname = 'MATNR2'. * ls_fcat-scrtext_l = '分装'. * APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MATNR1'. ls_fcat-scrtext_l = '包材明细'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'STUFE'. ls_fcat-scrtext_l = '包材层级'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'WERTN'. ls_fcat-scrtext_l = '包材成本价'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MENGE'. ls_fcat-scrtext_l = '包材数量'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'MEEHT'. ls_fcat-scrtext_l = '单位'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'WGBEZ'. ls_fcat-scrtext_l = '物料组描述'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'STNUM'. ls_fcat-scrtext_l = '物料单'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'STLAN'. ls_fcat-scrtext_l = 'BOM用途'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'STALT'. ls_fcat-scrtext_l = '可选的BOM'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'PLNNR'. ls_fcat-scrtext_l = '配方组'. APPEND ls_fcat TO gt_fcat. CLEAR ls_fcat. ls_fcat-fieldname = 'TEXT1'. ls_fcat-scrtext_l = '生产工厂'. APPEND ls_fcat TO gt_fcat. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_ALV_DISPLAY *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_alv_display . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid i_callback_pf_status_set = 'SET_PF_STATUS' is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fcat i_save = 'A' is_variant = gs_variant TABLES t_outtab = gt_alv EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. *&---------------------------------------------------------------------* * SET_PF_STATUS *&---------------------------------------------------------------------* FORM set_pf_status USING rt_extab TYPE slis_t_extab. SET PF-STATUS 'ZSTANDARD'. ENDFORM.
^_^很多人都把资料锁进了note里,以后还怎么百度呢^_^