form sub_get_bom.

LOOP AT gt_output INTO gs_output.

REFRESH:lt_stb.

CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'  "多层BOM展开官方方法
      EXPORTING
        capid                 = 'PP01'
        datuv                 = sy-datum
        emeng                 = 0
        mtnrv                 = gs_output-matnr
        mktls                 = lv_mktls
        mehrs                 = lv_mehrs
        werks                 = gs_output-werks
        stlan                 = gs_output-stlan
        stlal                 = gs_output-stlal
      TABLES
        stb                   = lt_stb
      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
        OTHERS                = 8.
    "多层BOM,如果第一层的BOM 中有替代料,那么这个替代料展开的下层组件都要删除
sort lt_stb by stufe descending.
clear: ls_stb,lv_tim,lv_stufe,lv_vwegx.
read table lt_stb into ls_stb index 1.
  lv_tim = ls_stb-stufe - 1.
lt_stb1 = lt_stb[].
  DO lv_tim times.
    clear: ls_stb,ls_stb1.
    loop at lt_stb into ls_stb.
      lv_stufe = ls_stb-stufe - 1.
      lv_vwegx = ls_stb-vwegx.
      read table lt_stb into ls_stb1 with key stufe = lv_stufe wegxx = lv_vwegx.
        if sy-subrc = 0.
          if ls_stb1-alpos = 'X' and ls_stb1-ewahr <> '100'.
             ls_stb-alpos = 'X'.
          ENDIF.
        ENDIF.
      MODIFY LT_STB FROM LS_STB.
    ENDLOOP.
   ENDDO.
   delete lt_stb where alpos = 'X' and ewahr <> '100'.

CLEAR LS_STB.
    loop at lt_stb into ls_stb."取LT_STB带出来的BOM组件的价格
SELECT
    MBEW~MATNR,
    MBEW~BWKEY,
    MBEW~STPRS,
    MBEW~LFGJA,
    MBEW~LFMON,
    MBEW~PEINH
     FROM MBEW
  APPENDING CORRESPONDING FIELDS OF TABLE @GT_MBEWH
  WHERE MATNR = @ls_stb-IDNRK
  and BWKEY = @ls_stb-WERKS
  and STPRS > '0'.
PERform sub_process_mbew.
ENDLOOP.

CLEAR LS_STB.
clear cost_sum.
clear cost_sumt.
data:substr type string.
    LOOP AT  lt_stb INTO ls_stb.  "在这里计算好成本
      clear substr.
      substr = ls_stb-idnrk.
        if ls_stb-xtlnr <> ''.
          continue.
        ENDIF.
        case substr+0(2).
           when  'R8'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.  
                  cost_sum = cost_sum + rmenge * gt_mbew-stprs / gt_mbew-peinh.
                 clear rmenge.
                  exit.
               endif.
            endloop.

when  'S2'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sum = cost_sum + rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'S3'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sum = cost_sum + rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.
          EXIT.
           ENDCASE.
           case substr+0(5).
           when  'WK101'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sum = cost_sum + rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

"以上,芯片成本累加

when  'WK102'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'WK103'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'WK104'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'WK105'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'WK106'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'WK107'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'R1006'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'R1014'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                  perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'R1017'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'R1018'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                 perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.

when  'R1025'.
             loop at gt_mbewh into gt_mbew.
               if gt_mbew-matnr = ls_stb-idnrk and gt_mbew-bwkey = ls_stb-werks and gt_mbew-peinh <> '0'.
                  perform sub_get_rmenge using ls_stb-idnrk ls_stb-MNGLG.
                  cost_sumT = cost_sumT +  rmenge * gt_mbew-stprs / gt_mbew-peinh.
                  clear rmenge.
                  exit.
               endif.
            endloop.
           exit.
        ENDCASE.

"以上  计算铜材的成本
GS_OUTPUT-COST_XF = COST_SUM.
GS_OUTPUT-COST_TF = COST_SUMT.
MODIFY GT_OUTPUT FROM GS_OUTPUT.

*      MOVE-CORRESPONDING gs_output TO gs_alv.  "这个也是不用了  ,这是zpp009 的目标结构,这里换成我自己的
*
*      MOVE-CORRESPONDING ls_stb  TO gs_alv.
*
*
*      APPEND gs_alv TO gt_alv.
    ENDLOOP.
  ENDLOOP.

endform.

form sub_get_rmenge using idnrk menge. "考虑损耗 rmenge  加上损耗后的实际数量
  clear: smenge,rmenge.
  sort lt_stb by stufe descending.
clear: lv_tim,lv_stufe,lv_vwegx.
  if ls_stb-ausch <> '0' .
    smenge = ls_stb-mnglg * ls_stb-ausch / 100.  "自己当前级的损耗  
  endif.
  lv_tim = ls_stb-stufe - 1.
lt_stb1 = lt_stb[].
  DO lv_tim times.   "找父阶料
    clear: ls_stb1.
      lv_stufe = ls_stb-stufe - 1.
      lv_vwegx = ls_stb-vwegx.
      read table lt_stb into ls_stb1 with key stufe = lv_stufe wegxx = lv_vwegx."取父级的组件
     " ls_stb1-idnrk = ls_stb1-idnrk. "调试时看了下  可以没有
        if sy-subrc = 0.
          if ls_stb1-ausch <> '0'."父一级也有损耗,
             smenge =  smenge + ls_stb-mnglg * ls_stb1-ausch / 100  .  "MNGLG已经做了换算了,自己当前的耗用量
          ENDIF.
        ENDIF.
      "MODIFY LT_STB FROM LS_STB.
   ENDDO.
   rmenge = menge + smenge.
endform.

FORM SUB_SELECT_MBEW ." 取成品料的当前成本
  clear gs_output.
  loop at gt_output into gs_output.
SELECT
    MBEW~MATNR,
    MBEW~BWKEY,
    MBEW~STPRS,
    MBEW~LFGJA,
    MBEW~LFMON,
    MBEW~PEINH
     FROM MBEW
  APPENDING CORRESPONDING FIELDS OF TABLE @GT_MBEWH
  WHERE MATNR = @gS_output-MATNR
  and BWKEY = @GS_OUTPUT-WERKS
  and STPRS > '0'.
ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form SUB_SELECT_MBEWH
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM SUB_SELECT_MBEWH ."取成品料的历史成本

clear gs_output.
  loop at gt_output into gs_output.
 SELECT
        MBEWH~MATNR,
    MBEWH~BWKEY,
    MBEWH~STPRS,
    MBEWH~LFGJA,
    MBEWH~LFMON,
    MBEWH~PEINH
     FROM MBEWH
   APPENDING CORRESPONDING FIELDS OF TABLE @GT_MBEWH

WHERE MATNR = @gS_output-MATNR
   and BWKEY = @GS_OUTPUT-WERKS
   and STPRS > '0'.
ENDLOOP.
ENDFORM.

form sub_process_mbew."根据年份和期间拼接后排序,取最新的价格
  data: lfgja_a like GT_MBEW-LFGJA.
  data: lfmon_a like GT_MBEW-LFmon.
  LOOP AT GT_MBEWH INTO GT_MBEW.
    clear lfgja_a.
    clear lfmon_a.
    lfgja_a = GT_MBEW-LFGJA.
    lfmon_a = GT_MBEW-LFMON.
     GT_MBEW-SORTID = |{ lfgja_a+0(4) }{ lfmon_a+0(2) }| .
     MODIFY GT_MBEWH FROM GT_MBEW.
   ENDLOOP.
   SORT GT_MBEWH BY BWKEY MATNR sortid DESCENDING.
   delete adjacent duplicates from gt_mbewh comparing BWKEY MATNR.
endform.

SAP BOM 多层展开及组件成本处理相关推荐

  1. 【SAP Abap】BOM多级展开函数 CS_BOM_EXPL_MAT_V2 使用详解

    SAP ABAP BOM多级展开函数 CS_BOM_EXPL_MAT_V2 使用详解 1.函数入参说明 2.函数出参说明 1.函数入参说明 CALL FUNCTION 'CS_BOM_EXPL_MAT ...

  2. SAP BOM展开函数CS_BOM_EXPL_MAT_V2

    CALL  FUNCTION  'CS_BOM_EXPL_MAT_V2'      EXPORTING       capid                  =  'PP01'           ...

  3. SAP BOM物料清单详解

    BOM全称bill of material,中文名叫物料清单,是指构成一个产品或装配件的完整的结构列表,该列表包含每一个组件部件的编码.描述.数量和单位,BOM已成为PDM/ERP信息化系统的最重要的 ...

  4. SAP BOM的类二维报表

    一个简单BOM的类二维报表. 代码如下: TABLES: MARA, T001W, AUFK.TYPES: BEGIN OF TY_OUTPUT,IDNRK TYPE STPOX-IDNRK, &qu ...

  5. SAP MM 采购附加费计入物料成本之二

    SAP MM 采购附加费计入物料成本之二 本文是基于S4HANA 1909版本的SAP系统来做展示的,系统环境激活了零售行业解决方案,同时展示的物料使用移动平均价作为其价格评估的方式. 1,如下采购订 ...

  6. SAP MM 采购附加费计入物料成本?

    SAP MM 采购附加费计入物料成本? SAP MM 采购流程里,我们可以将采购附加费用比如关税,运费等计入物料的成本里.本文简要展示这个功能. 本文是基于S4HANA 1909版本的SAP系统来做展 ...

  7. [转]Shared——RN如何实现一个ExpandableList(可展开列表)组件

    作者:小石头若海 原文地址:https://segmentfault.com/a/1190000011754908 RN如何实现一个ExpandableList(可展开列表)组件 讨论与分析 首先,我 ...

  8. 多层bom展开_金蝶K3 WISE BOM多级展开_BOM成本表

    /****** Object: StoredProcedure [dbo].[pro_bobang_BOMCost] Script Date: 07/29/2015 16:09:11 ******/ ...

  9. SAP中BOM基础数量及组件数量单位比例关系的注意事项

    下图是BOM展开功能CS11在正式系统和测试系统的截图.从截图中的对比不难看出,最下级的原材料A20981-110在组件的数量为1,实际按BOM中的设定比例折算,应该是1个成品,对应需要0.125件原 ...

最新文章

  1. python时间函数报错_python3中datetime库,time库以及pandas中的时间函数区别与详解...
  2. Numba——python面向数组高性能计算库
  3. 用python画玫瑰花代码-Python | 用turtle库画玫瑰花
  4. Unity 4.3 2D 教程:新手上路
  5. CentOS6.5安装Subversion
  6. 时序数据库InfluxDB
  7. C/Cpp / 构造函数种类
  8. axis2 wsdl2java 使用方式
  9. java使用jeids实现redis2.6的HyperLogLog数据结构的操作
  10. 七上八下猜数字_猜数字游戏,猜别人心里想的数字
  11. 文末彩蛋 | 这个 Request URL 长得好不一样
  12. 激光雷达考试基础知识
  13. 电商路演投资计划融资报告PPT模板
  14. iOS 开发怎么入门?
  15. php使用fleaphp框架做开发。
  16. 前端开发入门到实战:JavaScript字符串转换数字
  17. 你应该知道的前端9种图片格式基础知识
  18. bootload启动流程(四)--Eboot每个函数的详细说明
  19. 菜鸟的layui学习总结
  20. 视口锁定解锁lisp_求一个cad 图层锁定和解锁的lisp命令?

热门文章

  1. cdr x4检测显示软件产品已被禁用警告弹窗,如何解决教程分享
  2. wifidog 配置文件
  3. 计算机组成原理推荐书籍
  4. JavaWeb 图书推荐
  5. 请注意,java中没有引用传递
  6. Ardupilot代码学习笔记
  7. 微信小程序自动检测新版本并静默更新,及热启动和冷启动
  8. Android使用WebView将网页打包成APP
  9. Win10更新系统,VirtualBox与win10不兼容处理办法
  10. 物联网毕设 --(STM32f407连接云平台检测数据)