IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

[vba] Erreur non détectée dans le code, .RecordCount suspect


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut [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 : 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...

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 910
    Points : 4 808
    Points
    4 808
    Par défaut
    Déjà, sans avoir parcouru le tout : dans une requete SQL, mets des cotes ' pour encadrer la valeur d'un chp de type String

    ainsi la dernière rq devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     c1sql = "DELETE  FROM T_passage_annee1 WHERE [n°fourchette] =  " & l & " And [n°arrete] = " & tar.Fields(0) & " And nom_analyse = '" & ria.Fields(3) & "' ;"
    debug.print c1sql

  3. #3
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    Bonjour,

    merci de ta réponse, mais ria.fields(3) renvoie une valeur numérique, correspondant à un nom_analyse.
    en remplaçant ria.fields(3) par ria.fields(1) qui est le bon champ, j'ai toujours le même problème.

    De plus la rq en question delete bien les bons enregistrements. Donc ou c'est le .RecordCount qui bug, ou la définition de criter2 est erronée mais comme c'est la même que c1sql en remplaçant Delete par Select, je penche pour le .RecordCount

  4. #4
    Membre habitué Avatar de ancel17
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Mars 2007
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Mars 2007
    Messages : 312
    Points : 178
    Points
    178
    Par défaut
    J'ai toujours le même souci que je n'ai toujours pas résolu
    Voici le code commenté qui vous aidera certainement à comprendre ce qui se passe :
    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
    84
        tar.MoveFirst       'tar correspond à la table T_arrete
        While Not tar.EOF   'pour chaque enregistrement de la table T_arrete (il n'y a pas de doublon dans la table)
     
            l = 1
            For l = 1 To 10 'initialisation de l à 1 et lancement de la boucle. Je vais de 1 à 10 car l correspondra au n°fourchette qui n'excède pas 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)  'pour chaque n°arrete et n°fourchette je sélectionne les enregistements de la requête R_intervalle_analyse correspondant
     
                If Not IsNull(ria.RecordCount) And ria.RecordCount <> 0 Then 'si ria existe et qu'il n'est pas vide
     
                    ria.MoveFirst
                    While Not ria.EOF   'je parcours chaque enregistrement de ria
     
                        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) 'je sélectionne les enrgistrements de la table T_passage_annee1 correspondant au n°arrete, n°fourchette, et nom_analyse en cours. La table T_passage_annee1 liste les dates des analyses à effectuer
                        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))
                        'max correspond à la valeur max d'analyse à effectuer parmi les enregistrements de ria (n°arrete et n°fourchette en cours)
                        If Not IsNull(tpa1.RecordCount) Then    'si la table T_passage_annee1 existe
    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 'si le nombre d'enregistrement de tpa1 est différent du nombre d'analyses à effectuer (le nombre d'analyse est issu d'un arrêté type, mais il est possible qu'il soit modifié et que le nombre d'analyses change)
                                If tpa1.RecordCount <> 0 Then   'si le nombre d'enregistrement de tpa1 est différent de 0, alors on supprime tous les enregistrements de tpa1 (c1sql est la requête sql qui permet de supprimer les enregistrements correspondant à tpa1)
                                    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(1) & ";"
                                    DoCmd.RunSQL c1sql
                                End If  'si tpa1.recordcount=0, il suffit d'ajouter les enregistrements, donc pas de suppression
                                If ria.Fields(3) <> 0 Then  'si le nombre d'analyse à effectuer est différent de 0
                                    n = 1
                                    For n = 1 To ria.Fields(3)  'initialisation de n à 1 et ajout des enregistrements pour n allant de 1 au nombre d'analyse à effectuer
                                        tpa1.AddNew
                                        tpa1.Fields(0) = ria.Fields(0)  'remplissage champ n°arrete
                                        tpa1.Fields(1) = ria.Fields(1)  'remplissage champ nom_analyse
                                        tpa1.Fields(2) = ria.Fields(2)  'remplissage champ n°fourchette
                                        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) 'je sélectionne les enregistrements de la table T_Tmp_annee1 (recalculée avant cette partie de code) correspondant au n°arrete et au n°fourchette. Cette table nous donne les dates de l'analyse la plus fréquente (basée sur max)
                                        If ria.Fields(3) = max Then 'si le nombre d'analyse est égal à max
                                            snap1.FindFirst "rang_date=" & n    'je cherche l'enregistrement de T_Tmp_annee1 dont le rang de la date est n (le champ rang_date de T_Tmp_annee1 affecte un numéro de 1 à max à chaque date d'analyse)
                                            If Not snap1.NoMatch Then   'si l'enregistrement est trouvé
                                                tpa1.Fields(3) = snap1.Fields(2)    'remplissage champ date_analyse
                                            End If
                                        Else    'si le nombre d'analyse est différent de max
                                            If ria.Fields(3) = 1 Then   'si le nombre d'analyse = 1
                                                snap1.FindFirst "rang_date=" & Int(max / 2) 'je cherche l'enregistrement dont le rang_date = Int(max/2) pour avoir une analyse vers le milieu de l'année
                                                If Not snap1.NoMatch Then   'si l'enregistrement est trouvé
                                                    tpa1.Fields(3) = snap1.Fields(2)    'remplissage champ date_analyse
                                                End If
                                            ElseIf ria.Fields(3) = 2 Then   'si le nombre d'analyse = 2
                                                x = max / 2 'j'affecte max/2 à x
                                                snap1.FindFirst "rang_date=" & Int(max / 3) + Int(x * (n - 1))  'je cherche l'enregistrement correspondant au rang_date (les analyses sont effectuées au 1/3 et au 2/3 de l'année)
                                                If Not snap1.NoMatch Then   'si l'enregistrement est trouvé
                                                    tpa1.Fields(3) = snap1.Fields(2)    'remplissage champ date_analyse
                                                End If
                                            Else    'si le nombre d'analyse est différent de 0, 1, 2
                                                x = max / ria.Fields(3) 'j'affecte max/[nombre d'analyse] à x
                                                snap1.FindFirst "rang_date=" & Int(x * n)   'je cherche l'enregistrement correspondant à rang_date (permet de répartir les analyses uniformément sur l'année)
                                                If Not snap1.NoMatch Then   'si l'enregistrement est trouvé
                                                    tpa1.Fields(3) = snap1.Fields(2)    'remplissage champ date_analyse
                                                End If
                                            End If
                                        End If
                                        tpa1.Update 'mise à jour de la table T_passage_annee1
                                    Next n  'on passe au n suivant (date d'analyse suivante)
    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    'on passe à l'enregistrement de ria suivant (nombre d'analyse suivant)
                    Wend    'fin de la boucle while (ria)
     
                End If
     
            Next l  'on passe au l suivant (n°fourchette suivant)
     
        tar.MoveNext    'on passe à l'enregistrement de tar suivant (n°arrete suivant)
        Wend    'fin de la boucle while (tar)
    Merci !

Discussions similaires

  1. Trouvez une erreur de conception dans un code
    Par ultimate_manx dans le forum C
    Réponses: 11
    Dernier message: 02/05/2007, 22h37
  2. [VBA] Fonction non définie dans l'expression
    Par DREADY dans le forum VBA Access
    Réponses: 17
    Dernier message: 08/03/2007, 16h49
  3. [VBA-E] propriété BackColor dans le code
    Par NicolasMO dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/02/2007, 21h53
  4. [VBA-E] Excel Pb dans mon code
    Par flagfight dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/05/2006, 12h08
  5. [ACCESS 2003] arrêt non désiré dans le code
    Par Golzinne dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/02/2006, 23h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo