我需要生成大批量的發票,這些發票將被轉換爲EDI並傳送到我們的總部。有一個訂單表,所有的訂單都進來了。在一天的某個時間點,我必須抓取一組(約1k)並生成發票。生成發票
- 哪裏會是生成發票號碼的最佳位置?在SQL Server後端?或者將批處理抓取到.NET應用程序中,然後在那裏生成發票號碼?發票號碼可以是隨機的,但不能重複(3-4年)。我最多可以使用12位數字,可以是字母數字。我在哪裏可以找到有關生成發票號碼的信息。
注:雖然我生成發票我需要計算訂單總數和稅收。
我將不勝感激您的意見。
我需要生成大批量的發票,這些發票將被轉換爲EDI並傳送到我們的總部。有一個訂單表,所有的訂單都進來了。在一天的某個時間點,我必須抓取一組(約1k)並生成發票。生成發票
注:雖然我生成發票我需要計算訂單總數和稅收。
我將不勝感激您的意見。
發票號碼可能受法律要求(我住在哪裏他們需要按順序,我不認爲可能有序列中的空白)。
你經常看到的數字包括元素範圍將他們的時間(如一年:2009年 03472)。這樣可以最大限度地減少兩次使用相同數字的風險。
你說你有一天~1K的發票。這意味着6位數的發票號碼將覆蓋您的需求。所以4位數字的一年後面加上零填充的6位數發票號碼可能會讓你走。
我可能會讓數據庫生成它們以確保它們是唯一的。
向您的數據庫中添加一個表,用於存儲最後使用的發票號碼的值,以及一個存儲過程用於增加此值並將新值返回給您以用於創建您的發票。
當您保存您的新發票時,請撥打SP以獲取下一個發票號碼您最後做的事情之一 - 驗證通過後但立即寫入磁盤之前 - 以儘量減少編號序列中的「孔」。
使用順序標識可能是最好的,除非您希望它們因某種原因是隨機的(例如,因爲客戶不應該能夠從大致相同的時間段猜測另一順序的訂單標識)。使用順序標識可讓您讀取當前的最大值,然後檢查是否在即將從批處理過程提交訂單之前寫入的範圍內沒有寫入。
如果您不希望檢查數據庫並確保其他進程不會產生干擾,您可以利用DateTime.UtcNow和Base64轉換。一個非常笨拙的例證可能是這樣的:
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Year,
(byte)DateTime.UtcNow.Month,
(byte)DateTime.UtcNow.Day,
(byte)DateTime.UtcNow.Hour,
(byte)DateTime.UtcNow.Minute,
(byte)DateTime.UtcNow.Second,
(byte)DateTime.UtcNow.Millisecond })
或者
Convert.ToBase64String(new byte[] { (byte)DateTime.UtcNow.Ticks })
你可能會更感興趣的Base32轉換(它使用字母AZ和數字2-7),雖然沒有原生.Net轉換,所以你必須搜索一個。
我想如果沒有法律來限制關於生成發票ID的規則,它可以是任何你想要的。
現在我有一個很好的例子:
其實我編程索票制度,我有我的生成ID編碼順序,和我有一定的差距,因爲當顧客例如解除合同與公司合作,而且我已經在此之前生成了12張發票。
(因爲在這裏我們有一個ISP公司,合同必須在6,12或24個月)
我在我的數據庫中的差距,因爲系統的用戶刪除已取消的發票。如果我確實需要一個序列號,那麼我會遇到法律方面的問題。我在這裏有很多其他情況,這使我在順序發票號碼中出現了空白。
我真的不知道如何避免這種問題,因爲有很多情況發生。任何想法?
我該如何在sql server中生成這個,好吧,我如何跟蹤種子,以便下一代能夠拿起最後一個種子。如果在發票處理過程中失敗,怎麼處理這個問題呢?我如何回滾序列? – 2009-06-23 21:14:41
我不是數據庫專家,但我想你可以爲發票號碼保留一張表格(或者可能只保存每年迄今爲止使用的最高號碼),並且有一個選擇最新的程序,添加1,存儲它並返回結果。但我相信有更有效的方法。 – 2009-06-23 21:18:46
我認爲最好將種子存儲在數據庫中。在發票流程中,我會抓取最後一個種子並從那裏增加,當過程完成時沒有錯誤,我只需更新種子。 – 2009-06-23 21:20:05