一、留庫單的使用場景

留庫單功能和批銷單比較類似,應用的場景主要是不方便開批銷單,但是又需要把庫存留住,避免在發貨的時候沒有庫存的困境。某些批發量很大的客戶,開批銷單就意味著揀貨和裝車、發貨。如果每張單據都要做這種動作,效率就會比較低。所以客戶通常都是累積了一定數量的單據以后,再進行這種動作,因此留庫單就應運而生。


二、舊版本留庫單的實現方式和優缺點

舊版本的留庫單其實是生成調撥單,留庫的時候,會把庫存從當前的倉庫調撥到一個叫“留庫倉”的虛擬倉,這個倉庫對于業務單據是不可見的,也就是開單時候無法從“留庫倉”開單,也就是說,庫存進入“留庫倉”以后,除了通過留庫單,就不能再操作這些庫存了,從而達到留庫的目的。

留庫單釋放庫存有兩種方式:作廢留庫單和生成批銷單。這兩種方式都會把庫存從“留庫倉”調撥到原來的調出倉。作廢留庫單,調撥結束以后,就完成操作了。生成批銷單在調撥結束以后,馬上利用這些庫存開批銷單。

這種留庫方式在整個過程總庫存是沒有任何變化的,因為調撥不影響總庫存,對于現存的大量和庫存有關的報表是一大喜訊,因為無需任何修改。但是有個問題就是留庫單的開單性能存在著浪費,因為留庫的時候,除了要做留庫的一些動作以外,還要做一次完整的調撥動作,中間的過程復雜而漫長。在數據量比較少的情況下,可能感覺不明顯;但是一旦數據量比較大的時候系統響應就會比價緩慢。最可怕的問題是,如果遇到死鎖或者連接中斷,庫存可能就會永久留在“留庫倉”無法再利用。

從希揚那邊的應用情況看來,留庫單引發死鎖的頻率還是非常高的。這里就引出了一個矛盾的問題。為了保證數據完整,留庫時只好使用事務的形式,否則一旦出錯,就無法恢復了;但是用了事務以后,由于事務里面的操作過程比較長,所以很容易引發死鎖,要解決問題最好就是放棄事務的方式……

最可怕的是,數據一旦出錯,有時候是不可逆的,連重算都沒法獲取正確的數據,這是客戶完全不能接受的糟糕狀況。


三、新版本的留庫單

解決留庫單死鎖和數據容易出錯的問題,歸根究底就是要縮短留庫時的操作過程,減少影響的數據表。因此新版本的留庫單改為不再利用調撥單,而是直接扣減庫存,整個過程和開批銷單差不多,區別就是開留庫單的時候不馬上扣減庫存,而是在“留庫”操作以后再扣減庫存。修改以后,大大減輕了原來死鎖和數據出錯的問題,就算是數據出錯,都可以通過重算來獲取正確的數據。唯一的缺點就是會影響總庫存,如果對于總庫存很敏感的客戶,就需要在統計分析的時候注意統計留庫單。

新版本的留庫倉整個開單過程和批銷單雷同,對于熟悉批銷單操作的操作員來說是很容易上手的。由于只有留庫單一種單據,出錯以后問題也比較容易發現。


四、一個容易忽略的單據業務選項

在這里提醒下,留庫單的業務設置,是沿用批銷單的,所以沒有單獨的設置項目。在單據業務設置的“批銷單”選項里面,有個“批銷時是否要扣減未留庫的留庫單的數量”的設置,該設置是控制在開批銷單(留庫單)時候,可用庫存是多少。如果勾選了,那么有效留庫單占用的庫存就不能使用。有效的留庫單就是沒有作廢以及沒有生成批銷單的,至于“已留庫”和“已生成批銷單的留庫單”,實際占用的庫存已經導致庫存發生修改,因此不能再考慮。舉個例子說明下:

某倉某本書庫存為50,有A、B、C三個留庫單,三單的數據涉及該書的數據均為30,A是新開的留庫單,還沒有留庫;B是已經作廢的;C是已經生成批銷單的。那么開批銷單時,可用庫存是多少呢?無論是否勾選“批銷時是否要扣減未留庫的留庫單的數量”這個設置項目,B和C單的數量對于庫存都是沒有影響的,因為這兩單的庫存變化已經反映到真實庫存里面了,因此計算可用庫存的時候無須考慮BC單。

至于A,如果沒有勾選項目的時候,也就是不考慮留庫單占用的庫存,那么當前可用的庫存就是50;如果勾選了,那么實際的可用庫存就是50-30=20。


(摘自廣智內部博客)