展开BOM

原帖地址
http://community.csdn.net/Expert/topic/3384/3384941.xml?temp=.6640436

-------------------------------------------------------------------------

--测试数据
CREATE TABLE [dbo].[BOM_DETAIL] (
 [PKID] [int] ,--IDENTITY (1, 1) NOT NULL ,
 [BOM_HEAD_PKID] [int] NOT NULL ,
 [CHILDREN_ITEM] [int] NOT NULL ,
 [QTY] [decimal](10, 0) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[BOM_HEAD] (
 [PKID] [int] ,--IDENTITY (1, 1) NOT NULL ,
 [MASTER_ITEM] [int] NOT NULL ,
 [QTY] [int] NOT NULL ,
 [VER] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [STATUS] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
) ON [PRIMARY]

CREATE TABLE [dbo].[item] (
 [item] [int] ,--IDENTITY (1, 1) NOT NULL ,
 [brand] [nvarchar] (10) ,
 [part_no] [nvarchar] (10)
) ON [PRIMARY]

insert item select 1 ,'A' ,'A1'
union  all  select 2 ,'B' ,'AAAAA'
union  all  select 3 ,'A' ,'AD'
union  all  select 4 ,'A' ,'SS'
union  all  select 5 ,'C' ,'123'
union  all  select 6 ,'C' ,'AAADSFD'
union  all  select 7 ,'D' ,'D22'
union  all  select 8 ,'C' ,'DDDD512'
union  all  select 9 ,'A' ,'AA3223'
union  all  select 10,'DD','356'

insert BOM_HEAD select 1,1,1,1,'使用中'
union  all      select 2,3,1,1,'使用中'
union  all      select 3,1,1,2,'停用'
union  all      select 4,6,1,1,'使用中'
union  all      select 5,8,1,1,'使用中'
union  all      select 6,2,1,1,'使用中'

insert BOM_DETAIL select 1, 1,2 ,1
union  all        select 2, 1,6 ,2
union  all        select 3, 2,1 ,1
union  all        select 4, 3,4 ,1
union  all        select 5, 3,5 ,1
union  all        select 6, 4,7 ,1
union  all        select 7, 4,8 ,1
union  all        select 8, 5,9 ,1
union  all        select 9, 5,10,1
union  all        select 10,6,6, 1
go

/*--表间关系说明

 BOM_HEAD表中PKID为一唯一值,同一MASTER_ITEM的STATUS只有一行为"使用中",别的都为"停用"(注:是同一MASTER_ITEM),通过MASTER_ITEM与表ITEM的ITEM相关联
 BOM_DETAIL表中通过BOM_HEAD_PKID与BOM_HEAD表相关联,通过CHIDERN_ITEM与ITEM表的ITEM相关联
--*/

/*--展开bom的说明

ITEM为1的物料的BOM组成情况:
到BOM_HEAD表中查找MASTER_ITEM=1 AND STATUS='使用中'
这样可以找到BOM_HEAD表中的PKID=1的记录
我可以从BOM_DETAIL表中根据BOM_HEAD_PKID=1可以得到MASTER_ITEM这个物料需要用到
CHILDERN_ITEM分别为2 和 6 的物料;

在BOM_HEAD中MASTER_ITEM值为6并且STATUS='使用中'
这样可以到到BOM_HEAD的PKID为4
然后再到BOM_DETAIL中找到BOM_HEAD_PKID=4的记录,这样就可以发现MASTER_ITEM为6的物料需要用到CHILDERN_ITEM分别为7和8的物料;

在BOM_HEAD中MASTER_ITEM值为8并且STATUS='使用中'
这样可以到到BOM_HEAD的PKID为45
然后再到BOM_DETAIL中找到BOM_HEAD_PKID=5的记录,这样就可以发现MASTER_ITEM为8的物料需要用到CHILDERN_ITEM为9和10的物料;
这样依次类推

最后要得到一个类示树状的结构
如下图所示
第一层  1 brand,part_no
第二层  2 brand,part_no,qty 6 brand,part_no,qty
第三层     7 brand,part_no,qty  8 brand,part_no,qty
第四层        9 brand,part_no,qty   10 brand,part_no,qty
--*/

--展开bom查询的函数
create function f_bom(
@item int
)returns @r table(
 item int,
 brand nvarchar(10),
 part_no nvarchar(10),
 QTY decimal(10,0), --取自BOM_DETAIL
 level int, --层次
 sid varchar(8000) --排序字段,通过这个来排序,可以体现出树形的层次
 )
as
begin
 declare @l int
 
 set @l=0
 insert @r select @item,brand,part_no,0,@l,right(10000+item,4)
 from item
 where item=@item
 while @@rowcount>0
 begin
  set @l=@l+1
  insert @r select i.item,i.brand,i.part_no,d.qty,@l,r.sid+','+right(10000+i.item,4)
  from item i,BOM_HEAD h,BOM_DETAIL d,@r r
  where r.level=@l-1
   and r.item=h.MASTER_ITEM
   and h.STATUS='使用中'
   and h.PKID=d.BOM_HEAD_PKID
   and d.CHILDREN_ITEM=i.item
 end
 return
end
go

--调用函数得到查询结果
select 层次=space(level*2)+'├─'
 ,item,brand,part_no,qty
from f_bom(1)
order by sid
go

--删除测试
drop table item,BOM_HEAD,BOM_DETAIL
drop function f_bom

/*--测试结果

层次           item        brand      part_no    qty  
-------------- ---------- ---------- ---------- -------
├─           1           A          A1         0
  ├─         2           B          AAAAA      1
    ├─       6           C          AAADSFD    1
      ├─     7           D          D22        1
      ├─     8           C          DDDD512    1
        ├─   9           A          AA3223     1
        ├─   10          DD         356        1
  ├─         6           C          AAADSFD    2
    ├─       7           D          D22        1
    ├─       8           C          DDDD512    1
      ├─     9           A          AA3223     1
      ├─     10          DD         356        1

(所影响的行数为 12 行)
--*/

时间: 2024-10-31 12:40:39

展开BOM的相关文章

《SAP后勤模块实施攻略—SAP在生产、采购、销售、物流中的应用》——第3章 MRP简介 3.1 MRP运行的简要说明

第3章 MRP简介 MRP(Material Requirement Planning,物料需求计划)是基于需求.供给.产品BOM结构等信息计算产生不同的获取建议(Procurement Proposal),在获取建议中包含应该在何时.采购(生产)何种物料.多少数量等各项信息,从而用来实现制造业库存管理目标,即在正确的时间按恰当的数量得到所需的物料. 本章将介绍下列内容: 3.1 MRP运行的简要说明 本节以一个例子简要说明MRP的运行过程,并解释MRP.MPS的关系.流程以及相应的系统操作.

SAP 的CALL FUNCTION 函数汇总

SAP 常用FUNCTION BOM 展开函数 CS_BOM_EXPL_MAT_V2:只展开 BOM 的函数   CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'    EXPORTING       capid = pm_capid   "应用程序 一般为 PP01       datuv = pm_datuv   "通常为系统的当前日期       mtnrv = pm_mtnrv   "要展开BOM 的物料       mehrs = 'X'    

BOM多层展开,中间半品数量不为1的问题

用户反馈当中间半品数量不为1时,半品下的物料展开时还是按一个半品的数量来展开的. BOM展开内表有三个字段 MENGE  组件数量 MNGLG  以基本计量单位为准的已计算的组件数量 MNGKO 以组件计量单位为准的已计算的组件数量 所以多层展开时,应该使用MNGLG是没有问题的.   但是当将PC等单位本来应该是整数的单位当小数来用,就会发现展开的数量就变成了1或其它整数,结果就不对了.   解决办法: 张开函数中有STUFE 层次,如果层次不为1,可能就要考虑使用下面的办法来计算.   如果

生产订单中的BOM展开日期确定

1.如果生产订单由计划订单转换生成,BOM的展开日期将从计划订单中复制过来. 2.如果生产订单是手工添加的,系统将确定展开日期如下: 如果你在生产订单创建时指定了订单开始日期,系统将采用这个日期作为BOM的展开日期. 如果你在订单创建时指定了订单结束日期,系统将计算出BOM展开日期通过订单完成日期减去物料主数据中定义的内部生产时间.

C#展开产品BOM,并且根据销售订单计算出物料的毛需求和净需求

问题描述 各位大师好,小弟编程起步,倾其所有积分,现遇一项目.具体要求如下:根据用友T6中的销售订单,计算出需要的物料毛需求和净需求.还肯定有这方面经验的大师们指点迷津.在此先谢了. 解决方案 解决方案二:您是要了解的人给您出算法,还是要做一个小程序,来实现算法?技术上没难点吧?业务需求明确了,应该很容易搞定的!解决方案三:你是问物料毛需求和净需求怎么算么?这个问你单位的人解决方案四:引用1楼u010192842的回复: 您是要了解的人给您出算法,还是要做一个小程序,来实现算法?技术上没难点吧?

ERP系统中与BOM有关的常用方法

erp 一: BOM展开(按任一父结点展开到最底层)以下写一个简单的,视具体要求稍做修改即可.create table 表(levelid int,levelname char(2),parent int)insert 表 select  1,        'AA'     ,    0union all select  2 ,       'BB'    ,     1union all select  3  ,      'CC'   ,      1union all select  4

BOM在电子商务网站中的应用

我们讨论的BOM是狭义的BOM,与ERP中用于生产的BOM有很大区别.同时,我们讨论的主要是B2B平台,更细致的限制为:工业品的B2B平台. 一. 什么是BOM BOM是一个泊来品,其英文全称为Bill of Material,中文翻译为BOM. 字面翻译为[物料清单]或[产品结构表],在某些工业领域,也有些ERP软件称之为[配方].[要素表]. BOM在ERP软件中表现最为彻底,在ERP中,BOM是MRP(物资需求计划,Material Requirement Planning)的重要文件.

SAP BOM详细解析

一.产品结构--BOM的重要性 BOM(Bill of Material) 叫做物料清单,也叫产品结构表.物料表等. 将产品的原材料.零配件.组合件予以拆解,并将各单项物料按物料代码.品名.规格.单位用量.损耗等依制造流程的顺序记录下来,排列为一个清单,这就是物料清单,也就是BOM. BOM是: (1) MRP的基础. (2) 制造令发料的计算依据. (3) 本质上是一项工程文件,不但是产品的规范说明,而且是制造流程的依据. (4) 用来核算产品成本的基础. 由以上知道BOM的重要性及其影响范围

JS+CSS实现的简单折叠展开多级菜单效果_javascript技巧

本文实例讲述了JS+CSS实现的可折叠展开多级菜单效果.分享给大家供大家参考.具体如下: 这是一款JS+CSS实现的多级折叠菜单,可折叠展开/合拢,没有引用任何的外部文件,也没有用到图片,虽然简单,而且还有些粗糙,但核心的东西已经展示给大家了,正在研究折叠菜单的朋友们,这一个小例子可能正是你需要的,好好研究一下吧. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-css-simple-zdzk-menu-style-codes/ 具体代码如