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 :

Nombre de records dans une requete


Sujet :

VBA Access

  1. #1
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut Nombre de records dans une requete
    Bonjour,

    Lorsque j'exécute ma requète manuellement, j'obtiens une fenêtre vide : il n'y a pas d'enregistrement correspondant à mes critères.
    Lorsque j'exécute cette même requète avec ce code
    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
    Function Q380()
    Dim cnx As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim strPath As String
     
    strPath = Application.CurrentDb.Name
     
    Set cnx = New ADODB.Connection
    cnx.ConnectionString = strPath
    cnx.Provider = "Microsoft.Ace.OLEDB.12.0"       'MS Access 2007
     
    cnx.Open
    Set rst = New ADODB.Recordset
     
    rst.Open "SELECT * FROM [380_QRY_Exact Match];", cnx, adOpenKeyset
     
     
    Debug.Print "rst.RecordCount = ", rst.RecordCount
    Debug.Print "rst.Fields.Count = ", rst.Fields.Count
     
     
    rst.Close
    cnx.Close
    Set rst = Nothing
    Set cnx = Nothing
    End Function
    , VBA (fenêtre immediate) me dit qu'il y a 600 enregistrements ! POURQUOI ?

    Je suis parvenu à trouver une solution en contournant le problème mais je voudrais comprendre !

    Ma requète est basée sur deux autres requètes avec un JOIN et chacune de ces requètes sont elles-mêmes basées sur d'autres requètes. MS Access n'aime pas trop cette série de requètes les unes sur les autres. Pour résoudre le problème, j'ai changé les deux requètes et au lieu d'avoir de simples requètes SELECT, j'en ai fait des requètes de création de tables. Ensuite, jai modifié ma requète "380_QRY_Exact Match" pour qu'elle s'effectue sur les deux tables plutôt que sur deux requètes complexes.
    Voilà. La solution est simple mais je ne comprends pas pourquoi VBA se trompait. Si vous connaissez la raison, merci de m'expliquer.

  2. #2
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Bonsoir !

    Essaies de parcourir ton RecordSet avant la commande "rst.RecordCount"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    Set rst = New ADODB.Recordset
    
    rst.Open "SELECT * FROM [380_QRY_Exact Match];", cnx, adOpenKeyset
    rst.MoveLast
    rst.MoveFirst
    
    Debug.Print "rst.RecordCount = ", rst.RecordCount
    Debug.Print "rst.Fields.Count = ", rst.Fields.Count
    ...
    et dis-nous si cela solutionne ton problème...

    Amicalement.

  3. #3
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Merci pour la proposition.
    C'est en effet une solution que j'ai aussi déjà utilisée par le passé et cela m'a déjà sorti de l'ornière plus d'une fois. Dans le cas présent, je m'attends à n'avoir aucun résultat (0 ligne) à ma requète. C'est une reqète de vérification lors d'un long processus. Lorsque j'ajoute un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rst.MoveFirst
    rst.MoveLast
    pour parcourir le recordset, j'obtiens ceci
    Pièce jointe 188162
    et cela ne m'étonne pas trop.


    Voici la solution que j'ai finalement utilisée

    Auparavant, j'avais une suite de requètes :
    Query 1 : SELECT .... FROM Table1 Where...
    Query 2 : SELECT .... FROM Query1 Where .....
    Query 3 : SELECT .... FROM Query2 Where ....
    Query 4 : SELECT .... FROM Query3 Where....
    puis venait enfin ma requète [380_QRY_Exact Match] que j'examinais avec VBA.

    Maintenant je fais :
    Query 1 : SELECT .... FROM Table1 Where...
    Query 2 : SELECT .... FROM Query1 Where .....
    Query 3 : SELECT .... INTO Table3 FROM .... (je crée une table locale)
    Query 4 : SELECT .... INTO Table4 FROM .... (je crée une table locale)
    et ma requète finale se fait sur deux tables plutôt que sur des requètes :
    380_QRY_Exact Match : SELECT .... FROM Table3 INNER JOIN Table 3 ..Table4 .....

    Ce n'est pas la solution don't je rêvais mais ça marche.

  4. #4
    Membre Expert Avatar de bernardmichel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2004
    Messages
    1 181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 181
    Par défaut
    Je ne sais pas si tu souhaites poursuivre, vu que tu as une solution.
    Toutefois, d'après le libellé du message, il me semble qu'il faille un test avant le RecordCount.
    Si le nombre réel d'enregistrements n'est pas détecté immédiatement, le RecordCount brut arrive à déterminer s'il y a ou non des enregistrements donc, je te propose de placer un simple petit test avant de parcourir le RecordSet, par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If rst.RecordCount > 0 then
         rst.MoveLast
         rst.MoveFirst
    End if

  5. #5
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 469
    Par défaut
    Oui, cela me semble très bien. Je vais essayer.
    Malgré tout, il est frustrant que MS Access ne donne pas le bon résultat du premier coup.

    Merci.

Discussions similaires

  1. [AC-2007] Nombres d'enregistrement dans une requete
    Par hboisteau dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/10/2010, 20h56
  2. [AC-2007] nombre de decimal dans une requete
    Par titi57 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/07/2009, 13h41
  3. Garder l'ordre des Records dans une requete select distinct
    Par pobrouwers dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 21/02/2007, 22h06
  4. limite du nombre de caractères dans une requete
    Par pheno82 dans le forum Access
    Réponses: 3
    Dernier message: 01/06/2006, 22h12
  5. Réponses: 2
    Dernier message: 07/02/2006, 20h42

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