2015-04-19 3 views
0

accès continue à se briser quand je suis en boucle à travers une table et en changeant la valeur de l'un des champs en utilisant le code suivant:accidents d'accès lors de la boucle par une table et l'évolution des valeurs

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 

Aussi, quand je m essayer d'utiliser un autre code SQL, il semble être une requête sans fin:

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 

Répondre

0

Vous rebondissez probablement à 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 
+0

Vous êtes correct, le problème était EOF, mais comme EOF est un pointeur et non la dernière ligne elle-même, la boucle rebondit encore. Ma solution était de compter le nombre de lignes et de quitter la boucle à la dernière rangée. THX – Orensig