日誌式庫存管理的設計思路解釋
日誌式的管理是一種流水帳式的登記方式,其核心思路是對所有操作進行記錄,特徵是隻登記不修改與刪除。
一. 日誌結構
單據名稱:如:入庫單,出庫單,調整單等
單據編號:某一特定單據的編號
庫存狀態:記錄各種單據對庫存的影響方式爲加或減
操作類型:記錄當前操作是審覈還是撤審。如同樣是減庫存,也要分是撤審的減庫存還是退貨的減庫存或者調撥倉庫的減庫存
登記時間:是記錄產生加減庫存的日期。它在日庫存統計起重要作用
物料編碼:庫存管理中會對每個材料進行唯一編碼,以便庫存進行管理
物料名稱:如已有物料編碼,其名稱只是對編碼的詳細中文註釋。如工廠對物料編碼不能不能理解,信息化基礎很差,那麼中文名稱將是工廠操作人員通俗的理解方式,系統在此做預留也就是可以滿足此類用戶的需求,庫存在統計時同樣可以按物料名稱來統計。物料名稱因此可以廣義的理解爲用戶可接受的擴展屬性。如:幅寬,規模,顏色,尺碼等。只要是用戶可以記憶的信息,都可以歸入名稱範疇。
發生數量:是一個正數字。本次數量通過發生數量*庫存狀態來產生。
創建人和創建時間:通常是記錄本單的審覈人和審覈時間。它與登記時間是有區分的,由於庫存統計時對時間的界定一般有兩種方式,一種是按審覈時間來進行統計庫存,另一種是按單據發生時間來統計,兩種方式主要區別是發生時間則用戶可自行調整,審覈時間要求人員操作及時準確。所以通常用戶都會採用第一種方式。
二. 日誌式結構的優點與缺點
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做結轉表