编辑Access 2013表中的特定行

时间:2016-04-21 17:20:34

标签: vba ms-access access-vba ms-access-2013

我有Table1 CustomerIDCategory作为主键,以及我用来编辑此表格的表单。表单中有多个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以选择和编辑特定行 - 在我的情况下,使用正确的主键行?

2 个答案:

答案 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