2016-10-31 152 views
0

我是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外键(关系)和另一个索引以使其唯一。 但问题是第二个表我不能找出一种方法使它成为自动编号/运行编号,因为它可能会重演。MS Access - 如何使用子自动编号生成自动编号

目前没有想法,需要一些帮助。

回答

0

我建议不要将序列号用作表中的主键/外键。使用数字字段为:主要的自动编号和外部的编号。它工作得更快,更自动。

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

+0

所以第一张表我得到了一个主要的自动编号和一个外国编号。然后第二个表我怎么用pubilc函数生成序列号?当你提到“锁定”时,如何锁定号码? – KokJoo89

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 

使用计算字段构建查询以创建组合'SerialNumber'。

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

无论您想要显示SerialNumber,都使用该查询。