我有Table1
CustomerID
和Category
作为主键,以及我用来编辑此表格的表单。表单中有多个FieldComboBoxes
包含其他信息,CategoryComboBox
在选择选项后更新表。
我尝试做的是查找表中是否存在主键,如果存在,则查找并编辑该行。我在CategoryComboBox的On Change事件中使用VBA:
Dim db As DAO.Database
Dim rec As DAO.Recordset
Set db = CurrentDb
Set rec = db.OpenRecordset("Table1")
If Not IsNull(DLookup("CustomerID", "Table1", "CustomerID = " & [CustomerID] AND _
"Category = '" & CategoryComboBox.Value & "'")) Then
rec.Edit
rec!CustomerID = CustomerID
rec!Category = CategoryComboBox.Value
rec!Field1 = Field1ComboBox.Value
rec!Field2 = Field2ComboBox.Value
...
rec.Update
End If
如果表中存在与表单中当前记录具有相同主键的行,我希望它更新该行,但是无论PrimaryKey如何,它都会更新表中的第二行。我也尝试在AddNew命令之前添加If Category = CategoryComboBox.Value
,但它没有效果。
简而言之,我如何获取Access以选择和编辑特定行 - 在我的情况下,使用正确的主键行?
答案 0 :(得分:2)
您的代码显示"如果表1中存在此客户和类别的记录,则为该客户和类别添加新记录到表1中。如果您正在编辑现有行而不是添加新行,那么您的编辑将是无操作,因为您将客户和类别设置为与您的标准相匹配 - 所以我假设缺少某些内容从您的示例和下面显示的[other_field]和'新值'。
首先,对于像你描述的那样的操作,直接使用SQL要快得多,而不是创建记录集,对记录进行客观化,并通过VBA进行更新。 EG:
currentdb.execute "UPDATE Table1 set [other_field] = 'new value' where CustemerID = " & CustemerID & " AND Category = '" CategoryComboBox.Value & "';"
但是如果你确实有一些复杂的东西并且需要一个VBA钩子来记录那么第一选择就是限制记录集:
Set rec = db.OpenRecordSet "select * from Table1 where customerID = " & CustomerID & " AND CategoryComboBox.Value = '" & CategoryComboBox.Value & "';"
if rec.RecordCount > 0 then
rec.movefirst
rec.edit
rec.[other field] = 'new value'
rec.update
rec.close
end if
同样,尽可能多地使用sql。
如果您因为其他原因确实需要记录集中的所有内容,那么
Set rec = db.OpenRecordSet "Table1"
if rec.RecordCount > 0 then
rec.findfirst("customerID = " & CustomerID & " AND CategoryComboBox.Value = '" & CategoryComboBox.Value & "'")
if not rec.nomatch then
rec.edit
rec.[other field] = 'new value'
rec.update
rec.close
end if
end if
答案 1 :(得分:1)
这有用吗?我很困惑它将如何根据customerID知道要更新哪条记录,因为我认为可能有多个,但我认为这会让你更接近。
Dim db As DAO.Database
Dim rec As DAO.Recordset
Dim sql As String
Set db = CurrentDb
Set rec = db.OpenRecordset("Table1")
If IsNull(DLookup("CustomerID", "Table1", "CustomerID = " & Me![CustomerID] AND _
"Category = '" & Me!CategoryComboBox.Value & "'")) Then
rec.AddNew
rec!CustomerID = CustomerID
rec!Category = CategoryComboBox.Value
rec.Update
ELSE:
sql = "UPDATE Table1 SET Category = " & Me!CategoryComboBox.Value & " WHERE CustomerID = " & Me![CustomerID]
DoCmd.RunSql sql
End If
Set rec = Nothing
Set db = Nothing
Exit Sub
End Sub