日期:2014-05-18  浏览次数:20692 次

求助邹建老师!!! 关于BOM的问题 再现等!!!!!!!!!!!!!!

一个产品下可以有多个零件,这些零件还有不同的层次关系。(请问零件还有不同的层次关系是什么意思) 
零件属性 说明 
产品编号 字符串类型,并且只能是大写字母和数字。最长是10个字符长。 
产品名称 字符串类型。最长是50个全角字符的长度。 
出厂日期 产品的出厂日期。日期类型。 

零件的属性 
属性 说明 
零件编号 字符串类型,并且只能是大写字母和数字。最长是10个字符长。 
零件名称 字符串类型。最长是50个全角字符的长度。 
零件数量 零件在BOM中的数量。自然数类型。 
零件层次 零件在BOM中的层次。自然数类型。 
零件单位 零件的计量单位。为枚举值:个、条、盒。 


Productbuf 产品表 
字段 长度 类型 说明 
ID 8 bigint id 
Product_Num 10 varchar` 产品编号 主键 
Product_Name 100 varchar 产品名称 
Stamp 8 datetime` 时间标志 

partsbuf 零件表 
字段 长度 类型 说明 
ID 8 Bigint 主键 
Product_Num 10 varchar` 产品编号 
Parts_Num 10 varchar 零件编号 
Parts_Name 100 varchar` 零件名称 
Parts_Count 4 int 零件数量 
Parts_Flag 4 int 零件层次 
Parts_Units 4 int 零件单位(0:个、1:条、2盒) 

ID 产品编号 零件名称 零件编号 零件数量 零件层次 零件单位 
1 a &&&&&&&& a1 3 0 1 
2 a &&&&&&&& a2 4 1 1 
3 a &&&&&&&& a3 5 1 1 
4 a &&&&&&&& a4 6 2 1 

bom展开 


  a1 
  a2 
  a3 
那么a4应该在a3下还是在a2下呢? 
如果在加上一个子零件编号那么还用零件层次么? 如果用怎么展开呢?

------解决方案--------------------
CREATE TABLE BOM(PID INT,ID INT)
INSERT INTO BOM SELECT 801,101
INSERT INTO BOM SELECT 801,102
INSERT INTO BOM SELECT 801,103
INSERT INTO BOM SELECT 801,601
INSERT INTO BOM SELECT 601,101
INSERT INTO BOM SELECT 601,105
INSERT INTO BOM SELECT 601,501
INSERT INTO BOM SELECT 501,106
INSERT INTO BOM SELECT 501,121
GO

CREATE FUNCTION F_GETROOT(@PID INT)
RETURNS INT
AS
BEGIN
DECLARE @ID INT
WHILE EXISTS(SELECT 1 FROM BOM WHERE ID=@PID)
BEGIN
SET @ID=@PID
SELECT @PID=PID FROM BOM WHERE ID=@ID
END
RETURN @PID
END
GO

SELECT PID=DBO.F_GETROOT(PID),ID FROM BOM
GO

/*
PID ID
----------- ----------- 
801 101
801 102
801 103
801 601
801 101
801 105
801 501
801 106
801 121
*/


DROP FUNCTION F_GETROOT
DROP TABLE BOM
GO




--生成测试数据
create table BOM_1(Item int,bom_head varchar(20),bom_child varchar(20),number int,products_attribute varchar(20))
insert into BOM_1 select 1 ,'A' ,'A1',1,'采购'
insert into BOM_1 select 2 ,'A' ,'A2',2,'生产'
insert into BOM_1 select 3 ,'A2','A3',3,'生产'
insert into BOM_1 select 4 ,'A2','A4',2,'采购'
insert into BOM_1 select 5 ,'A3','A5',2,'采购'
insert into BOM_1 select 6 ,'A3','A6',1,'采购'
insert into BOM_1 select 7 ,'B' ,'B1',1,'采购'
insert into BOM_1 select 8 ,'B' ,'B2',2,'生产'
insert into BOM_1 select 9 ,'B2','B3',3,'生产'
insert into BOM_1 select 10,'B2','B4',2,'采购'
insert into BOM_1 select 11,'B3','B5',2,'采购'
insert into BOM_1 select 12,'B3','B6',2,'采购'
go
 

--创建用户定义函数,用于取每个父节点下子节点的采购配置信息
create function f_stock(@bom_head varchar(20))
returns @t table(bom varchar(20),number int)
as
begin 
declare @level int
declare @a table(bom varchar(20),number int,products_attribute varchar(20),[level] int)
set @level=1

if exists(select 1 from BOM_1 where bom_head=@bom_head)
insert into @a 
selec