.
日志式的管理是一种流水帐式的登记方式,其核心思路是对所有操作进行记录,特征是只登记不修改与删除。
一. 日志结构
单据名称:如:入库单,出库单,调整单等
单据编号:某一特定单据的编号
库存状态:记录各种单据对库存的影响方式为加或减
操作类型:记录当前操作是审核还是撤审。如同样是减库存,也要分是撤审的减库存还是退货的减库存或者调拨仓库的减库存
登记时间:是记录产生加减库存的日期。它在日库存统计起重要作用
物料编码:库存管理中会对每个材料进行唯一编码,以便库存进行管理
物料名称:如 已有物料编码,其名称只是对编码的详细中文注释。如工厂对物料编码不能不能理解,信息化基础很差,那么中文名称将是工厂操作人员通俗的理解方式,系统在此 做预留也就是可以满足此类用户的需求,库存在统计时同样可以按物料名称来统计。物料名称因此可以广义的理解为用户可接受的扩展属性。如:幅宽,规模,颜 色,尺码等。只要是用户可以记忆的信息,都可以归入名称范畴。
发生数量:是一个正数字。本次数量通过发生数量*库存状态来产生。
创建人和创建时间: 通常是记录本单的审核人和审核时间。它与登记时间是有区分的,由于库存统计时对时间的界定一般有两种方式,一种是按审核时间来进行统计库存,另一种是按单 据发生时间来统计,两种方式主要区别是发生时间则用户可自行调整,审核时间要求人员操作及时准确。所以通常用户都会采用第一种方式。
二. 日志式结构的优点与缺点
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做结转表