我正在循环记录集以执行一些基本功能或编辑。
通常记录集的记录超过50条,访问权限将停止响应。
我在循环命令之前有me.repaint
,但窗口总是冻结,访问标题栏显示:...(无响应)。
知道怎么解决这个问题吗?
感谢。
戴夫。
编辑:添加循环代码
If Me.Dirty = True Then Me.Dirty = False
Dim rs As DAO.Recordset
Set rs = Me.Guardians_Subform1.Form.Recordset
Dim strFirstName, strLastName As String
If Not (rs.EOF And rs.BOF) Then
rs.MoveFirst
Do Until rs.EOF = True
rs.Edit
strFirstName = Trim(StrConv(rs!FirstName, 3))
strLastName = Trim(StrConv(rs!LastName, 3))
If rs!FirstName <> strFirstName Then
rs!FirstName = strFirstName
End If
If rs!LastName <> strLastName Then
rs!LastName = strLastName
End If
rs.Update
rs.MoveNext
Me.Repaint
Loop
Else
MsgBox "There are no records in the recordset."
End If
Set rs = Nothing
答案 0 :(得分:3)
使用记录集循环进行此类编辑不是最好的方法。 UPDATE查询效率更高。
e.g。
UPDATE tblGuardians
SET FirstName = Trim(StrConv(FirstName, 3))
WHERE StrComp(FirstName, Trim(StrConv(FirstName, 3)), 0) <> 0
和LastName
相同。
这使用StrComp
而不是简单的<>
比较,因为后者不区分大小写。第三个参数0
= vbBinaryCompare
。
答案 1 :(得分:3)
您需要在循环中调用DoEvents-Function以将控制权传递给操作系统,以重绘Access-GUI并处理可能需要处理的任何其他Window-Messages。这样,应用程序将不会在任务管理器和标题栏中标记为“未响应”。
Do Until rs.EOF = True
[...]
rs.MoveNext
DoEvents
Loop
有一个小的表现权衡。如果不调用DoEvents,循环的总执行时间会稍短,但Access将不执行任何其他操作,然后处理循环。因此它似乎没有回应。
答案 2 :(得分:3)
正如其他人所指出的那样,您可以在继续之前使用DoEvents释放处理器以执行其他操作。当我在循环中使用DoEvents时,我使用计数器。
{{1}}
这样可以防止DoEvents频繁触发并导致整体代码变慢。将计数器调整为您认为合适的任何迭代。