vba - 更新现有记录并在表中添加新记录 - 仅更新一条记录(MS Access VBA)
问题描述
我最近读了这篇文章:更新现有记录并在表中添加新记录(MS Access VBA)
一个经过深思熟虑和优雅的解决方案,但在我的实现中,只有 tblTempData 表的第一条记录被添加(或更新,如果存在)到 tblCommon 表。
原始帖子的完整代码是:
Option Explicit
Private rsCommon As DAO.Recordset
Public Sub UpdateExistingRecords()
On Error GoTo ErrTrap
Dim rs As DAO.Recordset
Set rs = CurrentDb().OpenRecordset("SELECT * FROM tblTempData", dbOpenSnapshot)
Set rsCommon = CurrentDb().OpenRecordset("SELECT * FROM tblCommon", dbOpenDynaset)
Dim idx As Long
For idx = 1 To rs.RecordCount
If ExistsInCommon(rs![Item ID]) Then
If Not Update(rs) Then
MsgBox "Failed to update.", vbExclamation
GoTo Leave
End If
Else
If Not Add(rs) Then
MsgBox "Failed to add.", vbExclamation
GoTo Leave
End If
End If
rs.MoveNext
Next
Leave:
If Not rs Is Nothing Then rs.Close
If Not rsCommon Is Nothing Then rsCommon.Close
Set rs = Nothing
Set rsCommon = Nothing
Exit Sub
ErrTrap:
MsgBox Err.Description, vbCritical
Resume Leave
End Sub
' Exists - 'Assumes Id is String
Private Function ExistsInCommon(ByVal Id As String)
ExistsInCommon = DCount("*", "tblCommon", "[Item ID] = '" & Id & "'") > 0
End Function
' Update
Private Function Update(rs As DAO.Recordset) As Boolean
With rsCommon
.FindFirst "[Item ID] = '" & rs![Item ID] & "'"
If .NoMatch Then Exit Function
.Edit
![Item Description] = rs![Item Description]
![Material Number] = rs![Material Number]
![User] = rs![User]
![Supplier] = rs![Supplier]
![Current Status] = rs![Current Status]
![Remarks] = rs![Remarks]
.Update
.MoveFirst
End With
Update = True
End Function
'Add
Private Function Add(rs As DAO.Recordset) As Boolean
With rsCommon
.AddNew
![Item Description] = rs![Item Description]
![Material Number] = rs![Material Number]
![User] = rs![User]
![Supplier] = rs![Supplier]
![Current Status] = rs![Current Status]
![Remarks] = rs![Remarks]
![Item ID] = rs![Item ID]
.Update
End With
Add = True
End Function
在进一步审查中,我认为 tblTempData 的记录计数代码存在问题
Dim rs As DAO.Recordset
Set rs = CurrentDb().OpenRecordset("SELECT * FROM tbl_kpi_data_temp", dbOpenSnapshot)
Set rsCommon = CurrentDb().OpenRecordset("SELECT * FROM tbl_kpi_data_leonardo", dbOpenDynaset)
Dim idx As Long
For idx = 1 To rs.RecordCount
当我的 tblTempData 中有更多记录时,这将为我返回 1。如果我用固定值替换 rs.RecordCount(出于测试目的),我会得到我硬编码的记录数,并按预期添加或更新了固定值。
有任何想法吗?
非常感谢
解决方案
推荐阅读
- python-3.x - odoo 11 / Python 3:如果排除某些工作日,如何查找订阅的到期日期
- c++ - 不匹配调用内部类对象的向量
- google-calendar-api - 是否可以在不冒超出使用配额的情况下使用 Google Calendar API 事件手表?
- java - Selenium:'包 org.openqa.selenium 不存在'
- ruby-on-rails - 如何使用 || 减少“复杂性太高” - 或运算符
- visual-c++ - c++ Visual Studio 2017通过标题数据读取png维度
- excel - 停止 UserForm_Initialize 触发 ToggleButton_Click 事件
- elm - 多元函数组合
- php - 用 PHP 减去字母数字值
- java - 没有 Java 加密扩展 (JCE) 无限强度管辖策略文件的 Java 加密