当我单击表单上的按钮时,我想在查询中循环每条记录。表单的记录源是查询。我见过典型的记录集循环,但是为什么要使用Me!和DoCmd。像这样的GoToRecord语法是一个不好的做法?
Private Sub cmdRefresh_Click()
Dim RecordCount
DoCmd.GoToRecord , , acLast
RecordCount = Me.CurrentRecord
If RecordCount Then
DoCmd.GoToRecord , , acFirst
Do Until Me.CurrentRecord >= RecordCount
tbRefresh = "Searching for new RMDs... " & Int((Me.CurrentRecord / RecordCount) * 100) & "%"
Me![RMD_Met] = RMDCalculate
DoCmd.GoToRecord , , acNext
DoEvents
Loop
End If
Me.Requery
tbRefresh = "Last Update: " & Date
End Sub
在Access中总是有几种方法来完成任务。
然而,数据处理的概念意味着你可以编写代码,并让它对数据进行操作。
那么,如果你花时间和金钱来构建一些复杂的更新程序?如果您现在想以另一种形式使用该代码会发生什么?如果你移动表单,你就不能。
同样,如果你有一些记录- 5-10,那么你当然可以编写代码的形式移动到下一个记录。但是这是非常慢的,因为表单显示和更新必须跟着骑行。
所以,在一个漂亮的干净和非常快的运行代码的地方?你的更新速度现在是有限的有多快,你的屏幕可以更新!
更糟糕的是,当您移动到下一个记录(特别是on-current事件)时,通常可能在表单中有一些特殊的逻辑。所以现在,你试图有两组代码运行(你的简单的更新代码运行),和整个更多的其他形式事件等可能触发的船负载。即使不需要,为什么要让表单进行这些缓慢的更新呢?
因此,您还注意到您经常看到代码使用recordSetClone。
如:
Dim rstData as DAO.RecordSet
set rstData = me.RecordSetClone
rstData.MoveFirst
do while rstData.EOF = False
' process records
rstData.MoveNext
loop
因此,在上面,记录集克隆是伟大的,因为您正在查看的当前记录不会改变。因此,recordSetClone是相同的数据,但它允许您循环,处理,移动和处理数据,但表单显示不改变也不关心。
但是,如果你这样做:
dim rstData as DAO.RecordSet
set rstData = me.RecordSet
如果你现在在上面使用moveext等?然后表单显示将跟随移动。
如前所述,这比1万倍还要慢!!
我的意思是,如果我想处理一些数据,没有必要拖着一个巨大的沙袋表单来进行这样的数据处理。
如前所述,在大多数情况下,您还获得了灵活性。
这种类型的更新例程可以独立于表单运行。
那么,一些处理发票或工资单之类的程序?您甚至不需要打开特定的表单。因此,这里的想法是编写独立于表单的例程和代码(当这样做有意义时)。
所以,表单是为用户服务并与用户交互的。
记录集处理是针对计算机代码和需要运行的过程的,这种记录对记录的处理与数据输入的某种形式几乎没有关系。因此不需要使用一些数据输入表单来处理一堆记录。
因此,如果每个记录都不打算与用户交互,那么您几乎永远不会想要在记录上使用表单移动。
我的意思是,你能想象你的银行机器在处理你的交易时在屏幕上闪烁吗?
用户界面的事情是由表单完成的。
数据处理和行处理的许多记录,甚至只是几个不需要表单来"移动";随着时间的推移,这样的设计往往会开始崩溃,因为对这些更新例程的小代码更改现在还必须处理巨大的复杂表单事件模型。
所以,这样的设计不是一个坏主意,它们真的很糟糕。