【问题标题】:Access, VBA: Find First not working correctly访问,VBA:Find First 无法正常工作
【发布时间】:2016-12-07 02:38:49
【问题描述】:

我希望这对某人来说是一个简单的问题。我有这种方法,它使用两个表单字段来检查表中是否存在记录,然后添加记录或不执行任何操作。所以如果 patient_id 为 100,visit_number 为 1,那么我只会在新记录不存在的情况下添加。

所以,如果 rst.NoMatch 为真 - 添加一条新记录。但是,我无法让它识别重复项。代码如下:

Private Sub add_record_button_Click()
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone

Dim dbs As DAO.Database
Set dbs = CurrentDb


If IsNull(Form.patient_id) Or IsNull(Form.visit_number) = True Then
    MsgBox "Please fill in both fields."
Else
    rst.FindFirst "[patient_id] = " & Form.patient_id & " And [visit_number] = " & Form.visit_number

    If rst.NoMatch Then

        Set rst = dbs.OpenRecordset("Visits")
        rst.AddNew
        rst!patient_id = Form.patient_id
        rst!visit_number = Form.visit_number
        rst.Update
        MsgBox "New patient visit has been added to the database."
    Else
        MsgBox "That visit already exists."
    End If
    rst.Close
End If
End Sub

我认为我的 FindFirst 行不正确。在数据库中,变量命名为 Patient_id 和 visit_number。在表格中,它们的名称相同。

任何帮助将不胜感激,谢谢。

编辑。

从下面的 cmets 中,我能够使我的逻辑正常工作,但使用了不同的比较功能 Dlookup。

IsNull(DLookup("[patient_id]", "MyTable", "[patient_id] = " & Forms("MyForm").patient_id & " AND [visit_number] = " & Forms("MyForm").visit_number)

最终编辑。

如果我直接使用表单,上面的行可以让一切正常工作,但是如果我将表单放入导航表单 - 它就停止工作了。最终让它在导航表单中工作的字符串如下所示:

If IsNull(DLookup("[patient_id]", "Visits", "[patient_id] = " & Me!patient_id.Value & " AND [visit_number] = " & Me!visit_number.Value)) = True Then

感谢大家的帮助。

【问题讨论】:

  • 我没有发现您的代码有任何问题。您的RecordsetClone 是“表格”记录集吗?
  • 这是在黑暗中拍摄的,但这是绑定到表格的表格吗?根据MSDN 对于“表类型”记录集,他们建议使用Seek 而不是Find
  • 我也在挣扎。我只是不熟悉Seek 并且使用两个标准使它比我找到的示例要复杂一些。您可以使用IsNull(DLookup("[patient_id]", "MyTable", "[patient_id] = " & Forms("MyForm").patient_id & " AND [visit_number] = " & Forms("MyForm").visit_number)) 代替.Find/.Seek.NoMatch 来搜索匹配项吗?
  • 您的代码在我的 PC 上运行良好(使用不同的表,不同的字段)。你的两个表单域是文本框吗?如果您想进行实验,那么您可以: (1) 显示您的“FindFirst”搜索字符串并查找问题。 (2) 在设计器中创建一个查询,然后使用您的搜索字符串作为条件。另一项测试是添加代码以打开带有查询的记录集。事情会出现。
  • "MyForm" 只是一个占位符。将其替换为表单的实际名称,它应该可以工作。小心使用 Form.Field 等表单引用。这不是明确定义您的表单,只是引用调用该过程的表单对象。使用 forms ("MyFormName").field 或 [Forms]![MyFormName]![field] 明确。

标签: vba ms-access


【解决方案1】:

没见过Form这样用过,应该可以直接在表单中添加记录,试试吧:

Private Sub add_record_button_Click()

Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone

Dim PatientId As Variant
Dim VisitNumber As Variant

PatientId = Me!patient_id.Value
VisitNumber = Me!visit_number.Value

If IsNull(PatientId) Or IsNull(VisitNumber) Then
    MsgBox "Please fill in both fields."
Else
    rst.FindFirst "[patient_id] = " & PatientId & " And [visit_number] = " & VisitNumber & ""    
    If rst.NoMatch Then
        rst.AddNew
            rst!patient_id.Value = PatientId
            rst!visit_number.Value = VisitNumber
        rst.Update
        MsgBox "New patient visit has been added to the database."
    Else
        MsgBox "That visit already exists."
        Me.Bookmark = rst.Bookmark
    End If
End If

End Sub

【讨论】:

  • 这以一种奇怪的方式中断。对于第一个条目,从我第一次打开表单开始,它允许我输入任何选项——即使我输入的是已经存在的选项。但是在那之后,它似乎注意到它现在是重复的,并且不会让我再次输入它。然后它也不允许我在不关闭并重新打开表单的情况下更改表单字段。
  • 是的,您可能需要重新设计一点。我相信您混淆了数据输入和数据搜索字段。
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多