我正在将Excel电子表格转换为Access数据库。我是Access的新手,虽然我通过当地的培训公司参加过几门课程。在我转换的电子表格中,我们目前使用一个“跟踪”号码来识别每个主记录(将在我的新主表中),格式为“YY-XXXX”,其中“YY”是当前的2 -digit year和“XXXX”是一个序列号,从0001开始,每年可以达到9999。因此,2014年的最后一次记录可能是14-1025,而2015年的第一个记录是15-0001。
为了保持旧数据的一致性,我想使用相同的编号系统。我知道我可以生成一个标准的自动编号作为主键(我也可以这样做,但我希望在表单中创建一个新记录时,这个YY-XXXX字段会自动排序。所以,你怎么能推荐这样做的方法?
我的第一个想法是创建和合并两个字符串,一个将当前日期转换为两位数的文本字段,另一个是序列的自动编号?我玩过这个并没有得到任何工作。我不太擅长VBA代码,因此它只是尝试创建表,字段和表达式。但也许VBA是唯一的方法。
虽然我不知道如何做到这一点,但是一个可接受的选项可能包括使用六位数的自动编号,并且只是在前两位数后用短划线格式化,以及一种轻松重启编号的方法,即在明年1月1日,将自动编号设置为160001(格式为16-0001)。
那里有什么好主意吗?
答案 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