台灣最大程式設計社群網站
線上人數
1881
 
會員總數:244783
討論主題:188836
歡迎您免費加入會員
討論區列表 >> 專欄文章 >> 序號產生器的設計概念 ─〔序號管理〕
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
序號產生器的設計概念 ─〔序號管理〕
價值 : 0 QP  點閱數:3775 回應數:0

樓主

ASP.NET新手
中級專家
5761 72
5428 2176
發送站內信

捐贈 VP 給 ASP.NET新手
想必各位讀者對序號的編碼原則,應該有了初步的認識與了解
接下來就要來談序號產生器的設計概念中最重要的一個概念「序號管理」

序號管理的目的在於,避免產生重複的序號
最常見的序號類型為日期加上流水號,例如:200703160001
在第一篇中己提到,許多人習慣取目前資料表中最大的序號+1來當做新序號
或是計算同日期中,有多少筆記錄,再將筆數+1當做新序號

這二種方式都可以產生日期加上流水號這種類型的序號,但卻有致命傷在......
因此,我們就要利用序號管理的這個概念,消除這些致命傷

在此,筆者以大家最常見的日期加上流水號,另外再加上序號別的方式來講解

首先,我們得先了解一組有意義的序號,是由哪些部份所組成的?

單據別(2碼):許多系統中,都可以看到不同的單據別,有著相同的號碼的單號
所以單據別是用來區分不同單據間的序號所使用的

日期(6碼):透過序號中的日期,可以使我們輕易的知道某一筆記錄是在哪一天建立的

流水號(4碼):由於一天當中,可能產生超過一筆以上的記錄,所以搭配上流水號的話
則可給予一筆記錄一個獨立的編號

根據以上所述的序號組合條件,我們即可以建立像下列所述的這些序號

A10703160001 (2007/03/16所建立的第一張銷貨單)
A10703170001 (2007/03/17所建立的第一張銷貨單)
A20703160001 (2007/03/16所建立的第一張出貨單)
A20703160002 (2007/03/16所建立的第二張出貨單)

現在就開始介紹,如何做序號管理囉∼

首先,我們可以在資料庫中建立這樣子的一個資料表,用來管理我們系統中所產生的序號
所需要的欄位有:序號別(NoType)、序號(NoString)、目前流水號(NoSeq)

可利用下來SQL敘述建立資料表

CREATE TABLE AutoNumber
(
NoType char(2) NOT NULL DEFAULT (SPACE(0)),
NoString char(6) NOT NULL DEFAULT (SPACE(0)),
NoSeq int(4) NOT NULL DEFAULT ((0))
)

當要建立一張2007/03/16的銷貨單時(請參考本篇中序號組成的部份所舉例的序號)
先到這個序號管理資料表中尋找,是否有Notype為A1,NoString為070316的記錄
如果沒有的話,就建立該筆記錄,並將NoSeq設為1
將這三個欄位的值組合起來所得到的序號就是A10703160001(由於流水號是四位數,所以請自己在程式中做補0的動作)

此時,我要再建立一張2007/03/16的銷貨單時,由於序號管理資料表中
己有NoType為A1,NoString為070316的記錄,因此我們要知道的是NoSeq的值是多少
由於剛才只建立了一張銷貨單,所以NoSeq的值是1
這時我們要將NoSeq的值Update為2,如此我們即可得到銷貨單號為A10703160002

那麼到了2007/03/17時,我要再新增一張銷貨單時,序號該是多少呢?
由於序號管理資料表中並沒有NoType為A1,NoString為2007/03/17的記錄
所以我們會建立該筆記錄,並將NoSeq設為1,最後得到A10703170001的序號

這樣子,就達成了當日期變動後,流水號從新1開始編的目的了......

透過這樣子的一個序號管理方式,各位是否產生序號的工作變的容易許多了呢?

其實,筆者目前所使用的序號產生器其結構比本篇文章所述的更為複雜
序號管理資料表的欄位也更多
可以針對各種不同單據別,序號長度的不同,做一個有效的控管
大家可以依據本篇教學所說的原則,去設計序號管理資料表,並撰寫出最適合自己所使用的序號產生器

經過這三篇的介紹,希望能夠幫助各位在撰寫序號產生器的各位對序號管理有更進一步的了解
如果各位讀者在讀完這三篇文章之後,有什麼感想或建議的話
也請各位不吝指教∼

如果在這三篇文章中,有任何的疑慮,也觀迎各位留言來向筆者詢問
謝謝。

搜尋相關Tags的文章: [ 序號 ] , [ 單號 ] , [ 序號產生器 ] , [ 編號 ] ,
本篇文章發表於2007-03-21 17:02
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
目前尚無任何回覆
   

回覆
如要回應,請先登入.