![如何制作宏以根据财政年度生成记录编号?(Access 2013)](https://linux22.com/image/1476144/%E5%A6%82%E4%BD%95%E5%88%B6%E4%BD%9C%E5%AE%8F%E4%BB%A5%E6%A0%B9%E6%8D%AE%E8%B4%A2%E6%94%BF%E5%B9%B4%E5%BA%A6%E7%94%9F%E6%88%90%E8%AE%B0%E5%BD%95%E7%BC%96%E5%8F%B7%EF%BC%9F%EF%BC%88Access%202013%EF%BC%89.png)
我想创建一个基于财政年度并自动推进的记录编号......例如:2015001、2015002、2015003、2015004;2016001、2016002 等。
我的表 [Projects] 中已有一个基于以下表达式的 [FiscalYr] 字段(计算数据类型):
IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate])).
[EntryDate] 字段是日期/时间字段,默认值为 Date()。它按我希望的方式工作。
我是否可以将 [FiscalYr] 编号放在一个 3 位数字的前面,该数字以 001 开头,并根据之前的记录以 1 递增,并且在每个新的财政年度开始时将该数字重新设置为 001?我们的财政年度从 10 月 1 日开始,到 9 月 30 日结束。
我希望无论信息是在表格 [项目] 中输入还是在表单 [项目表单] 中输入,都能生成数字。我不希望它只在表单中输入信息时才生成。我在网上看到一些帖子建议,执行此类操作的最佳方法是使用 Before Change 宏,但我能找到的大多数示例都以日期为基础,而我已经解决了日期问题(我认为)。
如果使用宏比使用我现有的 [FiscalYr] 字段更容易,那么我可以使用一个宏,它既可以从 [EntryDate] 创建财政年度,又可以同时创建数字。我只是一个普通的 Access 用户,所以如果我说了胡言乱语,我很抱歉——我想我知道的足以造成危险。
非常感谢,安德里亚
2015 年 12 月 9 日更新:
我已放弃宏观想法。
使用 Scottgem 博客中的提示(https://scottgem.wordpress.com/2009/11/25/sequence-numbering/),我已经能够建立并运行一个连续编号系统,但我仍然在努力让数字在新的财政年度开始时重新设置为 1。我不确定问题是否在于我如何生成财政年度值,还是完全是其他问题。
以下是我得到的信息:
表名称:Projects
在项目中,我有以下与此问题相关的字段:
- ProjectNo:数字-长整数
- 序列:数字 - 长整数
- EntryFiscalYr:计算 - 长整数;表达式如下:
IIf(Month([EntryDate])>=10,Year([EntryDate])+1,Year([EntryDate]))
- EntryDate:日期/时间;默认值:Date()
表单名称:项目表单
在我的项目表单中,我有以下控件:
- 序列:文本框,控制源是项目表中的序列字段,设置为不可见
CreateProjNo:按钮,点击事件:
Private Sub CreateProjNo_Click() Me.Sequence = Nz(DMax("[Sequence]", "Projects"), 0) + 1 DoCmd.RunCommand acCmdSaveRecord End Sub
ProjectNo:文本框,数据控件来源:
=[EntryFiscalYr] & Format([Sequence],"000")
这与我希望的显示一致:2016001、2016002 等等。
我曾尝试对 Scottgem 博客上的代码进行各种迭代,将 EntryFiscalYr 字段带入 DMax 语句中,以查看序列号是否应在当前财政年度继续递增或从新的财政年度重新开始,但我的尝试均未奏效。
我努力了:
Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”,”[EntryFiscalYr]) = “ &(Me.[EntryFiscalYr])),0)+1
Me.Sequence = Nz(DMax(“[Sequence]”, ”Projects”, ” [EntryFiscalYr] = ‘“ & Me.[EntryFiscalYr] & “’”),0)+1
我也尝试过用Me.[txtEntryFiscalYr]
代替Me.[EntryFiscalYr]
。这些尝试都没有成功。
我猜我的问题可能是由于 EntryFiscalYr 为每个记录生成的方式造成的,但我不知道如何解决这个问题。我尝试使用 EntryDate 生成的日期,它对日历年的处理效果很好,但重要的是根据财政年度获取它,并在每个新的财政年度开始时重新设置它。
此外,项目表单中生成的 ProjectNo 不会更新到项目表中的 ProjectNo 字段,但据我了解,这就是关键所在。这样对吗?
任何有助于使其在财政年度内正确运行的帮助都将不胜感激。
谢谢!
答案1
这是我最终确定的代码。它使用表单中的一个按钮。希望这能帮助那些可能遇到同样问题的人。
Private Sub CreateProjNo_Click()
Me.EntryFiscalYr = IIf(Month([EntryDate]) >= 10, Year([EntryDate]) + 1, Year([EntryDate]))
Me.Dirty = False
If IsNull(Me.Sequence) Then
Me.Sequence = Nz(DMax("[Sequence]", "Projects", "[EntryFiscalYr] = " & Me.[EntryFiscalYr]), 0) + 1
Me.Dirty = False
End If
End Sub
有关如何获得此解决方案的更多信息,建议访问此链接: http://answers.microsoft.com/en-us/office/forum/office_2013_release-access/access-2013-how-do-i-generate-a-record-number/22fa42e1-dd89-4683-b1d0-72b112281c1c