rs.movenext не работает - ошибка времени выполнения 3021 - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь просмотреть все записи в моей таблице "dbo.Bauteilspezifikation" и использовать идентификаторы для вызова другой функции в цикле Do-Loop.

Здравствуйте, я использую Access 2010 для получения данных изSQL Server 2012. Здесь я пытаюсь проверить все записи таблицы и изменить их, если определенная дата просрочена.Идея состоит в том, чтобы использовать идентификатор «BauteilID» в качестве переменной для функции «Check_Freigabe».Но после первого цикла, набор записей кажется потерянным.Это может быть связано с тем, что в функции «Check_Freigabe» создается новый набор записей.

Я пытался создать другой набор записей (rs2 в дополнение к rs), но затем я получаю сообщение об ошибке, когда Access сообщает мне, что набор записей закрыт.

Есть идеи?

Public Sub Update_Freigabe()
Dim stmt As String
Dim bt_id As Long

    stmt = " Select BauteilID from dbo.Bauteilspezifikation " & _
            " where gesperrt = '0' order by BauteilID asc; "
    'Debug.Print (stmt)
    getSelect (stmt)

    rs.MoveFirst
    Do Until rs.EOF Or rs.BOF
        bt_id = rs(0)
        Call Check_Freigabe(bt_id)
        rs.MoveNext
    Loop

End Sub

Function getSelect(stmt As String)
    'Debug.Print stmt
    getConnection
    getRecordset
    Set rs = conn.Execute(stmt)
End Function
Public Function Check_Freigabe(id As Long)
Dim stmt, test, NewestDate As String

 stmt = " SELECT MBS.Stahlwerk, MBS.Freigabe, V.BauteilID, MAX(V.Datum) as NewestDate " & _
        " FROM dbo.MapBauteilStahlwerk as MBS INNER JOIN dbo.Verwendungsfreigabe as V ON MBS.BauteilID = V.BauteilID " & _
        " INNER JOIN dbo.Stahlwerkzeugnis AS SZ ON SZ.Stahlwerk = MBS.Stahlwerk AND V.StahlwerkID = SZ.StahlwerkID " & _
        " WHERE MBS.BauteilID = " & id & "  " & _
        " GROUP BY MBS.Stahlwerk, MBS.Freigabe, V.BauteilID "
    'Debug.Print (stmt)
    getSelect (stmt)

    If rs.EOF Or rs.BOF Then
        'MsgBox ("test")

        Exit Function
    Else
        If DateDiff("d", rs!NewestDate, Now) >= 365 And rs!Freigabe = "Frei" Then
            stmt_new = " INSERT into dbo.MapBauteilStahlwerk (BauteilID, Stahlwerk, Freigabe)" & _
                        " SELECT  BauteilID, Stahlwerk, 'Frei (> 12 Monate)'" & _
                        " FROM dbo.MapBauteilStahlwerk WHERE bauteilID = '" & id & "' and Stahlwerk = '" & rs!Stahlwerk & "';"
            'Debug.Print (stmt_new)
            insert (stmt_new)
        End If
    End If
End Function

В каждом цикле я хочу получить следующий bt_id, который я могу использовать для вызова "Check_Freigabe"

1 Ответ

0 голосов
/ 01 февраля 2019
rs.MoveFirst { this makes it so that rs.BOF=True }
    Do Until rs.EOF Or rs.BOF { condition met, loop never runs }

Правильный цикл:

rs.MoveFirst
Do While Not rs.EOF
    [Code]
    rs.MoveNext
  Loop
...