2010-09-11 60 views
4

我需要爲我的Access(2010)數據庫生成唯一的發票號碼。數字應該採用年份+連續數字的格式,例如20101447爲2010年第1447號發票。我環顧了一會兒,但很多谷歌的結果表明使用自動編號,我很確定這不是一個很好的做法。 (因爲自動編號只保證是唯一的,沒有別的)在MS Access VBA中生成連續的發票號碼,#每年重新啓動

數據庫現在不會被多個用戶一次使用,但我不想用一個完全黑客一起的解決方案。

編輯 我還發現this website討論使用DMax函數序列編號。場景#2正是我想到的,我認爲這足以滿足我的使用案例。我將確保在罕見的(對我來說)事件中通知用戶數據庫在完全輸入並保存新發票之前已經更改。

EDIT2 供參考:編號方案不是財政要求,而只是我們的自定義編號。我不想沒有很好的理由去改變。

+0

您願意使用多少VBA? – Fionnuala 2010-09-11 21:58:29

+0

例如:http://www.tek-tips.com/faqs.cfm?fid=184 – Fionnuala 2010-09-11 22:04:34

+0

考慮到我的理解水平,這是很多代碼。不是說我沒有得到代碼,我只是害怕在沒有真正需要的情況下增加太多的複雜性。如果它不太噁心,並且不會有兩個用戶出現醜陋的錯誤,那對我來說沒問題。 – Carst3n 2010-09-11 23:38:51

回答

3

如果您需要更改數據庫架構的能力:

  • 添加一個序列號字段和 年字段。
  • 要獲得發票號碼,請適當組合 這些值。
  • 插入時,你將獲得 本年度然後查詢 數據庫其中year =本年度的最大連續數 。
  • 在插入時使用這些值。

如果你不能改變數據庫模式:

  • 獲取最大發票數,其中 發票號碼與當前 年
  • 增量發票編號開始。
  • 在插入時使用這些值。

編輯

如果你可以添加其他表,具有存儲,「最大」連續數每年的表。每個插入將鎖定表,獲取值然後增加它。把它看作你的發票號碼發生器表。

+0

如果有多個用戶,這可能導致重複值。 – Fionnuala 2010-09-11 23:28:33

+0

也許這可以通過設置爲「不重複」的雙字段索引來避免,並且每當創建新發票時實際驗證插入的數據是否正確。但這就是我爲什麼要問的原因,我的Access知識還是很不穩固。 – Carst3n 2010-09-11 23:34:10

+2

將最後一個號碼存儲在單獨的表格中會更好,可以從表格中檢索該號碼並將其添加到before insert事件中的記錄中。你需要鎖定表格。這個問題的各個方面都在我發佈的鏈接中解決,儘管它可能對您目前的需求過於複雜。 – Fionnuala 2010-09-11 23:39:45

2

完整的解決方案示例代碼

How To Implement Multi-user Custom Counters in DAO 3.5忽略這篇文章中的3.5版本號。使用任何版本的DAO適合您的Access版本。

How To Implement Multiuser Custom Counters in Jet 4.0 and ADO 2.1 當前版本的Windows XP SP3中的ADO版本是2.8,因此忽略ADO 2.1部分並使用ADO 2.8。雖然2.1仍然有效。

還有什麼發生在1月2日當有人輸入一個應該是12月31日日期的發票?這會發生。

+0

我很害怕,但現在我的球場出了點有趣的方式。 – Carst3n 2010-09-12 12:48:18

+0

什麼是「走出你的球場」? 1月份輸入12月份發票的問題?或者使用引用代碼的問題?由於要求每個日曆年重新啓動計數器,您將不得不使用代碼。唯一的問題是你如何實現它。 – 2010-09-12 22:29:06

+0

正如我剛纔所說的,我很謹慎地增加我不完全理解/需要的複雜性。這兩個鏈接都討論在多用戶環境中正確實現自定義計數我的問題是處理一個低得多的問題。 – Carst3n 2010-09-12 23:23:05