多谢CCEO兄的指教。其实,你说的第一点我也考虑过,解决的办法就是绝对禁止对已确认单据的修改和删除。每张出入库单据在确认前,还未对库存发生影响,这时可以随意修改;但是一旦确认之后,生成了库存帐,就只能做新的负数单据(红票)来冲帐了。否则,这种库存模式根本无法成立。我实际上也担心用户对这种模式的接受程度,因为,这实际上限制了用户操作自由。原有模式下,单据确认后还可以反确认,该功能把对库存的影响冲销回来即可。而在新模式下,单据一旦确认,那是绝对没有“后悔药”吃了。只能另做一张冲帐单。当然,从另一个角度说,这也是为了用户着想么!为了用户养成良好的操作习惯。你说的第二点,大概是用户延期录入单据的问题?这个我们原来就有考虑,将单据的发生时间和记帐时间分开记录,发生时间可以改,记帐时间一定是当前时间。例如实际上是昨天到的货,你今天才录入库单,那么我允许你将单据发生时间改为昨天;但是记帐时间只能是现在,帐面库存发生变化的时间也只能是现在。另外,使用盘点表(我们叫做库存结转表)也是我们原有的做法,不过我认为
这始终没有解决根本的问题。因为没有即时的库存数据,在显示诸如“库存走势图”等等东东的时候计算仍然是难免很复杂的。再次多谢CCEO兄!还请继续探讨说实话,我对这种新库存模式,
真是很没底,很没底。

解决方案 »

  1.   

    有三个表还不行吗?
    入库表,实时库存表,盘点(结存)表。
    1、每个周期(如每月)做一次月结动作,以上月盘点表为基础,与本月进出,得到月未期未数(即下月期初数)。
    2、每天专门做一个JOB,进行刷新库存表的操作(当然,每次进出库也应同时去刷新库存表),JOB在人少时运行,利用盘点表的上月期未数与本月进出数运算得到库存(这样做可以减少因为扣数或机器等等原因所导致的库存与实物不一致的情况)
    3、有了这三个表,查历史也好,查即时数据也好,都比较方便。当然,如果有跨月的进出库修改动作,可能麻烦点,要做反冲动作,如果跨年的话,建议用做调整库存的单据(多则入负数,少则入正数)的办法强行调整库存数。
    本人认为这种方案比较实用。
      

  2.   

    zqllyh(找感觉) 兄的说法比较怪异。我认为,你的基本架构和CCEO兄,以及我原来的方式是一致的,我就是不太明白,为什么要
    “每个周期(如每月)做一次月结动作,以上月盘点表为基础,与本月进出,得到月未期未数(即下月期初数)”???既然有即时库存表,到时候直接把它COPY下来到盘点表,可不就是当时库存?当然,如进行了实际盘点,则可能还要做盘盈盘亏操作。为什么还要用上月结存数,与本月单据来推算???用JOB来刷新库存的方法我认为也比较奇怪,大概你是考虑的大用户量操作下的共享冲突问题,为了避免造成死锁?我认为这个思路也有一定道理,但是如果这样的话,你的出入库单据保存(或确认时)就绝对不应同时刷新库存表了,一律交给后台JOB来处理。这样的确增加了程序在并发大用户操作时的可靠性(避免了多用户同时修改库存表)。但是以我的经验,在几十个并发用户量级,似乎不必如此谨慎也许,在更大用户量时的确是必须考虑的。扯远了,上面一段足够新开一个帖子来专门讨论。还是回来,请教大家对我的那个新库存模式的看法?
      

  3.   

    我见过一些关于SAP的设计,类似第二种思路,不过要复杂得多,但是有一点是相同的,规范用户操作,决不会删除数据,它的类似删除的操作就是用一张单对冲原来的单,楼上的说得对,安全第一。 :-)
      

  4.   

    zqllyh(找感觉)兄的设计其实都是按期盘点的思想,至于盘点数据的算法、库存刷新的算法,这些都是具体技术问题,不是设计问题了,不应过多纠缠。现在应该先讨论设计问题。
       有句话:在中国,对用户的“过多”(可能实际上一点都不多)限制和规定,都会被用户理解为“不好用”(可用性差)。设计的时候需要考虑实际。
      

  5.   

    我们的系统是这样处理的
    有个ware_inventory表记录当前实时库存
    有(部门号,商品编号,好货存货数量,坏货存货数量,销售成本等..)
    还专门设计了一个ware_log表用于记录库存变化情况
    有(部门号,商品编号,好货存货数量,坏货存货数量,修改数据发生时间..)
    基本就是按照第二种思路设计的,这样做以后在前台做了一个对帐处理模块,
    可以很容易的查出数据不准确的原因,把相关联的数据更新程序都做好了,应该没有问题的,尽管log表数据量比较大,但sql server系统还是能够处理的很快,毕竟你查询log表还是带条件的选择的,不会select *的,呵呵
      

  6.   

    入库单

       入库单据号
       入库时间
       入库方式 /* 期初结转、正常入库等 */
        

    GO出库单

       入库单据号
       出库单据号
       出库时间
       出库方式 /* 正常出库、丢失、损坏等 */
        
    )这样就可以用一条SQL语句快速(加好index)算出指定时刻的库存情况