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

Requêtes et SQL. Discussion :

DCount sur requête de deux tables


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 72
    Points : 45
    Points
    45
    Par défaut DCount sur requête de deux tables
    Bonjour tout le monde,

    Je pense que mon code parlera plus que toutes mes explications. J'ai suivi le tuto de caféine sur la recherche multicritère qui fonctionne plutôt pas mal jusqu'à présent. J'en suis maintenant arrivé à une recherche sur deux tables liés par une jointure. Le soucis c'est que mon DCount ne fonctionne plus pour faire les statistiques sur les résultats trouvés :s

    Voici mon 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
    27
    28
    29
    30
    31
    Private Sub RefreshQuery()
     Dim SQL As String
     Dim SQLWhere As String
     
     'On affiche la totalité des résultats
     SQL = "SELECT [Projet].[N° Projet], [Chef de Projet].[Nom], [Projet].[Désignation Projet] FROM [Chef de Projet] Inner Join [Projet] ON [Projet].[Référence Chef de Projet] = [Chef de Projet].[Référence Chef de Projet] Where [Projet].[N° projet] <> '0' "
     
     'Si le champ de recherche du nom/mail est vide, on fait rien, sinon on rajoute une recherche sur ce nom/mail dans la requete
     If Nz(Me.rechParNum, "") = "" Then
     Else
        SQL = SQL & "And [Projet].[N° Projet] = '" & Me.rechParNum & "' "
     End If
     If Nz(Me.rechParChef, "") = "" Then
     Else
        SQL = SQL & "And [Chef de Projet].[Nom] like '*" & Me.rechParChef & "*' "
        MsgBox (SQL)
     End If
     If Nz(Me.rechParDes, "") = "" Then
     Else
        SQL = SQL & "And [Projet].[Désignation Projet] like '*" & Me.rechParDes & "*' "
     End If
     
        'On découpe la requête pour affiche le nombre de résultats (stats)
     SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     SQL = SQL & ";"
     
    'Affichage des stats et des resultats
     'Me.nbRes.Caption = DCount("*", "[Projet]", SQLWhere) & " / " & DCount("*", "[Projet]")
     
     Me.lstResults.RowSource = SQL
     Me.lstResults.Requery
    Comem vous pouvez le voir, je l'ai mis en commentaire pour l'instant et tout fonctionne (sauf le DCount évidemment ^^).

    Si quelqu'un a une idée de comment le faire fonctionner, je suis preneur.

    Merci bien !

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 645
    Points : 34 350
    Points
    34 350
    Par défaut
    salut,

    un bon moyen de savoir ce qui cloche serait d'afficher dans un premier temps le contenu de ton SQLWhere :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
    Debug.Print SQLWhere
    ca donne une bonne idée de la clause appliquée.

    Autre point à voir, ton champ [Projet].[N° projet] est-il de type texte ou bien numérique ?

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Tu peux compter avec DAO.
    Tu colles cette fonction dans ton module de 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
    Function NbRecords(sSQL As String) As Long
    Dim db As DAO.Database, rs As DAO.Recordset
     
    On Error GoTo ErrH
     
    Set db = CurrentDb
    Set rs = db.OpenRecordset(sSQL, dbOpenSnapshot)
    If Not rs.EOF Then rs.MoveLast
    NbRecords = rs.RecordCount
    rs.Close
    Exit Function
     
    ErrH:
    NbRecords = -1
    End Function
    Ensuite tu modifies ton 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
    Private Sub RefreshQuery()
     Dim SQL As String
     Dim SQLAll As String
     
     'On affiche la totalité des résultats
     SQL = "SELECT [Projet].[N° Projet], [Chef de Projet].[Nom], [Projet].[Désignation Projet] FROM [Chef de Projet] Inner Join [Projet] ON [Projet].[Référence Chef de Projet] = [Chef de Projet].[Référence Chef de Projet] Where [Projet].[N° projet] <> '0' "
     SQLAll = SQL
     
    ' ... tous les if pour ajouter des critères ...
     
     SQL = SQL & ";"
     
    'Affichage des stats et des resultats
     Me.nbRes.Caption = NbRecords(SQL) & " / " & NbRecords(SQLAll)
     
     Me.lstResults.RowSource = SQL
     Me.lstResults.Requery
    End Sub
    A+

  4. #4
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour, et encore une petite couche

    D'abord, j'aimerais bien voir aussi le Debug.Print demandé par Jean-Philippe.
    Sinon, tu peux peut être simplifier.

    Est-ce que tu pourrais inverser en
    1- créant une clause WHERE directement dans le string SqlWhere
    Exemple copié, à vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SqlWhere = "[Projet].[N° projet] <> '0'"
    'Si le champ de recherche du nom/mail est vide, on fait rien, sinon on rajoute une recherche sur ce nom/mail dans la requete  
    If Nz(Me.rechParNum, "") > "" Then  
         SQLWHere = SQLWhere & "And [Projet].[N° Projet] = '" & Me.rechParNum & "' "  
    End If  
    If Nz(Me.rechParChef, "") > "" Then
        SQLWhere = SQLWhere & "And [Chef de Projet].[Nom] like '*" & Me.rechParChef & "*' "     
         MsgBox (SQLWhere)  
    End If  
    If Nz(Me.rechParDes, "") > "" Then  
        SQLWhere = SQLWhere & "And [Projet].[Désignation Projet] like '*" & Me.rechParDes & "*' "
    End If
    Debug.Print SQLWhere 'Merci jp :o)
    Ici tu peux déjà tester le Dcount et corriger SqlWhere si nécessaire...

    2- tu crées l'autre (SQL) à partir de là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SQL = "SELECT [Projet].[N° Projet], [Chef de Projet].[Nom], [Projet].[Désignation Projet] FROM [Chef de Projet] Inner Join [Projet] ON [Projet].[Référence Chef de Projet] = [Chef de Projet].[Référence Chef de Projet] Where " & SqlWhere & ";"
    [...]

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Salut,
    Pour moi le problème vient surtout du fait qu'on fait un DCount sur une table, avec potentiellement un critère sur une autre table.
    Même avec des restrictions correctes d'un point de vue syntaxe, DCount plante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DCount("*", "Table1", "Table2.Champ2 = 'x'")
    C'est sûr que s'il y a une erreur dans la syntaxe de la clause WHERE, ça aide pas

    A+

  6. #6
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Merci pour toutes ces réponses. Alors non j'avais déjà effectué tous ces tests pour m'assurer que la requête était correcte. Le fait est que DCount ne propose pas de compter sur une jointure de deux tables. J'ai donc outrepasser le pb avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If Me.lstResults.ListCount = 0 Then
        nbResult = 0
    Else
        nbResult = Me.lstResults.ListCount - 1
    End If
    Je suis obligé de faire ces tests car ListCount m'affiche "2" pour un resultat, "3" pour deux resultats etc, mais par contre pour 0 résultat il me met bien 0. Ceci fait que je dois faire un -1 si il y a un resultat, et afficher 0 s'il n'y en a pas. C'est pas super jolie au niveau implémentation mais je vois pas d'autres solutions.

    Merci beaucoup

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/06/2009, 23h39
  2. Requête avec deux tables m:m
    Par Seb981 dans le forum Langage SQL
    Réponses: 23
    Dernier message: 10/09/2007, 14h15
  3. Réponses: 2
    Dernier message: 31/05/2007, 15h58
  4. résultats requête avec deux tables
    Par ideal23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/03/2007, 10h10
  5. Quelle requête liera deux tables en analysant leur contenu ?
    Par Monbasinstinct dans le forum Access
    Réponses: 14
    Dernier message: 13/04/2006, 18h03

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