--简单的管理,这样设计就可以了.--库存统计示例:--数据测试环境
create table 物料明细表(物料ID varchar(6) primary key
,名称 varchar(8) not null
,规格 varchar(10)
,颜色 varchar(4)
,单位 varchar(4)
,所属类别 varchar(6))create table 进仓主表 (进仓ID varchar(20) primary key
,供应商ID varchar(10)
,进仓日期 datetime
,原凭证号 varchar(10)
,入库类型 int)create table 进仓明细表 (进仓ID varchar(20) not null
,物料ID varchar(6) not null
,数量 decimal(20,2))alter table 进仓明细表 add constraint PK_进仓明细表 PRIMARY KEY CLUSTERED (进仓ID,物料ID)create table 出仓主表 (出仓ID varchar(20) primary key
,部门ID varchar(10)
,领料日期 datetime
,领料单号 varchar(10)
,出库类型 varchar(1))create table 出仓明细表 (出仓ID varchar(20) not null
,物料ID varchar(6) not null
,数量 decimal(20,2))
alter table 出仓明细表 add constraint PK_出仓明细表 PRIMARY KEY CLUSTERED (出仓ID,物料ID)
go--添加表间关系
ALTER TABLE dbo.进仓明细表 ADD CONSTRAINT FK_进仓明细表_进仓主表 FOREIGN KEY
(进仓ID) REFERENCES dbo.进仓主表(进仓ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.进仓明细表 ADD CONSTRAINT FK_进仓明细表_物料明细表 FOREIGN KEY
(物料ID) REFERENCES dbo.物料明细表(物料ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.出仓明细表 ADD CONSTRAINT FK_出仓明细表_出仓主表 FOREIGN KEY
(出仓ID) REFERENCES dbo.出仓主表(出仓ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEALTER TABLE dbo.出仓明细表 ADD CONSTRAINT FK_出仓明细表_物料明细表 FOREIGN KEY
(物料ID) REFERENCES dbo.物料明细表(物料ID) 
 ON UPDATE CASCADE
 ON DELETE CASCADEgo
--为数据数据处理添加视图
create view qry进仓单
as
select b.物料ID,a.进仓日期,进仓数量=sum(b.数量)
from 进仓主表 a join 进仓明细表 b on a.进仓ID=b.进仓ID
group by b.物料ID,a.进仓日期go
create view qry出仓单
as
select b.物料ID,出仓日期=a.领料日期,出仓数量=sum(b.数量)
from 出仓主表 a join 出仓明细表 b on a.出仓ID=b.出仓ID
group by b.物料ID,a.领料日期go
create view qry进出记录
as
select 物料ID=isnull(a.物料ID,b.物料ID)
,a.进仓日期,进仓数量=sum(a.进仓数量)
,b.出仓日期,出仓数量=sum(b.出仓数量)
,日期=isnull(a.进仓日期,b.出仓日期)
from qry进仓单 a full join qry出仓单 b
on a.物料ID=b.物料ID and a.进仓日期=b.出仓日期
group by isnull(a.物料ID,b.物料ID),a.进仓日期,b.出仓日期,isnull(a.进仓日期,b.出仓日期)go
--初始化数据
insert into 物料明细表
select 'A-001','皮纸','20×30×50','红','张','纸'
union all select 'B-002','磁铁','20×10×50','','块','五金'insert into 进仓主表
select 'J-20031015-001','SA001','2003-10-15','123456',1
union all select 'J-20031015-002','SA002','2003-10-15','123457',1
union all select 'J-20031017-001','SA002','2003-10-17','123456',2insert into 进仓明细表
select 'J-20031015-001','A-001',200
union all select 'J-20031015-002','B-002',99
union all select 'J-20031017-001','A-001',150.5insert into 出仓主表
select 'C-20031015-001','Dept_P','2003-10-15','1111111','P'
union all select 'C-20031016-001','Dept_P','2003-10-16','1111112','P'insert into 出仓明细表
select 'C-20031015-001','A-001',50
union all select 'C-20031016-001','A-001',50
go
--得到要求的结果
--进出记录表
select a.*
,进仓日期=convert(varchar(10),b.进仓日期,120),b.进仓数量
,出仓日期=convert(varchar(10),b.出仓日期,120),b.出仓数量
,当前库存=isnull((select sum(进仓数量) from qry进仓单 where 物料ID=a.物料ID and 进仓日期<=b.日期),0)
-isnull((select sum(出仓数量) from qry出仓单 where 物料ID=a.物料ID and 出仓日期<=b.日期),0)
from 物料明细表 a left join qry进出记录 b on a.物料ID=b.物料ID
order by a.物料ID,b.日期--当前库存表
select a.*,b.当前库存
from 物料明细表 a left join (
select 物料ID,当前库存=isnull(sum(进仓数量),0)-isnull(sum(出仓数量),0) from qry进出记录 group by 物料ID
)b on a.物料ID=b.物料ID
order by a.物料IDgo
--删除测试环境
drop view qry进仓单,qry出仓单,qry进出记录
drop table 进仓明细表,出仓明细表,物料明细表,进仓主表,出仓主表

解决方案 »

  1.   

    你可以再做张盘点表和盘点明细表。。
    create table 盘点主表 (盘点ID varchar(20) primary key
    ,仓库ID varchar(10)
    ,盘点日期 datetime
    ,领料单号 varchar(10))
    create table 盘点明细表 (盘点ID varchar(20) not null
    ,物料ID varchar(6) not null
    ,库存数量 decimal(20,2)
             实际数量decimal(20,2))ALTER TABLE dbo.盘点明细表 ADD CONSTRAINT FK_盘点明细表_物料明细表 FOREIGN KEY
    (物料ID) REFERENCES dbo.物料明细表(物料ID) 
     ON UPDATE CASCADE
     ON DELETE CASCADE
    可以在这两张表上进行库存操作
      

  2.   

    --1.日记账就是进出记录表加日期限制,可以实现指定日期到指定日期的报表--进出记录表
    select a.*
    ,进仓日期=convert(varchar(10),b.进仓日期,120),b.进仓数量
    ,出仓日期=convert(varchar(10),b.出仓日期,120),b.出仓数量
    ,当前库存=isnull((select sum(进仓数量) from qry进仓单 where 物料ID=a.物料ID and 进仓日期<=b.日期),0)
    -isnull((select sum(出仓数量) from qry出仓单 where 物料ID=a.物料ID and 出仓日期<=b.日期),0)
    from 物料明细表 a left join qry进出记录 b on a.物料ID=b.物料ID
    where b.日期 between '2003-01-01' and '2003-01-01'       --加上日期就行了.
    order by a.物料ID,b.日期
      

  3.   

    我的进仓有两种:采购进仓、余料退仓。
    出仓的也是两种:生产领料、采购退货。如果只有这两种,可以直接在单据编号上区分.
    JJ 表示采购进仓      JT 表示余料退仓
    JJ-00001    表示采购进仓
    JT-000001    表示余料退仓出仓类似.
    也可以加多一个单据类型,来区别
      

  4.   

    --盘点表可以由当前库存生成select a.*,b.当前库存,盘点数量=0
    into 盘点表 
    from 物料明细表 a left join (
    select 物料ID,当前库存=isnull(sum(进仓数量),0)-isnull(sum(出仓数量),0) from qry进出记录 group by 物料ID
    )b on a.物料ID=b.物料ID
    order by a.物料ID
      

  5.   

    前台由用户输入盘点数量.
    保存后,根据实际库存与盘点数量的差异.生成盘亏/盘盈单.
    库存的问题,因为这只是一个简单的例子.所以库存是实时计算的.
    数据量多时,你应该考虑每个月做结转.增加一个专门的库存表.
    create table 库存表(年月 varchar(6) not null,物料id varchar(6) not null,期初库存数量 decimal(20,2))
    alter table 库存表 add constraint PK_库存表 PRIMARY KEY CLUSTERED (年月,物料ID)并将入/出仓单加上年月字段,用年月+单据编号做复合主键.每个月,月结的时候,生成下个月的期初库存.
    这样,计算当前的实时库存,就只需要用: 
    期初库存数量+本月入仓-本月出仓
    就可以了.
      

  6.   

    怎么有这么恐怖的人.......
    zjcxc(邹建) 我太佩服了。
      

  7.   

    zjcxc(邹建) 主要是我对进销存原理不清楚。我们工厂管理也是一团糟。
    现在主要是用程序来规范。
    你能把具体步骤写出来发给我吗?^_^
    不知道怎么感谢了!!!!
      

  8.   

    http://www.codestudy.net/book/list.asp?id=1001
    简介:
         Delphi进销存程序设计(含源代码)
      

  9.   

    对进销存原理不清楚。我们工厂管理也是一团糟去这里下载源程序.
    http://www.codestudy.net/codesource/default.asp这样解释很难说清楚
      

  10.   

    完了,我是用vb.net的,谢谢大家!
      

  11.   

    问题又出来了,
    我的意思是:入库明细表:入库ID,数量,备注
    采购入库主表:入库ID,供应商ID...
    作料退仓表:入库ID,部门ID...
    但是这样麻烦出来了,入库明细表的入库ID怎么和采购入库主表、余料退仓主表建立关系呢?  我想建立级联删除的关系。如果是两个表,供应商ID和部门ID又怎么和供应商表、部门表建立级联更新的关系呢?
    谢谢各位!