Access-VBA для цикла выполняется только один раз - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь измерить продолжительность между двумя обновлениями.уже есть таблица, которая отслеживает «lastvalue», «newvalue» и «updatetime».Мой способ состоит в том, чтобы искать объекты, которые удовлетворяют условиям, и назначать соответствующие времена обновления для переменных, а затем вычислять.Однако мои циклы for не работают, они выполняются только один раз.Я новичок в access-vba и использую debug.prints, чтобы увидеть, как все меняется (они постоянны).Ниже мой код, спасибо

Private Sub olcum()

Dim gs As Long
Dim db As Database
Dim rs As Recordset
Dim pt As Date
Dim ct As Date
Dim pc As String
Dim cc As String
Dim id As Integer
Dim i As Integer
Dim l As Integer
Dim k As Integer
'Dim a As Index
Dim strMessage As String


Set db = CurrentDb
Set rs = db.OpenRecordset("GecenSure", dbOpenSnapshot)
pc = "acilmasi bekleniyor"
cc = "onayda"


rs.MoveFirst
For i = 0 To (rs.RecordCount - 1)
    strMessage = "Burada: " & (rs.AbsolutePosition + 1)
    Debug.Print (strMessage)
    'Set a = rs.AbsolutePosition
    'Debug.Print (a)
    id = rs.Fields("Kimlik")
    rs.MoveFirst

    For l = 0 To (rs.RecordCount - 1)
        strMessage = "Burada: " & (rs.AbsolutePosition + 1)
        Debug.Print (strMessage)
        If (rs.Fields("Kimlik") = id) And (rs.Fields("PreviousCase") = pc) Then
        pt = rs.Fields("UpdateTime")
        Else
        End If

        For k = 0 To (rs.RecordCount - (1 + l))
            strMessage = "Burada: " & (rs.AbsolutePosition + 1)
            Debug.Print (strMessage)
        'If (rs.Fields("Kimlik") = id) And (rs.Fields("CurrentCase") = cc) Then
            'Debug.Print "rs.AbsolutePosition"
            If (rs.Fields("Kimlik") = id) And (rs.Fields("PreviousCase") = cc) Then
            ct = rs.Fields("UpdateTime")
            Else
            End If
        'Else
        'End If
        rs.MoveNext
        strMessage = "Burada: " & (rs.AbsolutePosition + 1)
        Debug.Print (strMessage)
        Next k
        'bu prosedurle 2 kere ct atıyor.

    rs.MoveFirst

    For z = 0 To i
    rs.MoveNext
    strMessage = "Burada: " & (rs.AbsolutePosition + 1)
    Debug.Print (strMessage)
    Next z

    Next l

    gs = ct - pt
    Debug.Print gs

    'Debug.Print rs.Fields("CurrentCase")
rs.MoveNext
strMessage = "Burada: " & (rs.AbsolutePosition + 1)
Debug.Print (strMessage)
Next i

rs.Close
Set rs = Nothing
db.Close

MsgBox "Simdiki durumlar gosterildi"

End Sub

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Я предлагаю использовать такую ​​структуру:

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
0 голосов
/ 27 января 2019

rs.RecordCount не возвращает общее количество записей в наборе записей;скорее он возвращает количество записей, к которым уже обращались .

Есть несколько вариантов;вариант 3 часто считается лучшим, и этот метод используется во многих примерах Microsoft:

  1. rs.MoveLast - до цикла;это не параметр перформанта
  2. Запрос SQL Количество - перед циклом определите количество записей
  3. Используйте Пока или Do проверка цикла для rs.EOF (см. https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/bb243789(v=office.12)

Пример цикла Do:

Set rs = db.OpenRecordSet("GecenSure", dbOpenSnapshot)

Do Until rs.EOF
    ' do something
    rs.MoveNext
Loop

rs.Close
Set rs = Nothing
...