【问题标题】:Generating consecutive invoice number in MS Access VBA, # restarting every year在 MS Access VBA 中生成连续发票编号,# 每年重新启动
【发布时间】:2010-09-13 07:38:29
【问题描述】:

我需要为我的 Access (2010) 数据库生成唯一的发票编号。数字应采用年份+序号的格式,例如20101447 是 2010 年的第 1447 张发票。我环顾四周,但很多 Google 结果都建议使用自动编号,我很确定这不是一个非常可靠的方法。 (因为自动编号只保证是唯一的,没有别的)

该数据库暂时不会被多个用户同时使用,但我也不想使用完全被破解的解决方案。

编辑 我还发现this website 讨论了使用 DMax 函数进行顺序编号。场景 #2 正是我的想法,我认为这对于我的用例来说已经足够了。在完全输入和保存新发票之前,我会确保在罕见的(对我而言)数据库发生更改的情况下通知用户。

EDIT2 仅供参考:编号方案不是财政要求,而只是我们的自定义编号。我不想在没有充分理由的情况下改变。

【问题讨论】:

  • 你愿意使用多少 VBA?
  • 考虑到我的理解水平,这是很多代码。并不是说我没有得到代码,我只是害怕在不需要它的情况下增加太多的复杂性。如果它不是太 hackish 并且不会有两个用户的丑陋错误,那对我来说没问题。
  • 这是欧盟要求的?
  • 您是否需要在一个字段中存储多条数据?当然有发票日期,在我看来,您可以重新启动每年的序列,并将年份从发票编号中删除。如果他们喜欢查看前一年的发票编号,那么您可以对其进行格式化以进行显示,但实际上没有必要以这种方式存储它。

标签: ms-access vba


【解决方案1】:

如果你有能力改变数据库架构:

  • 添加一个序号字段和一个 年字段。
  • 要获取发票编号,请结合 这些值是适当的。
  • 插入时,你必须得到 当前年份,然后查询 最大顺序数据库 数字,其中年份 = 当前年份。
  • 在插入时使用这些值。

如果您无法更改数据库架构:

  • 获取最大发票编号,其中 发票编号以当前开头 年
  • 增加发票编号。
  • 在插入时使用这些值。

编辑

如果您可以添加另一个表,请使用一个表来存储每年的“最大”序号。每个插入都会锁定表,获取值然后递增它。将其视为您的发票编号生成器表。

【讨论】:

  • 如果有多个用户,这可能会导致重复值。
  • 也许可以通过将双字段索引设置为“无重复”并在创建新发票时实际验证数据是否正确插入来避免这种情况。但这就是我问的原因,我的 Access 知识充其量仍然很不稳定。
  • 最好将最后一个数字存储在单独的表中,可以从表中取出该数字并在插入事件之前添加到记录中。您将需要锁定表。我发布的链接中解决了这方面的各个方面,尽管对于您目前的需求来说它可能过于复杂。
  • 同意,如果您可以添加另一个表,请有一个存储每年“最大”序号的表。每次插入都会锁定表,获取值然后递增。
【解决方案2】:

带有示例代码的完整解决方案

How To Implement Multi-user Custom Counters in DAO 3.5忽略本文中的3.5版本号。使用适合您的 Access 版本的任何 DAO 版本。

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 日开具的发票,会发生什么情况?这将会发生。

【讨论】:

  • 很有趣,但恐怕现在已经超出了我的范围。
  • 什么是“出路”?一月份输入的十二月发票的问题?还是使用引用代码的问题?由于需要在每个日历年重新启动计数器,您将不得不使用代码。唯一的问题是你如何实现它。
  • 正如我之前所说,我对增加我不完全理解/不需要的复杂性持谨慎态度。这两个链接都讨论了在多用户环境中正确实现自定义计数器。我的问题是处理一个低得多的问题。
  • 不是多用户上下文吗?如果是,那么您需要按照引用的文章所说的方式进行操作,否则您一定会遇到问题。
猜你喜欢
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多