[vba] Erreur non détectée dans le code, .RecordCount suspect
Bonjour,
J'ai un souci que je ne comprend pas et, par conséquent, que je n'arrive pas à résoudre, avec le code suivant :
>> edit : consultez plutot le code du message N°4 qui est commenté <<
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| tar.MoveFirst
While Not tar.EOF
l = 1
For l = 1 To 10
Dim criter1 As String
criter1 = "SELECT * FROM R_intervalle_analyse " & "WHERE R_intervalle_analyse.n°fourchette = " & l & " And R_intervalle_analyse.n°arrete = " & tar.Fields(0) & ";"
Set ria = CurrentDb.OpenRecordset(criter1)
If Not IsNull(ria.RecordCount) And ria.RecordCount <> 0 Then
ria.MoveFirst
While Not ria.EOF
Dim criter2 As String
Dim criter3 As String
criter2 = "SELECT * FROM T_passage_annee1 " & "WHERE T_passage_annee1.n°fourchette=" & l & " And T_passage_annee1.n°arrete=" & tar.Fields(0) & " And T_passage_annee1.nom_analyse=" & ria.Fields(1) & ";"
criter3 = "SELECT * FROM T_passage_routine " & "WHERE T_passage_routine.n°fourchette = " & l & " And T_passage_routine.n°arrete = " & tar.Fields(0) & " And T_passage_routine.nom_analyse = " & ria.Fields(1) & ";"
Set tpa1 = CurrentDb.OpenRecordset(criter2)
Set tpar = CurrentDb.OpenRecordset(criter3)
Debug.Print "Point 0 -> " & criter2
'rempli la table T_passage_annee1
max = DMax("R_intervalle_analyse.[nb_analyse_annee1]", "R_intervalle_analyse", "R_intervalle_analyse.[n°fourchette]=" & l & " And R_intervalle_analyse.[n°arrete] = " & tar.Fields(0))
If Not IsNull(tpa1.RecordCount) Then
Debug.Print "Point 1 -> " & "n°arrete : " & tar.Fields(0) & ", l = " & l & " nom_analyse : " & ria.Fields(1) & ", Nb enr tpa1 : " & tpa1.RecordCount & ", nb_analyse : " & ria.Fields(3)
If tpa1.RecordCount <> ria.Fields(3) Then
If tpa1.RecordCount <> 0 Then
c1sql = "DELETE T_passage_annee1.* FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette = " & l & " And T_passage_annee1.n°arrete = " & tar.Fields(0) & " And T_passage_annee1.nom_analyse = " & ria.Fields(3) & ";"
DoCmd.RunSQL c1sql
End If
If ria.Fields(3) <> 0 Then
n = 1
For n = 1 To ria.Fields(3)
tpa1.AddNew
tpa1.Fields(0) = ria.Fields(0)
tpa1.Fields(1) = ria.Fields(1)
tpa1.Fields(2) = ria.Fields(2)
Dim critmp1 As String
Dim snap1 As Recordset
critmp1 = "SELECT * FROM T_Tmp_annee1 " & "WHERE T_Tmp_annee1.n°fourchette = " & l & " And T_Tmp_annee1.n°arrete = " & tar.Fields(0) & ";"
Set snap1 = CurrentDb.OpenRecordset(critmp1, dbOpenSnapshot)
If ria.Fields(3) = max Then
snap1.FindFirst "rang_date=" & n
If Not snap1.NoMatch Then
tpa1.Fields(3) = snap1.Fields(2)
End If
Else
If ria.Fields(3) = 1 Then
snap1.FindFirst "rang_date=" & Int(max / 2)
If Not snap1.NoMatch Then
tpa1.Fields(3) = snap1.Fields(2)
End If
ElseIf ria.Fields(3) = 2 Then
x = max / 2
snap1.FindFirst "rang_date=" & Int(max / 3) + Int(x * (n - 1))
If Not snap1.NoMatch Then
tpa1.Fields(3) = snap1.Fields(2)
End If
Else
x = max / ria.Fields(3)
snap1.FindFirst "rang_date=" & Int(x * n)
If Not snap1.NoMatch Then
tpa1.Fields(3) = snap1.Fields(2)
End If
End If
End If
tpa1.Update
Next n
Debug.Print "Point 2 -> " & "n°arrete : " & tar.Fields(0) & ", l = " & l & " nom_analyse : " & ria.Fields(1) & ", Nb enr tpa1 : " & tpa1.RecordCount & ", nb_analyse : " & ria.Fields(3)
End If
End If
End If
ria.MoveNext
Wend
End If
Next l
tar.MoveNext
Wend |
Lorsque ma table T_passage_annee1 est vide, tout se passe bien, et ma table est correctement remplie.
Par contre si ma table est remplie et que j'exécute le code, le tpa1.RecordCount n'est plus correct.
Voici un échantillon des résultats des Debug.Print utilisés :
Résultat lorsque ma table T_passage_annee1 est vide :
Citation:
Point 0 -> SELECT * FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette=1 And T_passage_annee1.n°arrete=2170 And T_passage_annee1.nom_analyse=1;
Point 1 -> n°arrete : 2170, l = 1 nom_analyse : 1, Nb enr tpa1 : 0, nb_analyse : 4
Point 2 -> n°arrete : 2170, l = 1 nom_analyse : 1, Nb enr tpa1 : 4, nb_analyse : 4
Point 0 -> SELECT * FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette=1 And T_passage_annee1.n°arrete=2170 And T_passage_annee1.nom_analyse=2;
Point 1 -> n°arrete : 2170, l = 1 nom_analyse : 2, Nb enr tpa1 : 0, nb_analyse : 0
Point 0 -> SELECT * FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette=1 And T_passage_annee1.n°arrete=2170 And T_passage_annee1.nom_analyse=3;
Point 1 -> n°arrete : 2170, l = 1 nom_analyse : 3, Nb enr tpa1 : 0, nb_analyse : 2
Point 2 -> n°arrete : 2170, l = 1 nom_analyse : 3, Nb enr tpa1 : 2, nb_analyse : 2
Point 0 -> SELECT * FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette=1 And T_passage_annee1.n°arrete=2170 And T_passage_annee1.nom_analyse=4;
Point 1 -> n°arrete : 2170, l = 1 nom_analyse : 4, Nb enr tpa1 : 0, nb_analyse : 1
Point 2 -> n°arrete : 2170, l = 1 nom_analyse : 4, Nb enr tpa1 : 1, nb_analyse : 1
Résultat lorsque ma table T_passage_annee1 est déjà remplie et qu'aucune modification n'a été faite :
Citation:
Point 0 -> SELECT * FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette=1 And T_passage_annee1.n°arrete=2170 And T_passage_annee1.nom_analyse=1;
Point 1 -> n°arrete : 2170, l = 1 nom_analyse : 1, Nb enr tpa1 : 7, nb_analyse : 4
D'autre part, tpa1.RecordCount étant faux, on entre dans la boucle
Code:
1 2 3 4
| If tpa1.RecordCount <> 0 Then
c1sql = "DELETE T_passage_annee1.* FROM T_passage_annee1 WHERE T_passage_annee1.n°fourchette = " & l & " And T_passage_annee1.n°arrete = " & tar.Fields(0) & " And T_passage_annee1.nom_analyse = " & ria.Fields(3) & ";"
DoCmd.RunSQL c1sql
End If |
mais une fois les enregistrements effacés, un message box apparaît, et l'exécution du code n'est pas repris.
Les experts ont maintenant la parole...