功能: 根据指定的Mbom 以及 序列号 和有效期来查找有效的Mbom

(假设 Mbom的 变更 包括 按有效期 和 按序列号)

函数组:ZPLM_BOM_FG

1  function module:

(1)  读取单层的有效Mbom

ZPLM_GET_USED_BOM

import:

P_SERNR    like  AEEF-SERNR_LO   序列号

P_DATUV   like  AENR-DATUV   开始生效日期

P_MATNR   like  MAST-MATNR  物料号

P_WERKS   like  MAST-WERKS   工厂

P_STLAN   like  MAST-STLAN   BOM用途

P_STLAL   like  MAST-STLAL   可选的BOM

tables:

TAB_BOM   like  ZPLM_BOM_USE    查找使用的bom用到的结构

source code:

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } FUNCTION zplm_get_used_bom.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(P_SERNR) LIKE  AEEF-SERNR_LO
*"     VALUE(P_DATUV) LIKE  AENR-DATUV OPTIONAL
*"     VALUE(P_MATNR) LIKE  MAST-MATNR
*"     VALUE(P_WERKS) LIKE  MAST-WERKS OPTIONAL
*"     VALUE(P_STLAN) LIKE  MAST-STLAN
*"     VALUE(P_STLAL) LIKE  MAST-STLAL OPTIONAL
*"  TABLES
*"      TAB_BOM STRUCTURE  ZPLM_BOM_USE
*"----------------------------------------------------------------------

CHECK     p_matnr IS NOT INITIAL
        AND p_werks IS NOT INITIAL
        AND p_stlan IS NOT INITIAL.

DATA:  v_datuv TYPE capp_itm-datuv,
         v_stlty  TYPE stko-stlty,
         v_stlal  TYPE stko-stlal,
         v_stlnr  TYPE stko-stlnr,
         v_werks  TYPE mkal-werks,
         v_BMENG  type stko-BMENG.

DATA:  v_objkt TYPE aeoi-objkt,
         v_usobj TYPE aeoi-usobj.

DATA: lt_exp_bom_item TYPE STANDARD TABLE OF capp_itm WITH HEADER LINE.

v_stlty = 'M'.
  v_werks = p_werks.
  IF p_stlal IS INITIAL .
    v_stlal = '1'.
  ELSE.
    v_stlal = p_stlal.
  ENDIF.

IF p_datuv IS INITIAL.
    v_datuv = sy-datum.
  ELSE.
    v_datuv = p_datuv.
  ENDIF.

* 得到bom单号 and 可选bom
  SELECT SINGLE  m~stlnr m~stlal n~BMENG INTO (v_stlnr,v_stlal,v_BMENG)
     FROM mast   AS m INNER JOIN stko AS n ON m~stlnr = n~stlnr AND m~stlal = n~stlal
        WHERE m~matnr = p_matnr AND n~stlty = v_stlty
          AND m~stlal = v_stlal AND m~werks = p_werks
          AND m~stlan = p_stlan.
  IF sy-subrc = 0.

* 读取有效期内的bom
    CALL FUNCTION 'CABM_READ_BOM_ITEM'
      EXPORTING
        i_stlty      = v_stlty
        i_stlnr      = v_stlnr
        i_stlal      = v_stlal
        i_date_from  = v_datuv
        i_werks      = v_werks
      TABLES
        exp_bom_item = lt_exp_bom_item.

* 如果有序列号参数,则处理序列号变更的组件
    IF p_sernr IS NOT INITIAL.

DATA: lt_pos TYPE TABLE OF ty_pos,
            ls_pos TYPE ty_pos.

DATA: lt_aeoi TYPE TABLE OF ty_aeoi,
            ls_aeoi TYPE ty_aeoi.

DATA: lt_aeef TYPE TABLE OF ty_aeef,
            ls_aeef TYPE ty_aeef.

DATA: lt_makt TYPE TABLE OF ty_makt,
            ls_makt TYPE ty_makt.

DATA: lt_marc TYPE TABLE OF ty_marc,
            ls_marc TYPE ty_marc.

CONCATENATE v_stlty v_stlnr INTO v_objkt.

*  查询所有序列号变更的
      SELECT a~idnrk a~menge a~posnr a~postp a~meins a~aennr
           INTO CORRESPONDING FIELDS OF TABLE lt_pos
            FROM stpo AS a INNER JOIN stas AS b
               ON a~stlnr = b~stlnr
              AND a~stlty = b~stlty
              AND a~stlkn = b~stlkn
                  INNER JOIN aenr AS c
               ON a~aennr = c~aennr
           WHERE a~stlnr = v_stlnr
             AND b~stlal = v_stlal
             AND a~stlty = v_stlty
             AND a~postp IN ('L','X')
             AND c~clint = 5
             .
* 查询序列号变更区间和日期
      IF sy-subrc = 0.
*    查询序列号变更日期
        SELECT aennr objkt usobj objdt
             INTO TABLE lt_aeoi
               FROM aeoi
                FOR ALL ENTRIES IN lt_pos
             WHERE aennr = lt_pos-aennr
               AND aetyp = '02'
               AND objkt = v_objkt.
*      查询序列号区间
        SELECT aennr sernr_lo sernr_hi
            INTO TABLE lt_aeef
               FROM aeef
                 FOR ALL ENTRIES IN lt_pos
            WHERE aennr = lt_pos-aennr.

LOOP AT lt_pos INTO ls_pos.
          CLEAR v_usobj.
*      获得usobj
          PERFORM get_usobj USING
                     p_matnr p_werks p_stlan v_usobj.

READ TABLE lt_aeoi INTO ls_aeoi WITH KEY
                          aennr = ls_pos-aennr
                          objkt = v_objkt
                          usobj = v_usobj.
          IF sy-subrc = 0.
            ls_pos-objdt = ls_aeoi-objdt.
          ENDIF.

READ TABLE lt_aeef INTO ls_aeef WITH KEY
                          aennr = ls_pos-aennr.
          IF sy-subrc = 0.
            ls_pos-sernr_lo = ls_aeef-sernr_lo.
            ls_pos-sernr_hi = ls_aeef-sernr_hi.
          ENDIF.
          MODIFY lt_pos FROM ls_pos.
        ENDLOOP.
      ENDIF.

DELETE lt_pos WHERE objdt > v_datuv.   "删除所有变更日期为应用日期之后的
      DELETE lt_pos WHERE sernr_lo > p_sernr
                     OR  sernr_hi < p_sernr.  "删除更改的序列号区间在当前序列号之外的

CLEAR tab_bom.  REFRESH tab_bom.
      IF lt_pos[] IS NOT INITIAL.
*    删除掉重复的数据
        SORT lt_pos DESCENDING BY idnrk posnr objdt.
        DELETE ADJACENT DUPLICATES FROM lt_pos COMPARING idnrk posnr objdt.
*    用序列号变更的数量更新到bom中
        LOOP AT lt_exp_bom_item.
          READ TABLE  lt_pos INTO ls_pos
            WITH KEY idnrk = lt_exp_bom_item-idnrk
                     posnr = lt_exp_bom_item-posnr.
          IF sy-subrc = 0.
            lt_exp_bom_item-menge = ls_pos-menge.
            MODIFY lt_exp_bom_item.
          ENDIF.
        ENDLOOP.

*   把序列号变更新加的组件加进去
        LOOP AT lt_pos INTO ls_pos.
          READ TABLE  lt_exp_bom_item
            WITH KEY idnrk = ls_pos-idnrk
                     posnr = ls_pos-posnr.
          IF sy-subrc <> 0.
            CLEAR lt_exp_bom_item.
            MOVE-CORRESPONDING ls_pos TO lt_exp_bom_item.
            APPEND lt_exp_bom_item.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDIF.
*  把使用的bom放到 tab_bom表中
    IF lt_exp_bom_item[] IS NOT INITIAL.
      LOOP AT lt_exp_bom_item.
        MOVE-CORRESPONDING lt_exp_bom_item TO tab_bom.
        tab_bom-matnr = lt_exp_bom_item-idnrk.
        tab_bom-stlnr = v_stlnr.
        tab_bom-stlal = v_stlal.
        tab_bom-BMENG = v_BMENG.
        APPEND tab_bom.
      ENDLOOP.
    ENDIF.

*  读取物料描述
    IF tab_bom[] IS NOT INITIAL.
      SELECT matnr maktx FROM makt
         INTO TABLE lt_makt
          FOR ALL ENTRIES IN tab_bom
          WHERE matnr = tab_bom-matnr
          AND   spras = sy-langu.

SELECT matnr werks beskz sobsl FROM marc
         INTO TABLE lt_marc
          FOR ALL ENTRIES IN tab_bom
          WHERE matnr = tab_bom-matnr
          AND   werks = P_WERKS.

LOOP AT tab_bom.
        READ TABLE lt_makt INTO ls_makt
          WITH KEY matnr = tab_bom-matnr.
        IF sy-subrc = 0.
          tab_bom-maktx = ls_makt-maktx.
          MODIFY tab_bom.
        ENDIF.

READ TABLE lt_marc INTO ls_marc
          WITH KEY matnr = tab_bom-matnr
                   werks = P_WERKS
                   .
        IF sy-subrc = 0.
          tab_bom-beskz = ls_marc-beskz.
          tab_bom-sobsl = ls_marc-sobsl.
          MODIFY tab_bom.
        ENDIF.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFUNCTION.

(2)  读取多层层的有效Mbom

ZPLM_GET_USED_BOM_EXP

import:

P_SERNR    like  AEEF-SERNR_LO   序列号

P_DATUV   like  AENR-DATUV   开始生效日期

P_MATNR   like  MAST-MATNR  物料号

P_WERKS   like  MAST-WERKS   工厂

P_STLAN   like  MAST-STLAN   BOM用途

P_STLAL   like  MAST-STLAL   可选的BOM

tables:

TAB_BOM   like  ZPLM_BOM_USE    查找使用的bom用到的结构

source code:

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } FUNCTION ZPLM_GET_USED_BOM_EXP.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(P_SERNR) LIKE  AEEF-SERNR_LO
*"     VALUE(P_DATUV) LIKE  AENR-DATUV OPTIONAL
*"     VALUE(P_MATNR) LIKE  MAST-MATNR
*"     VALUE(P_WERKS) LIKE  MAST-WERKS OPTIONAL
*"     VALUE(P_STLAN) LIKE  MAST-STLAN
*"     VALUE(P_STLAL) LIKE  MAST-STLAL OPTIONAL
*"  TABLES
*"      TAB_BOM STRUCTURE  ZPLM_BOM_USE
*"----------------------------------------------------------------------

CHECK       p_matnr IS NOT INITIAL
        AND p_werks IS NOT INITIAL
        AND p_stlan IS NOT INITIAL.

data: cindex2 type text10.
  data: ilevel type i.
  data: clevel type text20.

data: irate type KMPMG.

oindex = 0.
  cindex = oindex.
  oindex = 1.
  cindex2 = oindex.

ilevel = 0.
  clevel = '0'.

irate = 1.

refresh it_bom.  clear it_bom.

it_bom-matnr = p_matnr.
  it_bom-myid = cindex2.
  it_bom-ilevel = clevel.
  it_bom-pid = cindex .
  it_bom-irate = irate .
  append it_bom.

cindex = oindex.
  cindex2 = cindex .
  perform get_exp_bom using
           p_sernr
           p_datuv
           p_matnr
           p_werks
           p_stlan
           p_stlal
           cindex2
           ilevel
           irate.
  if it_bom is not initial.
     append lines of it_bom to tab_bom.
  endif.

ENDFUNCTION.

2  definetions:

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S52 { color: #0000FF; } FUNCTION-POOL zplm_bom_fg.                  "MESSAGE-ID ..

TYPES: BEGIN OF ty_pos,
     idnrk LIKE stpo-idnrk ,           "组件
     menge LIKE stpo-menge ,
     posnr LIKE stpo-posnr ,           "项目
     postp LIKE stpo-postp ,
     meins LIKE stpo-meins ,
     objdt TYPE aeoi-objdt ,
     aennr LIKE stpo-aennr ,
     sernr_lo TYPE aeef-sernr_lo,
     sernr_hi TYPE aeef-sernr_hi,
  END OF ty_pos.

TYPES: BEGIN OF ty_aeoi,
   aennr LIKE aeoi-aennr ,
   objkt LIKE aeoi-objkt ,
   usobj LIKE aeoi-usobj ,
   objdt TYPE aeoi-objdt ,
END OF ty_aeoi.

TYPES: BEGIN OF ty_aeef,
    aennr LIKE aeef-aennr ,
    sernr_lo LIKE aeef-sernr_lo ,
    sernr_hi LIKE aeef-sernr_hi ,
 END OF ty_aeef.

TYPES: BEGIN OF ty_makt,
         matnr TYPE makt-matnr,
         maktx TYPE makt-maktx,
       END OF ty_makt.

TYPES: BEGIN OF ty_marc,
         matnr TYPE marc-matnr,
         werks TYPE marc-werks,
         beskz type marc-beskz,
         sobsl type marc-sobsl,
       END OF ty_marc.

data: oindex type i.
  data: cindex type text10.

DATA: it_bom TYPE STANDARD TABLE OF ZPLM_BOM_USE WITH HEADER LINE.

3 subroutins:

SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S31 { font-style: italic; color: #808080; } .L1S32 { color: #3399FF; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF; } *&---------------------------------------------------------------------*
*&      Form  get_usobj
*&---------------------------------------------------------------------*
*       获得更改的对象的 usobj
*----------------------------------------------------------------------*
*      -->P_P_MATNR  物料
*      -->P_P_WERKS  工厂
*      -->P_P_STLAN  类型
*      -->P_V_USOBJ  usobj
*----------------------------------------------------------------------*
FORM get_usobj  USING    p_p_matnr
                         p_p_werks
                         p_p_stlan
                         p_v_usobj.
  DATA matnr(18).
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = p_p_matnr
    IMPORTING
      output = matnr.

p_v_usobj+0(18) = matnr.
  p_v_usobj+18(4) = p_p_werks.
  p_v_usobj+22(1) = p_p_stlan.
ENDFORM.                    " get_usobj

*&---------------------------------------------------------------------*
*&      Form  get_exp_bom
*&---------------------------------------------------------------------*
*       递归获得子bom
*----------------------------------------------------------------------*
*   -->    p_sernr   序列号
*   -->    p_datuv   有效期
*   -->    p_matnr   物料号
*   -->    p_werks   工厂
*   -->    p_stlan   bom用途
*   -->    p_stlal   可选bom
*   -->    p_index   索引
*   -->    p_level   层次
*   -->    p_rate    比例
*----------------------------------------------------------------------*
form get_exp_bom using
          p_sernr
          p_datuv
          p_matnr
          p_werks
          p_stlan
          p_stlal
          p_index
          p_level
          p_rate
              .

DATA: it_bom1 TYPE STANDARD TABLE OF ZPLM_BOM_USE WITH HEADER LINE.

data: cindex2 type text10.

data: ilevel type i.
  data: clevel type text20.

data: irate type KMPMG.

clear it_bom1.  refresh it_bom1.
  CALL FUNCTION 'ZPLM_GET_USED_BOM'
    EXPORTING
      p_sernr       = p_sernr
      P_DATUV       = p_datuv
      p_matnr       = p_matnr
      P_WERKS       = p_werks
      p_stlan       = p_stlan
      P_STLAL       = p_stlal
    tables
      tab_bom       = it_bom1
            .

ilevel = p_level + 1.
   perform get_level using
             ilevel clevel.
   loop at it_bom1.
     oindex = oindex + 1.
     cindex = oindex.
     irate = p_rate * it_bom1-menge / it_bom1-BMENG.
     move it_bom1 to it_bom.
     it_bom-pid = p_index.
     it_bom-myid = cindex.
     it_bom-ilevel = clevel.
     it_bom-irate = irate.
     append it_bom.
     cindex2 = cindex.
     perform get_exp_bom using
           p_sernr
           p_datuv
           it_bom1-matnr
           p_werks
           p_stlan
           p_stlal
           cindex2
           ilevel
           irate.
   endloop.
endform.                    " get_exp_bom
*&---------------------------------------------------------------------*
*&      Form  get_level
*&---------------------------------------------------------------------*
*       生成level信息串
*----------------------------------------------------------------------*
*  -->  p_level_num       层数
*  <--  p_level_str       层串
*----------------------------------------------------------------------*
form get_level using
        p_level_num
        p_level_str.
   clear p_level_str.
   do p_level_num times.
     concatenate  p_level_str '.' into p_level_str.
   enddo.
   data str type text20.
   str = p_level_num.
   condense str no-gaps.
   concatenate  p_level_str str into p_level_str.
endform.                    " get_level

4  sturctures:

ZPLM_BOM_USE

SAP中多层扩展有效地bom相关推荐

  1. 【SAP学习小记】SAP中常用物料表和bom表,以及关联信息

    物料相关 MARA,MARC,MAKT 通过MATNR关联 BOM MAST,STKO,STPO 通过STLNR

  2. PP实施经验分享(4)——SAP中BOM应用

    SAP标准功能中MRP.MTO销售展开.标准成本核算.EBOM\PBOM.PLM关联应用都会使用到SAP中BOM应用,特别是总成BOM展开MRP是物料需求管理必须掌握的知识点,在这里,我简要说一些项目 ...

  3. SAP中做一个配置BOM(SAP配置BOM攻略一)

    CL01.CL02.CL03 类维护 CT04 特性和值维护 CU41.CU42.CU43 相关性维护 CU50 配置测试 光阴是剑,上次和小伙伴们一起学习SAP的配置BOM已经是3年前了. 这次认真 ...

  4. PP实施经验分享(13)——SAP中BOM查询技巧CS11/CS12/CS13/CS14/CS15/CSMB

    PP实施经验分享(6)--SAP中BOM查询技巧CS11/CS12/CS13/CS14/CS15/CSMB 项目中经常会遇到查询BOM信息,这里简单介绍几个SAP标准查询BOM的功能,也可以通过这些有 ...

  5. SAP中BOM中原材料未勾选生产相关导致无法正常生产反冲消耗问题的分析

    在实际工作中有遇到如题所描述的问题.在SAP中成品生产入库通常会同步产生下级原材料消耗.用户的理解是,只要该原材料存在于成品的BOM中,在生产时,就会根据BOM中设定的数量来进行反冲消耗.但确实遇到实 ...

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

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

  7. SAP中供应商确认功能的应用分析

    SAP中供应商确认功能是一个辅助性的功能.在简单的采购业务流程中,不一定需要用到.但作为企业的SAP顾问,需要掌握供应商确认功能的一些应用情况.也帮助业务部门未来的应用需求.近期也刚好在思考这个问题. ...

  8. SAP PP使用ECR去修改BOM主数据

    SAP PP使用ECR去修改BOM主数据 1,使用事务代码CC31创建好了ECR#500000012749,如下图示, 这个ECR是用于修改物料ZFG0003的BOM的. 2,CC32完成了对这个EC ...

  9. SAP中有关差异的一些概念

    1.SAP关于成本的概念 2.差异的计算方法. 3.实际成本计算方法 4.SAP variance 1.成本的概念 标准成本=标准价格 * 标准数量 + 作业价格 * 标准数量 计划成本=计划价格 * ...

  10. SAP中差异的一些概念

    1.SAP关于成本的概念 2.差异的计算方法. 3.实际成本计算方法 4.SAP variance 1.成本的概念 标准成本=标准价格 * 标准数量 + 作业价格 * 标准数量 计划成本=计划价格 * ...

最新文章

  1. 如何查看和停止Linux启动的服务
  2. 下列那些是oracle的伪列,oracle伪列
  3. Android在Context详细解释 ---- 你不知道Context
  4. P3575-[POI2014]DOO-Around the world【环形dp】
  5. Python自由职业可以做什么?副业月入3000的快乐你根本想象不到
  6. 让小黑人360度旋转的制作技巧
  7. UVA10696 f91【数学函数+打表】
  8. python concurrent.futures包使用,捕获异常
  9. HCNA认证课程—VRP基础操作总结
  10. 江苏省c语言二级刷题软件,计算机二级刷题软件
  11. java编程题代做,代做COMP 2406作业、代写Java语言作业、代做programming作业、代写Java程序实验作业...
  12. Gartner:2017年十大科技趋势盘点
  13. POR BOR LVD
  14. 一文通俗入门·脉冲神经网络(SNN)·第三代神经网络
  15. 专家调查显示:液晶电视坏眼超等离子电视
  16. 基于VGG19的识别中国人、韩国人、日本人分类器
  17. cto 技能图谱_成为CTO的关键技能是什么?
  18. 我的windows开发环境设定与日常使用指南
  19. java节假日算法_基于Java代码实现判断春节、端午节、中秋节等法定节假日的方法...
  20. 实验室天平台制作要求

热门文章

  1. 七上八下猜数字_《脑筋急转弯》
  2. 小白入门级的视频剪辑软件
  3. 【python】使用in判断元素是否在列表(list)中,如何提升搜索效率?
  4. 计算机组策略没有权限,运行组策略或程序时提示没有权限
  5. 新版火狐打开时会自动开启360导航
  6. 随笔-Python批量调整图片大小
  7. 交换机端口详细配置Trunk
  8. 双目立体相机的基线如何求?
  9. 淘宝、天猫、京东、苏宁等平台抢购脚本
  10. EXCEL表格复制到空白的EXCEL表格变形 解决方法