[转载]日志式库存管理的设计思路解释

.

日志式的管理是一种流水帐式的登记方式,其核心思路是对所有操作进行记录,特征是只登记不修改与删除。

 

一. 日志结构

 

图一

 

单据名称:如:入库单,出库单,调整单等

 

单据编号:某一特定单据的编号

 

库存状态:记录各种单据对库存的影响方式为加或减

 

操作类型:记录当前操作是审核还是撤审。如同样是减库存,也要分是撤审的减库存还是退货的减库存或者调拨仓库的减库存

 

登记时间:是记录产生加减库存的日期。它在日库存统计起重要作用

 

物料编码:库存管理中会对每个材料进行唯一编码,以便库存进行管理

 

物料名称:如 已有物料编码,其名称只是对编码的详细中文注释。如工厂对物料编码不能不能理解,信息化基础很差,那么中文名称将是工厂操作人员通俗的理解方式,系统在此 做预留也就是可以满足此类用户的需求,库存在统计时同样可以按物料名称来统计。物料名称因此可以广义的理解为用户可接受的扩展属性。如:幅宽,规模,颜 色,尺码等。只要是用户可以记忆的信息,都可以归入名称范畴。

 

发生数量:是一个正数字。本次数量通过发生数量*库存状态来产生。

 

创建人和创建时间: 通常是记录本单的审核人和审核时间。它与登记时间是有区分的,由于库存统计时对时间的界定一般有两种方式,一种是按审核时间来进行统计库存,另一种是按单 据发生时间来统计,两种方式主要区别是发生时间则用户可自行调整,审核时间要求人员操作及时准确。所以通常用户都会采用第一种方式。

 

二. 日志式结构的优点与缺点

 

1. 优点:

 

(1) 所有影响库存的单据全部统一在一张表里进行管理,查询方便。还要方便进行导出备份。

 

(2) 在做库存查询与统计时的速度优于散在各处相加再进行统计的方式。

 

(3) 如果日志完整,可根据日志反向生成各种单据。配合第一条优点,可快速进行单据还原。

 

2. 缺点:

 

(1) 日志信息目前只适合记录库存增减,不适合记录业务流向。

 

(2) 日志量庞大,使用一段时间后,做通库查询速度与性能降低。

 

(3) 日志信息普通操作人员不易看懂,必须是对整个系统较为熟悉的人员才能读懂。

 

3. 解决方案:

 

对于业务流程的数据展示通过前面界面做针对性强的开发,而后台库存运算则采用库存日志的方式实现。

 

针对日志表做数据库存储文件的优化,根据时间段多做结果表,生成日结,月结,加快查询速度,将经常查询区域的数据进行分区域管理,提升整体查询性能。原则上以十万条数据作为一个查询速度减慢的监界点。十万条以内的查询速度还是可以接受的。

 

最终操作用户不需要看懂此日志表,他们看到的都是在日志表基础上经过加工的、用户可能看得懂的界面信息。如果一个有经验的程序员,在看过本文的介绍以后就可以马上理解日志表的作用。

 

三. 其它

 

1. 一条SQL产生期初、期末库存表。(从技术上可以达到求期初,但从实际应用考虑不推荐此法,此仅应用于数据稽核时)

 

select tb.pm,tb.frq,tb.gg,

 

       decode(row_number() over(partition by tb.pm order by tb.PM,tb.RQ,tb.gg),1,0,

 

       LAG(l_bqlj, 1, 0) OVER (ORDER BY tb.PM,TB.RQ,tb.gg)) AS prev_BQJC,

 

       tb.bqrk,tb.bqck,tb.l_bqlj

 

 from

 

(select ta.pm,ta.gg,ta.rq,ta.bqrk,ta.bqck,

 

       SUM(ta.bqlj) OVER (PARTITION BY ta.pm,ta.gg

 

                           ORDER BY ta.PM,ta.gg,ta.rq

 

                           RANGE UNBOUNDED PRECEDING) l_bqlj

 

 from

 

(SELECT LSZ.物料名称 pm, LZS.规格 GG,to_char(LSZ.登记时间,’yyyy-mm’) rq,

 

       sum(decode(LSZ.库存状态,1, LSZ.数量,0)) bqrk,

 

       sum(decode(LSZ.库存状态,-1,LSZ.数量,0)) bqck,

 

       sum(decode(LSZ.库存状态,1, LSZ.数量,0)) –

 

       sum(decode(LSZ.库存状态,-1,LSZ.数量,0)) bqlj

 

  FROM (select 物料名称,登记时间,规格,库存状态,数量

 

        from 日志结构 b

 

       where to_char(登记时间,’yyyymm’) >= ‘200810’

 

       union

 

       SELECT a.物料名称,to_date(‘200810′,’yyyymm’) 登记时间,a.规格,0 库存状态,0 数量

 

       FROM 日志结构 a

 

       GROUP BY a.物料名称,a.登记时间,a.规格

 

 group by to_char(LSZ.登记时间,’yyyy-mm’),LSZ.物料名称

 

 order by to_char(LSZ.登记时间,’yyyy-mm’),LSZ.物料名称) TA) tB

 

分析:

 

1.  竖值变横使用DECODE把满足条件的记录数量保留下来,不满足条件的过滤为0

 

2.  SUM进行累计运算。

 

3.  LAG错位进行结转运算。

4.  UNION做结转表

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏