仔细看看如下做法吧(不是我设计的):
/*
<01 3> cpjg: 产品组成结构数据表(树状层次结构)
wlPID, wlID在本表中构成一联合单值约束,即每一单独的wlID可以有(或对应于)多个不同的wlPID
(双亲件),但不允许有多个相同的wlID属于同一个wlPID。
wlID的层次码idLEvel说明其在产品结构树中所处的当前位置。idlevel<>0的同一个wlID可以在整个产
品结构树中多次出现但应满足上面所提到过的约束条件。
当wlID的层次码idLevel=0时,该wlID一般来说是一个单独的产品或产品系列,这时,其上级物料代码
wlPID为空值。
当wlID的idLevel=0时,该wlID也可以代表一个单独的通用产品组成部件(组件),这时,其wlPID为
空值。实际应用中,该组件通常作为可选组件被插入到产品树的适当位置。为避免歧义,建议不采用这
种处理方式。
本表设计特点为:
如果某wlID不是叶而是一个节点(子树),则其整体子树结构在本表中只需完整的输入一次,其它
用到该节点(子树)的地方只需要将其挂上即可。因此,生成某结点(子树)的物料清单BOM1时,层次
idLevel不应该成为一个选择条件或选择因素,亦即:BOM1的生成过程与idLevel无关。
注:BOM1为该产品的最终出产装配总需求清单,BOM1也可以是某主生产计划中各相关需求和独立需求的
最后汇总计算结果,称为MPS毛需求BOM。
数量计量数据类型定义为decimal(18, 6)是为了适应化工行业的数值计量需求而专门设置,最终的数据
显示格式由软件的用户界面设定之。
标记F0用来指示物料的被选择情况,'y'选用,'n'不选用。
注意,如果需要去掉当前树中的某子树,只需要将该子树的根结点标记为'n'即可,该子树的下属各节点
和叶不需要逐个标记。一旦某子树的根节点被标记为'n',在其后的BOM1生成过程中,会自动排除组成该
子树的所有成员。
又及,产品A和产品B的组成结构均含有某子树G,G是一个可供选择订货的部件。根据用户的订单要求产品
A选用G部件,产品B不选用G部件:您应该,分别生成BOM1(A)和BOM1(B)。在产生BOM1(B)前,将G
部件的选用属性设置为'n',再运行生成程序。视需要可以合并BOM(A)和BOM(B)。
*/
if exists (select * from sysobjects
where id = object_id(N'[dbo].[cpjg]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[cpjg]
GO
CREATE TABLE [dbo].[cpjg] (
[dSN] [int] IDENTITY (1, 1) NOT NULL , --单值索引,刷新后定位使用。
[wlPID] [varchar] (30) NULL , --物料所属的双亲件代码
[wlID] [varchar] (30) NOT NULL , --物料代码
[idLevel] [int] NULL , --物料所在层次(只有零级需要指定,必须输入之)
[sl1] [decimal](18, 6) NULL , --规格1数量(共十六种规格)
[sl2] [decimal](18, 6) NULL , --…………
[sl3] [decimal](18, 6) NULL ,
[sl4] [decimal](18, 6) NULL ,
[sl5] [decimal](18, 6) NULL ,
[sl6] [decimal](18, 6) NULL ,
[sl7] [decimal](18, 6) NULL ,
[sl8] [decimal](18, 6) NULL ,
[sl9] [decimal](18, 6) NULL ,
[sl10] [decimal](18, 6) NULL ,
[sl11] [decimal](18, 6) NULL ,
[sl12] [decimal](18, 6) NULL ,
[sl13] [decimal](18, 6) NULL ,
[sl14] [decimal](18, 6) NULL ,
[sl15] [decimal](18, 6) NULL , --…………
[sl16] [decimal](18, 6) NULL , --规格16数量
[F0] [varchar](2) NULL --物料选用标记('y' or 'n')
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[cpjg] WITH NOCHECK ADD
CONSTRAINT [DF_cpjg_sl1] DEFAULT (0) FOR [sl1],
CONSTRAINT [DF_cpjg_sl2] DEFAULT (0) FOR [sl2],
CONSTRAINT [DF_cpjg_sl3] DEFAULT (0) FOR [sl3],
CONSTRAINT [DF_cpjg_sl4] DEFAULT (0) FOR [sl4],
CONSTRAINT [DF_cpjg_sl5] DEFAULT (0) FOR [sl5],
CONSTRAINT [DF_cpjg_sl6] DEFAULT (0) FOR [sl6],
CONSTRAINT [DF_cpjg_sl7] DEFAULT (0) FOR [sl7],
CONSTRAINT [DF_cpjg_sl8] DEFAULT (0) FOR [sl8],
CONSTRAINT [DF_cpjg_sl9] DEFAULT (0) FOR [sl9],
CONSTRAINT [DF_cpjg_sl10] DEFAULT (0) FOR [sl10],
CONSTRAINT [DF_cpjg_sl11] DEFAULT (0) FOR [sl11],
CONSTRAINT [DF_cpjg_sl12] DEFAULT (0) FOR [sl12],
CONSTRAINT [DF_cpjg_sl13] DEFAULT (0) FOR [sl13],
CONSTRAINT [DF_cpjg_sl14] DEFAULT (0) FOR [sl14],
CONSTRAINT [DF_cpjg_sl15] DEFAULT (0) FOR [sl15],
CONSTRAINT [DF_cpjg_sl16] DEFAULT (0) FOR [sl16],
CONSTRAINT [DF_cpjg_F0] DEFAULT ('y') FOR [F0]
GO
--insert into cpjg (wlID,idLevel, sl1) values ('M1', 0, 1) --初始化表
--aGO
CREATE UNIQUE INDEX [IX_cpjg] ON [dbo].[cpjg]([wlPID], [wlID]) ON [PRIMARY]
GO
CREATE UNIQUE INDEX [IX_cpjg_1] ON [dbo].[cpjg]([dSN]) ON [PRIMARY]
GO
GRANT REFERENCES , SELECT , UPDATE , INSERT , DELETE ON [dbo].[cpjg] TO [etdbusers]
GO