自定义自动编号

时间:2015-09-24 13:19:44

标签: ms-access access-vba ms-access-2010

我正在将Excel电子表格转换为Access数据库。我是Access的新手,虽然我通过当地的培训公司参加过几门课程。在我转换的电子表格中,我们目前使用一个“跟踪”号码来识别每个主记录(将在我的新主表中),格式为“YY-XXXX”,其中“YY”是当前的2 -digit ye​​ar和“XXXX”是一个序列号,从0001开始,每年可以达到9999。因此,2014年的最后一次记录可能是14-1025,而2015年的第一个记录是15-0001。

为了保持旧数据的一致性,我想使用相同的编号系统。我知道我可以生成一个标准的自动编号作为主键(我也可以这样做,但我希望在表单中创建一个新记录时,这个YY-XXXX字段会自动排序。所以,你怎么能推荐这样做的方法?

我的第一个想法是创建和合并两个字符串,一个将当前日期转换为两位数的文本字段,另一个是序列的自动编号?我玩过这个并没有得到任何工作。我不太擅长VBA代码,因此它只是尝试创建表,字段和表达式。但也许VBA是唯一的方法。

虽然我不知道如何做到这一点,但是一个可接受的选项可能包括使用六位数的自动编号,并且只是在前两位数后用短划线格式化,以及一种轻松重启编号的方法,即在明年1月1日,将自动编号设置为160001(格式为16-0001)。

那里有什么好主意吗?

2 个答案:

答案 0 :(得分:1)

我已多次设置类似的系统。连接两个值总是比将它们分开更简单。正如您所提到的,为您的PK使用自动编号。然后创建两个单独的整数(非文本)字段 - TrackYear,TrackSequence并在两者的组合上设置唯一索引。 在表单的BeforeUpdate(NOT BeforeInsert)事件中添加以下内容:

If Me.NewRecord Then
ME!TrackYear = Format(Date,"YY")
Me!TrackSequence = Nz(DMax("TrackSequence",<yourTable>,"TrackYear=" & Format(Date,"YY")),0) + 1
End If

根据您的表创建一个查询,包括所有字段,以及另一个计算列TrackingNbr:TrackYear&amp; &#34; - &#34; &安培;格式(TrackSequence,&#34; 0000&#34)。 您想要查看TrackingNbr的任何地方,请使用此查询。 要从Excel工作表导入,您需要拆分现有数字,但这是一次性的事情。您可以在Excel中编写公式,也可以在Access中的附加查询中执行此操作,无论您更熟悉。

答案 1 :(得分:1)

由于您的跟踪号是标准格式并且填充0,因此应该很容易获得每个给定年份的最后一个,拆分两个部分,递增序列部分,然后返回下一个部分。

这是我将如何做到的。

将其粘贴到新模块中。 (务必将 MainTable 更改为主表名称,并将 TRACKING_NO 更改为跟踪编号列名称)

Function GetNextTrackingNo(Optional nYear As Long = 0) As String 'be sure to pass nYear as 2 digit year if you ever use that option!
  Dim strLastTN As String     'get the last tracking number per given year
  Dim nSEQ As Long

  If nYear = 0 Then nYear = Year(Now) - 2000 'year was not passed so use current year; -2000 should be fine until year 2100

  'Get the last Tracking number for the given year
  strLastTN = Nz(DMax("TRACKING_NO", "MainTable", "Left([TRACKING_NO],2) = '" & nYear & "'"), 0)

  'get the sequence number from the string
  nSEQ = CLng(Right(strLastTN, 4))

  'increment the sequence so you get the next one.
  nSEQ = nSEQ + 1

  'you might want to have a check here to see if next sequence is greater than 9999!

  'return the next tracking number in the desired format
   GetNextTrackingNo = Format(nYear, "00") & "-" & Format(nSEQ, "0000")

End Function

您可以在另一个功能中测试它:

Function TestGetNextTrackingNo()

  MsgBox GetNextTrackingNo 'show the next tracking number for this year
  MsgBox GetNextTrackingNo(14)  ' show the next tracking number for last year
  MsgBox GetNextTrackingNo(16) 'show next tracking number for next year

End Function

您可以使用Form_BeforeInsert(将 TRACKING_NO 更改为跟踪编号列名称)在表单中使用该功能

Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.TRACKING_NO = GetNextTrackingNo
End Sub

或者如果您想在当前记录中使用日期字段来指定年份,请使用此字段:

Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.TRACKING_NO = GetNextTrackingNo  Year(me.MyDateControl)-2000
End Sub