我现在理解的库存算法是这样的.
比如说,现在是3月8日,上个月的28日进行了最后的库存确认为1000,
现在要查看最新的库存,
那么,算法是这样.
3月8日库存: 期初(2月28)1000,3月1日到3月8日业务数据为-200(包括很多出库入库业务), 那么现在的库存是 1000-200=800,
是这样咯.那么我有个这样的困惑,
一,这个2月28日的库存数是可以因为什么业务而插入到库存表的,是因为盘点?月结?
二,如果是这样的库存算法,当业务数据非常多时,统计很费时间,有什么好的方法没?
三,盘点审核了后,库存应该是怎样的改动?
四,是不是一般都应该设定这样的规则:系统设定.某天之前的库存数是不允许变动,在某天之前的所有出入库业务都不能改变?
比如说,现在是3月8日,上个月的28日进行了最后的库存确认为1000,
现在要查看最新的库存,
那么,算法是这样.
3月8日库存: 期初(2月28)1000,3月1日到3月8日业务数据为-200(包括很多出库入库业务), 那么现在的库存是 1000-200=800,
是这样咯.那么我有个这样的困惑,
一,这个2月28日的库存数是可以因为什么业务而插入到库存表的,是因为盘点?月结?
二,如果是这样的库存算法,当业务数据非常多时,统计很费时间,有什么好的方法没?
三,盘点审核了后,库存应该是怎样的改动?
四,是不是一般都应该设定这样的规则:系统设定.某天之前的库存数是不允许变动,在某天之前的所有出入库业务都不能改变?
id int identity(1,1),
name varchar(50),--商品名称
j int, --入库数量
c int, --出库数量
jdate datetime --入库时间
)
insert into t(name,j,c,jdate) select 'A',100,0,'2007-12-01'
insert into t(name,j,c,jdate) select 'A',200,0,'2008-01-07'
insert into t(name,j,c,jdate) select 'B',320,0,'2007-12-21'
insert into t(name,j,c,jdate) select 'A',100,0,'2008-01-15'
insert into t(name,j,c,jdate) select 'B',90,0,'2008-02-03'
insert into t(name,j,c,jdate) select 'A',460,0,'2008-02-01'
insert into t(name,j,c,jdate) select 'A',510,0,'2008-03-01'
gocreate proc wsp
@name varchar(50),--商品名称
@cost int --销售量
as
--先得出该货物的库存是否够
declare @spare float --剩余库存
select @spare=sum(j)-sum(c) from t where name=@name
if(@spare>=@cost)
begin
--根据入库日期采用先进先出原则对货物的库存进行处理
update t set c=
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<=a.jdate and j!=c)>=0
then a.j
else
case when (select @cost-isnull(sum(j),0)+isnull(sum(c),0) from t where name=@name and jdate<a.jdate and j!=c)<0 then 0
else (select @cost-isnull(sum(j),0)+isnull(sum(c),0)+a.c from t where name=@name and jdate<a.jdate and j!=c)
end
end
from t a where name=@name and j!=c
end
else
raiserror('库存不足',16,1)
return
go
--测试:exec wsp @name='A',@cost=180
select * from t
--drop table t
--drop proc wsp
还是建议你找个进销存或ERP系统看看.
对,最好有这样的明细:
上期结存 本期进仓 本期出仓 本期结存
1000 0 200 800
1、到2月28日为止的库存,并不是什么盘点单、月结什么的,是到2月28日所有单据发生的累加,库存=进仓单+(-采购退货)+调入-调出-销售-(-销售退货)+盘盈-盘亏2、业务单据非常多时,统计是比较费时间,有两个方法:第1、用余额表,所相关的单据审核后写入余额表,第2、不用余额表,直接写SQL语句,但是要优化SQL语句,也可以让客户接受的速度。3、盘点审核后,就是实盘数量-帐面数量,如果大于0则盘盈,帐面数量增加,小于0,帐面数量减少,目的是使帐面数量与实盘数量一致。4、如果你用到余额表了,你就要设定某天之前库存是不允许改变的。如果不用余额表,原单据统计的话,这个无所谓,但在开单时要限定,不能在这个期间里不能再录入单据了。