2010-09-11 74 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