2016-10-31 190 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,都使用該查詢。