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 : 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
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 :
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 :
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 : 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
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...