VB编写的仓库管理系统,盘点模块的算法是用相对盘点,现在需要改进算法,
ACCESS数据库,包含数据表 
库存表:
品名编号,品项,库位,单重,总重,库存数量,......
进出库明细:
品名编号,品项,库位,单重,总重,进库数,出库数,日期......
盘点表(临时表):
品项,库位,单重,总重,上月库存,本月进库,本月出库,本月结存,年月......我们都是月未盘点,其中上月库存是反推得来的。公式:上月库存=本月结存(实时的库存数据)+本月出库-本月进库因为我们都是月未盘点,但有时并不是严格在月未盘点,所以常有,如9月未的“上月库存”不等于8月未盘点的“本月结存”。  
现在我想把盘点表(临时表)不再用临时表来做,而是实时的保存记录,公式改成:本月盘点=上月库存+本月进库-本月出库新式盘点表:
品项  库位  上月库存  本月进   本月出   本月存   年月       实时库存  差异数
 A       X       50          30           40         40         200908
 B       Y       100         20           70         50         200908
 C    Z       30          60           30         60         200908
 A       X       40                                             200909        
 B       Y       50                                             200909
 C       Z       60                                             200909
现在的做法是 用如上新公式,9月盘点时直接取8月份的“本月存”来做9月份的“上月库存”,实时库存=库存表库存量,差异数=实时库存-本月存
请各大侠给下建议是否还有更佳的算法

解决方案 »

  1.   

    如果你月结就要有对差异有心理准备,对于仓库管理来说很难避免差异。所能做的就是降低差异。你表格设计上可以添加本月损耗,本月回库这样的列来表示更多的原因。让你的公式更加细节话。
    另一个就是一个表格纪录库存差异。比如根据公式算出来上个月库存90,但是上个月实际库存是80,你的表格可以是
    日期 计算库存 实际库存
    200909 90 80
    200910 70 70
    这样能够做到的就是保留一个记录。仓储管理对于差异纪录的保存非常重要。
    '-----------------------------------
    最好还是日结,可以下班之后自动运行日结。如果数据有问题通知需要通知的人。另外就是细节把关,如果你们出入库是用barcode扫描直接进入数据的话还是把关好
    损耗是一定会出现的,系统可以做的
    1尽量降低系统数据和实际数据的误差
    2如果出现误差及时通知相关人员,给出辅助的分析
      

  2.   

    感謝各網友的建議,我設的是盤點區間如 "20090901到20090930", 為了方便統計才設的進出庫兩個字段,而且進出庫還分ABCDEF....等等類別,代表不同的含義,只用一個字段不太方便.
    “公式:上月库存=本月结存(实时的库存数据)+本月出库-本月进库”並非亂來,一般做盤點表都用臨時表做,這樣的話數據庫才不致過大...用臨時表的話要算出上月結存就只能用反推法,就是上述公式.進出明細裡面我不是分年月,"日期"字段是必須的,要不憑何盤點,憑何統計?
      

  3.   

    1.盘点区间可以在查询语句里添加时间限定条件来实现。
    2.看不到要做临时表的必要性,聚合查询语句不能达到你的要求?至于数据库大小,不知你用的是什么数据库,如果是access可能会有这种担忧,但如果用sqlserver或 Oracle 之类的来做进销存,以现在硬盘的大小,基本就不需要担心。几年前我在一家公司做时,那套系统每天有数万~数十万的记录入库,每条记录有三十个字段,当时几百G的硬盘卓卓有余了,关键是要定期做数据库备份。即使是使用access,如果不需要多用户联网,一般中小企业的进销存也足够胜任了,不必太担心大小。
    3.至于“而且進出庫還分ABCDEF....等等類別”你没有说清楚是什么意思,是不是指你举的例子中的“品项”?只要有一定的模式,一般都应该可以用聚合查询语句解决。
      

  4.   

    感謝lsftest,此系統已經用了5年,我只想改一下盤點模塊的算法, 只說兩個代表意義如 A:代表進庫, B代表出庫,C代表外調,這要分類統計...重點是改盤點算法......
      

  5.   

    order by 或group by不能解决问题?如果这样,建议直接把数据exporttoexcel,到时你想怎么算就怎么算。
      

  6.   


    进出库明细: 
    品名编号, 品项, 库位,    日期,     類別, 进库数,出库数,单重,总重...... 
    001        A    X      20090923         100    100此種情況比較多...如果像您所說的那樣, +-表示的話,要多N筆記錄,當然這個也跟個人設計風格有關...
    再重申一下,我只想請教關於盤點表的算法思路.我的想法上面已經提及.lsftest,請教一下,你一般盤點表中的"上月盤存"用何算法?假如你不用反推法...排除我的干擾.你一般會用哪種算法?謝謝.
      

  7.   

    我的方法在上面已经说了,在一个确认绝对准确无误的初始库存表之后,就是一个进出库表,进出库用+-号表示(有时甚至可以把初始库存表的数据都做到进出库表里去,这样就一个表就解决了),进行盘点的时候,就用:
    select。。from。。where dt>=某年某月某日 and dt<=某年某月某日 group by 货品
    或直接把这段时间段的数据导出到excel再做处理,根据实际情况、用户的需求选择用哪种方法。这样可以进行随时盘点,每日、每周、每月都没问题,想什么时候盘点就什么时候盘点,而且数据是最新最准的。不过看来这一套系统当初不是你做,既然数据库结构那些东西已被定死了不能改,那再想别的办法吧。
    你提到的倒推法,是用现有的结果来倒推出初始库存,我觉得在业务流程上不应该这样做。
      

  8.   

    举个例子,今天是20090924,那么上月库存就是:
    select。。from。。where dt>='1900-01-01' and dt <='2009-08-31' group by 货品
    直到现在的库存就是:
    select。。from。。where dt>='1900-01-01' and dt <='2009-09-24' group by 货品
      

  9.   

    這個系統數據庫確實不是我設計的,但大部份模塊都由有重新寫過,比如現在的盤點表...還有其他功能模塊,不過這些都不重要.select。。from。。where dt>='1900-01-01' and dt <='2009-08-31' group by 货品 我想過用這個,但這樣盤點會用很長時間,而且老板也不同意把數據備份起來只留近兩年的數據...儘管這樣還是給分了.感謝lsftest.