日誌式庫存管理的設計思路解釋

日誌式庫存管理的設計思路解釋

日誌式的管理是一種流水帳式的登記方式,其核心思路是對所有操作進行記錄,特徵是隻登記不修改與刪除。

一. 日誌結構

圖一

單據名稱:如:入庫單,出庫單,調整單等

單據編號:某一特定單據的編號

庫存狀態:記錄各種單據對庫存的影響方式爲加或減

操作類型:記錄當前操作是審覈還是撤審。如同樣是減庫存,也要分是撤審的減庫存還是退貨的減庫存或者調撥倉庫的減庫存

登記時間:是記錄產生加減庫存的日期。它在日庫存統計起重要作用

物料編碼:庫存管理中會對每個材料進行唯一編碼,以便庫存進行管理

物料名稱:如已有物料編碼,其名稱只是對編碼的詳細中文註釋。如工廠對物料編碼不能不能理解,信息化基礎很差,那麼中文名稱將是工廠操作人員通俗的理解方式,系統在此做預留也就是可以滿足此類用戶的需求,庫存在統計時同樣可以按物料名稱來統計。物料名稱因此可以廣義的理解爲用戶可接受的擴展屬性。如:幅寬,規模,顏色,尺碼等。只要是用戶可以記憶的信息,都可以歸入名稱範疇。

發生數量:是一個正數字。本次數量通過發生數量*庫存狀態來產生。

創建人和創建時間:通常是記錄本單的審覈人和審覈時間。它與登記時間是有區分的,由於庫存統計時對時間的界定一般有兩種方式,一種是按審覈時間來進行統計庫存,另一種是按單據發生時間來統計,兩種方式主要區別是發生時間則用戶可自行調整,審覈時間要求人員操作及時準確。所以通常用戶都會採用第一種方式。

二. 日誌式結構的優點與缺點

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做結轉表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章