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

有些难度的问题(BOM多级展开)
SQL code

-->1.物料表 t_IC_Item
IF OBJECT_ID ('t_IC_Item') IS NOT NULL 
  DROP TABLE t_IC_Item
GO

CREATE TABLE t_IC_Item
(
  FItemID int,         --物料内码
  FNumber varchar(200),--物料代码
  FName varchar(200),  --物料名称
  FModel varchar(200), --规格型号
  FUnitID int,         --基本单位内码  
  FErpClsID int        --物料属性(1-外购 2-自制 3-委外加工)
)
GO

INSERT t_IC_Item
  SELECT 1,'CP.001','产品1','产品规格1',1,2 UNION 
  SELECT 2,'BC.001','半成品1','半成品规格1',1,2 UNION
  SELECT 3,'BC.002','半成品2','半成品规格2',1,2 UNION
  SELECT 4,'BC.003','半成品3','半成品规格3',1,3 UNION
  SELECT 5,'BC.004','半成品4','半成品规格4',1,2 UNION
  SELECT 6,'ZC.001','主材料1','主材料规格1',1,1 UNION  
  SELECT 7,'ZC.002','主材料2','主材料规格2',1,1 UNION  
  SELECT 8,'ZC.003','主材料3','主材料规格3',1,1 UNION  
  SELECT 9,'ZC.004','主材料4','主材料规格4',1,1 UNION  
  SELECT 10,'ZC.005','主材料5','主材料规格5',1,1 UNION  
  SELECT 11,'ZC.006','主材料6','主材料规格6',1,1 UNION  
  SELECT 12,'ZC.007','主材料7','主材料规格7',1,1 UNION  
  SELECT 13,'ZC.008','主材料8','主材料规格8',1,1 UNION  
  SELECT 14,'ZC.009','主材料9','主材料规格9',1,1 UNION  
  SELECT 15,'ZC.010','主材料10','主材料规格10',1,1 UNION  
  SELECT 16,'ZC.011','主材料11','主材料规格11',1,1 UNION  
  SELECT 17,'ZC.012','主材料12','主材料规格12',1,1 
GO

--SELECT * FROM t_IC_Item

-->2.计量单位表
IF OBJECT_ID ('t_Unit') IS NOT NULL
  DROP TABLE t_Unit
GO
CREATE TABLE t_Unit
(
  FID int,
  FName varchar(20)--,
  --FCoeffiCient int --换算率
)
GO
INSERT t_Unit SELECT 1,'个'
GO

-->3.BOM主表
IF OBJECT_ID ('t_BOM') IS NOT NULL
  DROP TABLE t_BOM
GO
CREATE TABLE t_BOM 
( 
  FID int,  --自增列,主键
  FBomNo varchar(200),
  FItemID int,
  FQty decimal(28,10),
  FUnitID int
)
GO
INSERT t_BOM 
  SELECT 1,'BOM01',1,1,1 UNION
  SELECT 2,'BOM02',2,1,1 UNION
  SELECT 3,'BOM03',3,1,1 UNION
  SELECT 4,'BOM04',4,1,1 UNION
  SELECT 5,'BOM05',5,1,1 
GO

-->4.BOM分录表
IF OBJECT_ID ('t_BOMChild') IS NOT NULL
  DROP TABLE t_BOMChild
GO

CREATE TABLE t_BOMChild 
( 
  FID int, --BOM主表的外键
  FEntryID int, --行号
  FItemID int,
  FQty decimal(28,10),
  FUnitID int
)
GO

INSERT t_BOMChild  --CP.001 BOM内容
  SELECT 1,1,2,1,1 UNION
  SELECT 1,2,3,1,1 UNION
  SELECT 1,3,15,1,1 UNION
  SELECT 1,4,17,1,1

INSERT t_BOMChild  --BC.001 BOM内容
  SELECT 2,1,6,1,1 UNION
  SELECT 2,2,7,1,1 

INSERT t_BOMChild  --BC.002 BOM内容
  SELECT 3,1,8,1,1 UNION
  SELECT 3,2,9,1,1 UNION
  SELECT 3,3,7,1,1 UNION
  SELECT 3,4,4,1,1 

INSERT t_BOMChild  --BC.003 BOM内容
  SELECT 4,1,10,1,1 UNION
  SELECT 4,2,11,1,1 UNION
  SELECT 4,3,5,1,1 

INSERT t_BOMChild  --BC.004 BOM内容
  SELECT 5,1,12,1,1 UNION
  SELECT 5,2,13,1,1 UNION
  SELECT 5,3,14,1,1 UNION
  SELECT 5,4,16,1,1 UNION
  SELECT 5,5,7,1,1
GO

/*
想要的结果:
序号  层次   物料代码   物料名称   物料规格     物料属性  用量  单位      BOM展开状态
1     0      CP.001    产品1     产品规格1     自制      1    个       正常
2     .1     BC.001    半成品1  半成品规格1    自制      1    个        正常
3     ..2    ZC.001    主材料1  主材料规格1    外购      1    个        
4     ..2    ZC.002    主材料2  主材料规格2    外购      1    个        
5     .1     BC.002    半成品2  半成品规格2    自制      1    个        正常        
6     ..2    ZC.003    主材料3  主材料规格3    外购      1    个     
7     ..2    ZC.004    主材料4  主材料规格4    外购      1    个
8     ..2    ZC.002    主材料2  主材料规格2    外购      1    个
9     ..2    BC.003    半成品3  半成品规格3    委外加工  1    个        正常
10    ...3   ZC.005    主材料5  主材料规格5    外购      1    个
11    ...3   ZC.006    主材料6  主材料规格6    外购      1    个
12    ...3   BC.004    半成品4  半成品规格4    自制      1    个        正常
13    ....4  ZC.007    主材料7  主材料规格7    外购      1    个
14    ....4  ZC.008    主材料8  主材料规格8    外购      1    个
15    ....4  ZC.009    主材料9  主材料规格9    外购      1    个
16    ....4  ZC.011    主材料11  主材料规格11  外购      1    个
17    ....4  ZC.002    主材料2  主材料规格2    外购      1    个
18    .1     ZC.010    主材料10  主材料规格10  外购      1    个
19    .1     ZC.012    主材料12  主材料规格12  外购      1    个
*/



说明:以上分别为各相关表结构和一些测试数据,现想建一函数或存储过程(传入内容为产品代码或半成品代码),通过物料表的物料属性(外购,自制,委外加工),当t_BOMChi