循环访问 Access 记录集提供了不正确的计数

问题描述

添加了 VBA 代码(如下)来循环访问 Access 查询的结果。此代码的目的是计算 500 在特定列中出现的次数。一旦达到 500,它就会抓住时间并增加 30 分钟。客户不希望在 30 分钟的窗口中再次计算 500。

这一直有效,直到最后一次是晚上 11:30 之后。晚上 11:30 之后,“MyEnd”变量设置为第二天的上午时间。它退出循环,然后计算下一个 500;这使我的实际数从我的 1 中消失了。

我可以从计数中减去 1,但我不知道这是否总是正确的。它们可能是多个 500,并且计数也会关闭

我试图确定如何处理代码在晚上 11:30 之后找到 500 的最后 2 次。

任何建议将不胜感激。感谢您的帮助.....

Dim strsql As String
Dim rs As DAO.Recordset
Dim MyStart As Date
Dim MyEnd As Date
Dim CntA As Integer
    
CntA = 0
MyStart = 0
    
strsql = "SELECT * FROM FurDet ORDER BY FurDet.Time"
        
Set rs = CurrentDb.OpenRecordset(strsql)
    
If Not rs.BOF And Not rs.EOF Then
        
     rs.MoveFirst
            
     While (Not rs.EOF)
        
          DoEvents
                    
          If rs.Fields("503D") = 500 Then
                
               MyStart = TimeValue(rs.Fields("Time"))
               MyEnd = TimeValue(MyStart + "0:30")
                
               CntA = CntA + 1
                
               Do Until TimeValue(rs.Fields("Time")) > TimeValue(MyEnd) Or rs.EOF = True                        
                    DoEvents                        
                    rs.MoveNext                        
                    If rs.EOF = True Then Exit Do                        
               Loop
                
          End If
            
          If rs.EOF = True Then
'               do nothing
          Else
              rs.MoveNext
          End If
                    
     Wend
        
End If
   
Debug.Print CntA

解决方法

您应该将时间存储为日期,而不是文本。无论如何,试试这个,包括日期:

Dim StartDate   As Date
Dim MyTime      As Date

' <snip>

StartDate = Date

rs.MoveFirst            
While Not rs.EOF
    If rs.Fields("503D").Value = 500 Then                
        MyStart = StartDate + TimeValue(rs.Fields("Time"))
        MyEnd = DateAdd("n",30,MyStart)                
        CntA = CntA + 1       
        Do
            MyTime = TimeValue(rs.Fields("Time").Value)
            rs.MoveNext                        
        Loop Until DateDiff("n",MyStart + MyTime,MyEnd) > 0 Or rs.EOF
    End If
    rs.MoveNext
Wend
rs.Close