原理:让这个小公司先把所有原材料,半成品,成品都编上号,然后用户通过界面在数据库里面相应就建立一个表存放相关信息,可以反映是否原材料,半成品,成品信息和半成品,成品的组成成分建立两个表:
ProdTypeName,ProdInfo
执行脚本如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ProdInfo_ProdType]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[ProdInfo] DROP CONSTRAINT FK_ProdInfo_ProdType
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ProdInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ProdInfo]
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ProdType]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ProdType]
GOCREATE TABLE [dbo].[ProdInfo] (
[ProdID] [int] IDENTITY (1, 1) NOT NULL ,
[fProdID] [int] NOT NULL ,
[TypeID] [int] NOT NULL ,
[ProdName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL 
) ON [PRIMARY]
GOCREATE TABLE [dbo].[ProdType] (
[TypeID] [int] IDENTITY (1, 1) NOT NULL ,
[TypeName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL 
) ON [PRIMARY]
GO
--脚本结束
注意fProdID是该材料[可以是原材料,半成品,成品]来原材料的ID,在同一个表中,默认为零,表示该材料在本系统就没有来源了[原材料或者购进]。例如:
TypeID         TypeName
-----------------------
1              原材料
2              半成品
3              成品下面数据TypeID对应上面表的编号
ProdID         fProdID          TypeID           ProdName
-----------------------------------------------------------
1              0                1                原木材
2              0                1                原回收垃圾
3              2                1                原回收分类垃圾[铁制品]
4              3                2                回收垃圾铁制提炼品
可以编写存储过程循环查询fProdID<> 0的数据,一直找到fProdID = 0 或者找不到数据为止,最后那条记录就是该产品的源头。
前提是你要做好数据录入的限制,没有源头就必须输入fProdID为零,
这两个表无论是分类汇总[用视图即可]还是查询流水线[存储过程]都可以。