我现在理解的库存算法是这样的.
比如说,现在是3月8日,上个月的28日进行了最后的库存确认为1000,
现在要查看最新的库存,
那么,算法是这样.
3月8日库存: 期初(2月28)1000,3月1日到3月8日业务数据为-200(包括很多出库入库业务), 那么现在的库存是 1000-200=800,
是这样咯.那么我有个这样的困惑, 
一,这个2月28日的库存数是可以因为什么业务而插入到库存表的,是因为盘点?月结?
二,如果是这样的库存算法,当业务数据非常多时,统计很费时间,有什么好的方法没?
三,盘点审核了后,库存应该是怎样的改动?
四,是不是一般都应该设定这样的规则:系统设定.某天之前的库存数是不允许变动,在某天之前的所有出入库业务都不能改变?

解决方案 »

  1.   

    --库存先进先出简单例子: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'
    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
      

  2.   

    你这个需求涉及到先进先出,错误冲账等问题.
    还是建议你找个进销存或ERP系统看看.
      

  3.   


    对,最好有这样的明细:
    上期结存     本期进仓      本期出仓    本期结存
    1000          0            200      800
    1、到2月28日为止的库存,并不是什么盘点单、月结什么的,是到2月28日所有单据发生的累加,库存=进仓单+(-采购退货)+调入-调出-销售-(-销售退货)+盘盈-盘亏2、业务单据非常多时,统计是比较费时间,有两个方法:第1、用余额表,所相关的单据审核后写入余额表,第2、不用余额表,直接写SQL语句,但是要优化SQL语句,也可以让客户接受的速度。3、盘点审核后,就是实盘数量-帐面数量,如果大于0则盘盈,帐面数量增加,小于0,帐面数量减少,目的是使帐面数量与实盘数量一致。4、如果你用到余额表了,你就要设定某天之前库存是不允许改变的。如果不用余额表,原单据统计的话,这个无所谓,但在开单时要限定,不能在这个期间里不能再录入单据了。
      

  4.   

    非常谢谢  fstao 等大哥.