Sql Access VBA For循环仅执行一次
我试图测量两次更新之间的持续时间。已经有一个表跟踪“lastvalue”、“newvalue”和“updatetime”。我的方法是搜索满足条件的实体,将相关的更新时间分配给变量,然后进行计算。 然而,我的for循环不起作用,它们只执行一次。我对访问vba和使用debug.prints来查看事物如何变化(它们是永久性的)是新手。下面是我的代码,谢谢Sql Access VBA For循环仅执行一次,sql,for-loop,ms-access,vba,Sql,For Loop,Ms Access,Vba,我试图测量两次更新之间的持续时间。已经有一个表跟踪“lastvalue”、“newvalue”和“updatetime”。我的方法是搜索满足条件的实体,将相关的更新时间分配给变量,然后进行计算。 然而,我的for循环不起作用,它们只执行一次。我对访问vba和使用debug.prints来查看事物如何变化(它们是永久性的)是新手。下面是我的代码,谢谢 Private Sub-olcum() 长的 dimdb作为数据库 将遥感器作为记录集 将pt变暗为日期 作为日期的Dim ct 将pc设置为字符串
Private Sub-olcum()
长的
dimdb作为数据库
将遥感器作为记录集
将pt变暗为日期
作为日期的Dim ct
将pc设置为字符串
Dim cc As字符串
作为整数的Dim id
作为整数的Dim i
作为整数的Dim l
将k变为整数
“将a作为索引
Dim strMessage作为字符串
Set db=CurrentDb
Set rs=db.OpenRecordset(“geconsure”,dbOpenSnapshot)
pc=“acilmasi bekleniyor”
cc=“onayda”
先走一步
对于i=0到(rs.RecordCount-1)
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
'设置a=绝对位置
'Debug.Print(a)
id=rs.字段(“Kimlik”)
先走一步
对于l=0到(rs.RecordCount-1)
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
如果(rs.Fields(“Kimlik”)=id)和(rs.Fields(“PreviousCase”)=pc),则
pt=rs.Fields(“更新时间”)
其他的
如果结束
对于k=0到(rs.RecordCount-(1+l))
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
'如果(rs.Fields(“Kimlik”)=id)和(rs.Fields(“CurrentCase”)=cc),则
'Debug.Print“rs.AbsolutePosition”
如果(rs.Fields(“Kimlik”)=id)和(rs.Fields(“PreviousCase”)=cc),则
ct=rs.Fields(“更新时间”)
其他的
如果结束
”“否则呢
"完"
下一个
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
下一个k
“在奥约尔的凯雷ct 2号程序。
先走一步
对于z=0到i
下一个
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
下一个z
下一个l
gs=ct-pt
调试。打印gs
'Debug.Print rs.Fields(“CurrentCase”)
下一个
strMessage=“Burada:&(绝对位置+1)
调试.打印(strMessage)
接下来我
rs.Close
设置rs=无
db.关闭
MsgBox“Simdiki durumlar gosterildi”
端接头
不返回记录集中的记录总数;而是返回已被访问的记录数
有几种选择;选项3通常被认为是最好的,并且是许多Microsoft示例中使用的方法:
Set rs = db.OpenRecordSet("GecenSure", dbOpenSnapshot)
Do Until rs.EOF
' do something
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
不返回记录集中的记录总数;而是返回已访问的记录数
有几个选项;选项3通常被认为是最好的,并且是许多Microsoft示例中使用的方法:
Set rs = db.OpenRecordSet("GecenSure", dbOpenSnapshot)
Do Until rs.EOF
' do something
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
我建议使用如下结构:
If Not (rs.BOF And rs.EOF) Then ' if not completely empty
rs.MoveFirst ' start at the beginning
Do While Not rs.EOF ' while not at end
do something
increment i if necessary
' error checking if needed:
If i > ... Or SomethingUnwanted Then Exit Do
rs.MoveNext
Loop
End If
rs.Close
我建议使用如下结构:
If Not (rs.BOF And rs.EOF) Then ' if not completely empty
rs.MoveFirst ' start at the beginning
Do While Not rs.EOF ' while not at end
do something
increment i if necessary
' error checking if needed:
If i > ... Or SomethingUnwanted Then Exit Do
rs.MoveNext
Loop
End If
rs.Close
我认为这可能是由于“dbOpenSnapshot”,但据我所知,使用“rs.AbsolutePosition”,需要以快照或动态集的形式打开。我认为这可能是由于“dbOpenSnapshot”,但据我所知,使用“rs.AbsolutePosition”,需要以快照或动态集的形式打开请注意,从技术上讲,
rs.MoveFirst
不是必需的,尤其是如果您刚刚打开它。如果您对同一记录集进行多次传递,这是有意义的,但在95%以上的情况下,我们只对记录集进行一次传递。消除rs.MoveFirst
也可以消除need检查BOF/EOF,切割3行并保存一定程度的缩进。请注意,rs.MoveFirst
在技术上不是必需的,特别是如果您刚刚打开它。如果您对同一记录集进行多次传递,这是有意义的,但在95%以上的情况下,我们只对记录集进行一次传递。消除rs.MoveFirst
也无需检查BOF/EOF,切割3行并保存一定程度的压痕。吹毛求疵:我不想像#3中所建议的那样做do而不是rs.EOF
。使用do直到rs.EOF
的代码样本读起来更好,依我看。吹毛求疵:我不想像#3中所建议的那样做而不是rs.EOF
IMO,使用Do直到rs.EOF
读得更好为止对样本进行编码。