Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值

Posted

技术标签:

【中文标题】Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值【英文标题】:Access 2010 VBA - Open New Recordset - Values Unexpectedly Saved From Before Opening 【发布时间】:2015-06-06 13:08:16 【问题描述】:

我有一个脚本会根据用户的姓氏和识别号自动检测用户是否存在。如果它存在于数据库中,表格将使用正确的数据自动完成,并在保存时更新。如果没有,则在用户输入其余数据并按下保存按钮后,将保存一条新记录。

我遇到的问题是,当脚本自动检测到数据库中确实存在用户时,它会将当前数据(作为姓氏和 ID 号)保存到表中,而将所有其他字段留空。

我的代码:

Private Sub Last_AfterUpdate()

    Dim Check As Integer
    Dim records As Recordset
    Dim tmp As String
    Dim tmp1 As String
    Dim db As Database

    Set db = CurrentDb

    If Not IsNull(Me.ID) Then
        tmp = Me.ID
    End If

    If Not IsNull(Me.Last) Then
        tmp1 = Me.Last
    End If

    Set records = db.OpenRecordset("SELECT * from [EmailList] WHERE ID1= '" & tmp & "' AND " & "Last = '" & tmp1 & "'")
    Me.Recordset.FindFirst "ID=" & records.Fields("ID")

End Sub

注意:字段 IDID1 之间存在差异。它们是我使用的两种身份识别形式。

【问题讨论】:

我觉得你的代码比这里的要多。你在哪里检查用户是否已经存在?您如何自动填写用户信息?目的是什么:Set records = db.OpenRecordset("SELECT * from [EmailList] WHERE ID1= '" & tmp & "' AND " & "Last = '" & tmp1 & "'") @Ryan-w4588 不是您的问题的答案,而只是一个提示:在此代码的末尾,您应该关闭已打开的记录集并从内存中删除记录集和数据库,所以,分别为:records.closeSet records = Nothing,最后是Set db = Nothing @MattHall 我确实知道,我仍在教自己在每个脚本中记住它。谢谢!我将查看我所有的文件以确保我这样做了哈哈。我感谢建设性的批评! 【参考方案1】:

据我所知,您在AfterUpdate 中执行此操作,因此在您检查用户是否存在之前创建记录。我想你想要更像这样的东西:

首先是一个检查用户是否存在的函数:

Public Function UserExists(intID As Integer, strLastName As String) As Boolean
    'If user exists in EmailList Table
    If Nz(DLookup("Last", "EmailList", "Last = '" & strLastName & "' AND ID = " & intID), "") <> "" Then
        UserExists= True
    Else
        UserExists= False
    End If

End Function

然后在你的BeforeUpdate 事件中你想做这样的事情:

Private Sub Last_BeforeUpdate(Cancel As Integer)

    'If user filled out both fields
    If Nz(Me.ID, "") <> "" And Nz(Me.Last, "") <> "" Then

        'If they exist in the database
        If UserExists(Me.ID, Me.Last) Then

           'Cancel saving record and go to the record with their information
           Cancel = True
           Me.Recordset.FindFirst "ID=" & records.Fields("ID")
        End If

    Else 'User didn't fill out both fields.
       MsgBox "You must fill out ID and Last field"
    End If

End Sub

这是粗略的编码,但我觉得这是您完成您正在寻找的目标所要采取的方向。需要根据您的情况调整逻辑。

【讨论】:

您的UserExists 函数是否应该在某处使用intID 参数? 当然应该,感谢您发现这一点。 :-) @Ryan_W4588 没问题,很高兴我能帮上忙。

以上是关于Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA 中的运行时 3464。尝试使用 SQL 选择语句打开记录集

WHERE IN 在 Access VBA 中使用两个记录集进行查询

VBA Access SQL SELECT查询只返回一条记录

从 Access 2010 VBA 打开 Excel 2010 文件

Access 中的 DoCMD.OpenForm - 使用 WHERE 打开具有有限记录集的表单

为啥要克隆 MS-Access 记录集?