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é <<
Lorsque ma table T_passage_annee1 est vide, tout se passe bien, et ma table est correctement remplie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 :
Résultat lorsque ma table T_passage_annee1 est déjà remplie et qu'aucune modification n'a été faite :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
D'autre part, tpa1.RecordCount étant faux, on entre dans la bouclePoint 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
mais une fois les enregistrements effacés, un message box apparaît, et l'exécution du code n'est pas repris.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Les experts ont maintenant la parole...
Partager