【问题标题】:rs.movenext does not work - run time error 3021rs.movenext 不起作用 - 运行时错误 3021
【发布时间】:2019-02-01 13:20:40
【问题描述】:

我尝试爬取我的表“dbo.Bauteilspezifikation”的所有条目,并使用标识符在 Do-Loop 中调用另一个函数。

大家好, 我使用 Access 2010 从 SQL Server 2012 获取数据。在这里,我尝试检查表的所有条目并修改它们,如果某个日期已过期。 这个想法是使用标识符“BauteilID”作为函数“Check_Freigabe”的变量。 但是在第一个循环之后,记录集似乎丢失了。这可能是因为在“Check_Freigabe”函数中创建了一个新记录集。

我尝试创建另一个记录集(除了 rs 中的 rs2),但随后出现错误,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”

【问题讨论】:

  • 好吧,调整你的秘密 Check_Freigabe 以不操纵或破坏你的 rs 记录集。
  • 你能发布Check_Freigabe(bt_id) 的代码吗?看起来你正在使用在更新函数之外声明的记录集变量,所以你需要声明第二个不同名称的变量,有时,只是基本的像 rstEmployeesrstDepratments 这样的命名可以帮助解决这样的问题。如果需要,您可以将 rs 克隆到 rs2,但不确定提到的功能是做什么的。
  • 添加功能 Check_Freigabe

标签: vba loops ms-access recordset


【解决方案1】:
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

【讨论】:

  • 这并不能完全解决问题。在子“Update_Freigabe”中包含我的“check_Freigabe”函数并创建了第二个记录集变量(rs2)。为此,我刚刚克隆了“getselect”函数。现在我得到错误运行时错误3704(关闭对象时不允许操作)。
  • 在循环中你只需要Call Check_Freigabe(rs!BauteilID) 假设其他一切都是正确的。
  • 您的Check_Freigabe 函数中似乎还缺少rs.MoveFirst。除此之外,我使用 DAO,所以我打开和关闭记录集的方式与您不同。我不知道那部分是否正确。
  • 问题已解决:我忽略了我原来的 rs 在 myrs2-Function 中被覆盖了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多