有些难度的有关问题(BOM多级展开)
有些难度的问题(BOM多级展开)
说明:以上分别为各相关表结构和一些测试数据,现想建一函数或存储过程(传入内容为产品代码或半成品代码),通过物料表的物料属性(外购,自制,委外加工),当t_BOMChild 表内对应的FItemID的物料属性为"自制"或"委外加工"的时候,自动展开该物料BOM至最底层,并且记录该展开状态("正常"或"BOM未建"),请各路DX帮助!
- 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_BOMChild 表内对应的FItemID的物料属性为"自制"或"委外加工"的时候,自动展开该物料BOM至最底层,并且记录该展开状态("正常"或"BOM未建"),请各路DX帮助!