【发布时间】: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] 明确。