使用自动编号添加记录

问题描述 投票:0回答:3

我想为我的 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
vba ms-access ms-access-2016
3个回答
2
投票

我认为您遇到的问题是您没有使用

.Update
完成记录的添加。尝试:

    If .NoMatch Then
        .AddNew
        !UserID = Autonumber
        !CallSign = strMember
        .Update    'Needed to "commit" the adding of the new record

2
投票

好吧,让我们把卡车倒过来一点。

用户输入呼号。 检查呼号是否存在 - 如果存在,则不要继续。

如果呼号不存在,生成新号码和新记录。

然后启动表格到新记录以填写其他信息。

换句话说,我们不能,也不要在“添加模式”下启动第二种形式,否则你会得到两条记录(这解释了你的另一个问题 - 两条记录)。所以我们不能也不想将第二个表格启动到新记录,因为我们假设我们已经创建了该记录,对吗??

所以,第一段代码——检查现有的呼号——让我们 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 设置为数据输入 =“否”。 (如果你设置是,那么表单只能添加记录——但我们已经在代码中做到了)。


0
投票

查看 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.

© www.soinside.com 2019 - 2024. All rights reserved.