库存算法,有什么好的方法?

fiveandfive 2010-03-08 03:44:33
我现在理解的库存算法是这样的.
比如说,现在是3月8日,上个月的28日进行了最后的库存确认为1000,
现在要查看最新的库存,
那么,算法是这样.
3月8日库存: 期初(2月28)1000,3月1日到3月8日业务数据为-200(包括很多出库入库业务), 那么现在的库存是 1000-200=800,
是这样咯.

那么我有个这样的困惑,
一,这个2月28日的库存数是可以因为什么业务而插入到库存表的,是因为盘点?月结?
二,如果是这样的库存算法,当业务数据非常多时,统计很费时间,有什么好的方法没?
三,盘点审核了后,库存应该是怎样的改动?
四,是不是一般都应该设定这样的规则:系统设定.某天之前的库存数是不允许变动,在某天之前的所有出入库业务都不能改变?
...全文
416 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fiveandfive 2010-03-10
  • 打赏
  • 举报
回复
非常谢谢 fstao 等大哥.
fstao 2010-03-09
  • 打赏
  • 举报
回复
引用楼主 fiveandfive 的回复:
我现在理解的库存算法是这样的.
比如说,现在是3月8日,上个月的28日进行了最后的库存确认为1000,
现在要查看最新的库存,
那么,算法是这样.
3月8日库存: 期初(2月28)1000,3月1日到3月8日业务数据为-200(包括很多出库入库业务), 那么现在的库存是 1000-200=800,
是这样咯.


对,最好有这样的明细:
上期结存 本期进仓 本期出仓 本期结存
1000 0 200 800

引用楼主 fiveandfive 的回复:
那么我有个这样的困惑,
一,这个2月28日的库存数是可以因为什么业务而插入到库存表的,是因为盘点?月结?
二,如果是这样的库存算法,当业务数据非常多时,统计很费时间,有什么好的方法没?
三,盘点审核了后,库存应该是怎样的改动?
四,是不是一般都应该设定这样的规则:系统设定.某天之前的库存数是不允许变动,在某天之前的所有出入库业务都不能改变?


1、到2月28日为止的库存,并不是什么盘点单、月结什么的,是到2月28日所有单据发生的累加,库存=进仓单+(-采购退货)+调入-调出-销售-(-销售退货)+盘盈-盘亏

2、业务单据非常多时,统计是比较费时间,有两个方法:第1、用余额表,所相关的单据审核后写入余额表,第2、不用余额表,直接写SQL语句,但是要优化SQL语句,也可以让客户接受的速度。

3、盘点审核后,就是实盘数量-帐面数量,如果大于0则盘盈,帐面数量增加,小于0,帐面数量减少,目的是使帐面数量与实盘数量一致。

4、如果你用到余额表了,你就要设定某天之前库存是不允许改变的。如果不用余额表,原单据统计的话,这个无所谓,但在开单时要限定,不能在这个期间里不能再录入单据了。
year2005 2010-03-08
  • 打赏
  • 举报
回复
前两个问题,你可以在物料表中加一个结存字段。记录最新的库存数。
第三个问题,需要把盘差加入库存。
第四问题,盘点后,也可能会补上更早先的记录。只要盘点后的库存数保持不变就行了。但是记录审核之后,是不再允许变更早先的记录了。
dawugui 2010-03-08
  • 打赏
  • 举报
回复
你这个需求涉及到先进先出,错误冲账等问题.
还是建议你找个进销存或ERP系统看看.
ws_hgo 2010-03-08
  • 打赏
  • 举报
回复
先看下..............
fiveandfive 2010-03-08
  • 打赏
  • 举报
回复
大哥们可以和我举例一下常见的吗?我现在连一种都不敢确认是这么做...
谢谢你们.
--小F-- 2010-03-08
  • 打赏
  • 举报
回复
--库存先进先出简单例子:

create table t(
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'
go



create 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
dawugui 2010-03-08
  • 打赏
  • 举报
回复
进销存,不同的国度,算法不一样.
建议去找个相关系统看看.
--小F-- 2010-03-08
  • 打赏
  • 举报
回复
是不是库存的先进先出哦??

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧