MS Access - 如何使用子自动编号生成自动编号

时间:2016-10-31 01:31:54

标签: ms-access

我是MS Access的新手。目前我需要创建一个序列号,一个带有子自动编号的自动编号对。像M1-1,M1-2,M1-3,...... M2-1,M2-2,M2-3,...... M3-1,M3-2 ......这个数字必须是唯一的。 我为M1,M2,M3创建了一个主运行编号表...创建一个索引使其独一无二。然后另一个表为子号,1,2,3,4,......之后是一个MainNum外键(关系)和另一个索引,使其唯一。 但问题是第二个表格,我无法找到一种方法使其成为自动编号/运行编号,因为它可能会重复。

目前缺乏想法,需要一些帮助。

2 个答案:

答案 0 :(得分:0)

我建议不要在表格中使用序列号作为主键/外键。为此使用数字字段:autonumber表示primary,数字表示foreign。它的工作速度更快,更自动。

用于生成序列号创建公共函数,它可以根据参数返回下一个值或可选的当前值。表中序列号的第一部分和第二部分的当前值存储在表中,在生成新数字时将其锁定,即使在多用户环境中也将保证唯一的下一个数字。此外,您可以将所有生成的数字存储在表中,并在两个数字上都包含复合唯一索引。

答案 1 :(得分:0)

使您的PK成为自动编号并将其用于任何关系。对于序列号,请使用两个长整数字段(SN1,SN2)。在表单的before_update事件中,对于新记录,请调用公共函数以生成新的序列号'。

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim lngSN1 AS Long
Dim lngSN2 as Long
If Me.NewRecord Then
'if SN1 is not to be incremented, set it here to whatever you want
If GetSerials(SN1, SN2) Then
Me!SN1 = lngSN1
Me!SN2 = lngSN2
Else
Cancel = True
End If
End If
End Sub

Public Function GetSerials(ByRef SN1 as Long, ByRef SN2 as Long) AS Boolean
If SN1 = 0 Then
SN1 = Nz(DMax("SN1","<yourTable>"), 0) + 1
SN2 = 1
Else 
SN2 = DMax("SN2", "<yourtable>","SN1=" & SN1) + 1
End IF
GetSerials = True
End Function

使用计算字段构建查询以创建复合&#39; SerialNumber&#39;。

SELECT *, "M" & SN1 & "-" & SN2 as SerialNumber FROM <yourtable>

在您想要显示SerialNumber的任何地方使用该查询。