我想为我的 UserID 字段生成一个自动编号。
我正在尝试通过 VBA 生成我的用户 ID,因为 Access 的自动编号不是连续的。
我的代码不会填写自动编号,而是 UserID 最终为 0,这是默认值。
Private Sub RegistrationBtn_Click()
Dim db As Database
Dim rst As DAO.Recordset
Dim strMember As String
strMember = "" & Me!CallSign
Autonumber = Nz(DMax("[UserID]", "[Memberstbl]"), 0) + 1
If Len(strMember) = 0 Then Exit Sub
Set db = CurrentDb
Set rst = db.OpenRecordset("Memberstbl", dbOpenDynaset)
With rst
.FindFirst "CallSign = '" & strMember & "'"
If .NoMatch Then
.AddNew
!UserID = Autonumber
!CallSign = strMember
MsgBox "Welcome to the UNCC"
DoCmd.OpenForm "Logonfrm"
DoCmd.Close acForm, "Registration"
Else
MsgBox "That Call Sign is already in use!"
End If
.Close
End With
Set rst = Nothing
Set db = Nothing
End Sub
我认为您遇到的问题是您没有使用
.Update
完成记录的添加。尝试:
If .NoMatch Then
.AddNew
!UserID = Autonumber
!CallSign = strMember
.Update 'Needed to "commit" the adding of the new record
好吧,让我们把卡车倒过来一点。
用户输入呼号。 检查呼号是否存在 - 如果存在,则不要继续。
如果呼号不存在,生成新号码和新记录。
然后启动表格到新记录以填写其他信息。
换句话说,我们不能,也不要在“添加模式”下启动第二种形式,否则你会得到两条记录(这解释了你的另一个问题 - 两条记录)。所以我们不能也不想将第二个表格启动到新记录,因为我们假设我们已经创建了该记录,对吗??
所以,第一段代码——检查现有的呼号——让我们 100% 分开,如果我们有绿灯添加呼号记录(以及新生成的号码),就不要尝试合并该操作。
所以,第一段代码应该是这样的:
Dim strTable As String
Dim strMember As String
strTable = "Memberstbl"
If Nz(Me.CallSign, "") = "" Then
MsgBox "Please enter a call sign", vbCritical, "Enter Call sign"
Exit Sub
End If
' get here, user entered a call sign.
' check if exists.
Dim strWhere As String
strWhere = "CallSign = '" & Me.CallSign & "'"
If Nz(DLookup("CallSign", strTable, strWhere), "") <> "" Then
MsgBox "That call sign is already in use, try another", vbInformation, "In use"
Exit Sub
End If
' if we reach here, then user entered a call sign, and it not in use.
' create new reocrd, new UserID, and then launch form to this record.
Dim NewUserID As Long
NewUserID = Nz(DMax("UserID", strTable), 0) + 1
Dim rstMember As DAO.Recordset
Set rstMember = CurrentDb.OpenRecordset(strTable)
With rstMember
.AddNew
!UserId = NewUserID
!CalSign = Me.CallSign
.Update
.Close
End With
' now launch form to this new record
DoCmd.OpenForm "Logonfrm", , , "UserID = " & NewUserID
DoCmd.Close acForm, Me.Name
确保 Logonfrm 设置为数据输入 =“否”。 (如果你设置是,那么表单只能添加记录——但我们已经在代码中做到了)。
查看 6 月 7 日的评论,但如果你想继续尝试这些东西。确保 UserID 仍然不是自动编号,并确保 UserID 具有与外键相同的数据类型。这两种情况我都见过。然后确保 UserID 仍然是 UsersTable 的主键。那时您可以建立关系,但级联更新存在问题。我的 Access 2016 副本拒绝级联更新,但允许级联删除。除了错误消息外,我看不出有任何问题,因为访问已经使更改主键变得困难。看这里:https://support.microsoft.com/en-us/office/guide-to-table-relationships-30446197-4fbe-457b-b992-2f6fb812b58f#:~:text=When%20you%20enforce%20referential %20integrity,that%20reference%20the%20primary%20key.