Sql Access VBA For循环仅执行一次

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设置为字符串

我试图测量两次更新之间的持续时间。已经有一个表跟踪“lastvalue”、“newvalue”和“updatetime”。我的方法是搜索满足条件的实体,将相关的更新时间分配给变量,然后进行计算。 然而,我的for循环不起作用,它们只执行一次。我对访问vba和使用debug.prints来查看事物如何变化(它们是永久性的)是新手。下面是我的代码,谢谢

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示例中使用的方法:

  • rs.MoveLast-循环之前;这不是一个性能选项
  • 查询SQL计数-在循环之前,确定记录数
  • 使用WhileDo循环检查rs.EOF (见
  • Do循环的一个示例:

    Set rs = db.OpenRecordSet("GecenSure", dbOpenSnapshot)
    
    Do Until rs.EOF
        ' do something
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    不返回记录集中的记录总数;而是返回已访问的记录数

    有几个选项;选项3通常被认为是最好的,并且是许多Microsoft示例中使用的方法:

  • rs.MoveLast-循环之前;这不是性能选项
  • 查询SQL计数-在循环之前,确定记录数
  • 使用WhileDo循环检查rs.EOF (见
  • Do循环的一个示例:

    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
    读得更好为止对样本进行编码。