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

Access Discussion :

[VBA] Recordset : trop d'éléments obtenus par Recordcount


Sujet :

Access

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut [VBA] Recordset : trop d'éléments obtenus par Recordcount
    Bonjour,

    Je travaille sous Access 2003 et j'utilise fréquemment les recordset pour récupérer des éléments dans mes tables, avec ce genre de demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        Dim query2 As String
        Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.field
        Set db = CurrentDb
     
        query2 = "SELECT motifs.motif_description" _
                & " FROM motifs" _
                & " WHERE motifs.motif = " & Chr(34) & Pattern & Chr(34) _
                & " AND motifs.fitness = " & fitness _
                & " AND motifs.tools_number_tool = " & tool & ";"
        Set rst = db.OpenRecordset(query2, dbOpenDynaset)
     
        If rst.RecordCount = 0 Then
    ........
    en bref : je demande s'il existe l'enregistrement avec les valeurs que j'indique (variables pattern, fitness et tool).

    Ailleurs dans mon code, ce système fonctionne très bien : soit j'ai un Recordcount = 1 (l'enregistrement existe et je peux l'utiliser) soit Recordcount = 0 (non présent dans ma table).

    Voici mon problème : ici, au lieu de me donner Recordcount = 1, il met = 48.
    J'ai vérifié la requête en mode création de requête : elle renvoie un seul enregistrement.
    J'ai aussi tester pourquoi 48 : il s'avère que celà correspond au critère " AND motifs.tools_number_tool = " & tool & " uniquement (il y a beaucoup plus de 48 enregistrements dans cette table).

    Quelqu'un a une idée de l'origine de cette incohérence ?

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Que vaut query2 ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    query2 est la requete que je fabrique (voir mon code). Elle peut donner (par exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    "SELECT motifs.motif_description FROM motifs
    WHERE motifs.motif = "E-x(0,2)-E-x(7)-[EIKLV]"
    AND motifs.fitness = 9.2507
    AND motifs.tools_number_tool = 4;"

  4. #4
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    La propriété RecordCount s'utilise systématiquement après un MoveLast.
    De fait, si aucun enregistrement n'est trouvé, une erreur est levée...
    Donc il vaut mieux procéder ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With rst
      If Not .EOF Then
        .MoveLast
        lngNB = .RecordCount
      End If
    End With
    En revanche, le coup du 48, là, je vois pas...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  5. #5
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    C'est bien la valeur données par VBA ou bien un exemple que tu as créé. Parce que si c'est ce que vaut query2 dans VBA et que ça te retourne 48, c'est que tu à 48 enregistrements qui correspondent à ces critères

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En fait, je n'ai jamais eu besoin d'un movelast (et je ne l'explique pas) mais partout où j'utilise les recordset dans mon code, il me trouve la bonne valeurs. Et généralement, je l'utilise pour savoir si l'enregistrement existe ou non (donc juste une ligne ou rien).

  7. #7
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Bien à ce moment là, créée une fonction générique publique dédiée qui s'en charge et que tu utilises chaque fois que tu as besoin de compter...

    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Tofalu
    C'est bien la valeur données par VBA ou bien un exemple que tu as créé. Parce que si c'est ce que vaut query2 dans VBA et que ça te retourne 48, c'est que tu à 48 enregistrements qui correspondent à ces critères
    Quand je lance cette requête en mode "création" d'access, il me trouve bien le seul enregistrement correspondant à tous les critères imposés (et je parle bien de la même requête). En revanche, les 48 enregistrements correspondent au dernier critère uniquement (tool = 4) mais pas à la totalité de la table (j'ai d'autres enregistrements).

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    De plus, si ta réponse attendu est binaire (existe ou n'existe pas),
    le test de RST.EOF suffit et pas besoin de passer par recordcount

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Dans ce cas oui, le simple test binaire suffit. Mais comme ici, le Recordcount m'indique 48 enregistrements, je ne suis donc pas sure de récupérer ma bonne "motif_description" avec les critères que j'indique. Il y a donc un problème quelque part.
    Si j'utilise le test binaire maintenant, il va forcément me trouver un enregistrement vu qu'il considère qu'il y en a plus que prévu, mais pas forcément celui que je cherche (mauvaise "motif_description").
    En fait, je ne comprends pas pourquoi le recordset me trouve autant d'enregistrements alors que la requête seule n'en trouve qu'un.

  12. #12
    Rédacteur/Modérateur
    Avatar de argyronet
    Homme Profil pro
    Panseur de bobos en solutions ETL
    Inscrit en
    Mai 2004
    Messages
    5 123
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Panseur de bobos en solutions ETL
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 5 123
    Points : 12 172
    Points
    12 172
    Billets dans le blog
    5
    Par défaut
    Ne te cantonne pas à essayer d'appliquer cette méthode qui marchait jusqu'alors...

    Créée une fonction correcte de comptage et ton problème est résolu.
    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
    Public Function CountRecords(ByVal SQLDynaset As String) As Long
    Dim oRS As DAO.Recordset
      
      On Error GoTo L_ErrNoData
      Set oRS = CurrentDb.OpenRecordset(SQLDynaset, 2)
      With oRS
        .MoveLast
         CountRecords = .RecordCount
        .Close
      End With
      Set oRS = Nothing
      
    L_ExNoData:
      Exit Function
    L_ErrNoData:
      CountRecords = 0
      Resume L_ExNoData
    End Function
    Argy
    Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

    Ils comptent sur vous...
    Web Site@Mail
    Tutoriels : Déployez vos applications Access 2010 à 2019 */* Réalisez un Assistant de présaisie...
    MDB Viewer : Visionneuse Access v4.0
    *** Je recherche des profils (2 ans min.) Java EE, Fullstack, Front, .Net, Mobile... pour CDI ***

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    j'essaie de suite et reviens ensuite vous dire si ça fonctionne.

  14. #14
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 183
    Points : 1 362
    Points
    1 362
    Par défaut
    Et l'utilisation d'un debug.print query2, afin de vérifier ce que vaut réellement query2 et combien elle ramène effectivement d'enregistrements ne peut pas faire de mal.
    [Access] Les bases du débogage => ici

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Kloun
    Et l'utilisation d'un debug.print query2, afin de vérifier ce que vaut réellement query2 et combien elle ramène effectivement d'enregistrements ne peut pas faire de mal.
    Je vois ce que vaut query2 dans la fenêtre des variables lors du pas en pas en débuggage. Et cette requête copier coller en mode création ne donne qu'un seul enregistrement. Je vais essayer debug.print query2 pour voir ce que ça donne.

    sinon, j'ai testé la fonction de comptage de argyronet : résultat = "1" avec la même requête.

    J'explique toujours pas les "48" mais même si j'aimerais bien comprendre, je crois que je vais devoir passer outre....

    Merci à Tous !!

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    En fait, j'avais tort pour le MoveLast.....

    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
        Dim query2 As String
        Dim db As DAO.Database, rst As DAO.Recordset, fld As DAO.field
        ' open the database
        Set db = CurrentDb
        query2 = "SELECT motifs.motif_description" _
                & " FROM motifs" _
                & " WHERE motifs.motif = " & Chr(34) & Pattern & Chr(34) _
                & " AND motifs.fitness = " & fitness _
                & " AND motifs.tools_number_tool = " & tool & ";"
        Debug.Print query2
        Set rst = db.OpenRecordset(query2, dbOpenDynaset)
        
        rst.MoveLast
    
        If rst.RecordCount = 0 Then
    Et bien avec cette ligne en plus, j'obtiens bien recordcount=1 !!!!
    Et avec le bon enregistrement ! (pas comme je le craignais, le dernier des 48)
    Sans devoir rajouter de fonction et sans trop modifier mon code.
    De plus, avec le fonction de comptage, je ne voyais plus comment récupérer mon champ "motif_description" en gardant quand même la fonction générique. Et c'est là que j'ai vu que la seule différence dans le fonctionnement, c'est le MoveLast.

    Encore merci à tous !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/05/2007, 10h41
  2. Réponses: 6
    Dernier message: 22/12/2005, 11h32
  3. VBA, graphiques : Acceder au Range pointé par une série
    Par CCHEVALIER dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/09/2005, 10h56
  4. Réponses: 11
    Dernier message: 15/04/2005, 15h42
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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