Search code examples
ms-accesscrashrecordsetcalculated-columnsms-jet-ace

Access crashes when looping through a table and changing values


Access keeps crashing when I'm looping through a table and changing the value of one of the fields using the following code:

Set db = CurrentDb
Set rs = db.OpenRecordset(prProdTblName)
'PrevDept , PrevOpNo, PrevPartNo
rs.MoveFirst
rs.Edit
rs![Op No] = 10
rs.Update
Do Until rs.EOF
    With rs
        PrevOpNo = ![Op No]
        PrevDept = ![Department Code]
        PrevPartNo = ![Part No]
        .MoveNext
        .Edit
        If (![Department Code] = "SMD" And PrevDept <> "SMD") Then
            ![Op No] = 500
        ElseIf (![Department Code] <> "SMD" And PrevDept = "SMD" And ![Part No] = PrevPartNo) Then
            ![Op No] = 1000
        ElseIf (rs![Part No] <> PrevPartNo) Then
            ![Op No] = 10
        Else
            ![Op No] = PrevOpNo + 10
        End If
        .Update
    End With
Loop
rs.Close
Set rs = Nothing

Also, when I'm trying to use an alternative SQL code, it seems to be an endless query:

SQLcommandStr = "SELECT T1.[ID], (Select IIF((T1.[Department Code]='SMD') AND (T2.[Department Code]<>'SMD'),500,IIF((T1.[Department Code]<>'SMD') AND (T2.[Department Code]='SMD') AND (T1.[Part No] = T2.[Part No]),1000,IIF((T1.[Part No] <> T2.[Part No] OR (T1.[ID] = (SELECT MIN(T4.[ID]) FROM " & prProdTblName & " T4))),10,T2.[Op No] + 10))) From " & prProdTblName & " T2 WHERE T2.[ID] = (SELECT MAX(T3.[ID]) FROM " & prProdTblName & " T3 WHERE T1.[ID] > T3.[ID])) INTO TblTemp FROM " & prProdTblName & " T1"

DoCmd.RunSQL SQLcommandStr

Solution

  • You probably bounce at EOF:

    Set db = CurrentDb
    Set rs = db.OpenRecordset(prProdTblName)
    rs.MoveFirst
    rs.Edit
    rs![Op No] = 10
    rs.Update
    Do Until rs.EOF
        With rs
            PrevOpNo = ![Op No]
            PrevDept = ![Department Code]
            PrevPartNo = ![Part No]
            .MoveNext
            If .EOF = False Then
                .Edit
                If (![Department Code] = "SMD" And PrevDept <> "SMD") Then
                    ![Op No] = 500
                ElseIf (![Department Code] <> "SMD" And PrevDept = "SMD" And ![Part No] = PrevPartNo) Then
                    ![Op No] = 1000
                ElseIf (rs![Part No] <> PrevPartNo) Then
                    ![Op No] = 10
                Else
                    ![Op No] = PrevOpNo + 10
                End If
                .Update
            End If
        End With
    Loop
    rs.Close
    Set rs = Nothing