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 :

Requêtes avec 2 résultats non concordants [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut Requêtes avec 2 résultats non concordants
    Bonjour

    Je cherche à compter le nombre d'enregistrements selon différents critères (notamment le genre et la date de naissance) :
    - j'ai d'abord compté en créant une requête Sélection dans laquelle j'ai un premier champ Genre (avec comme critères "Masculin") et un second champ Datenaissance avec comme critères <#01/09/2002# Et >#01/09/1997#
    cette requête me sélectionne 7 enregistrements : j'en déduis donc qu'il y a 7 personnes masculines dont leur date de naissance est comprise entre les 2 dates indiquées

    - pour éviter d'avoir à créer autant de requêtes que de critères que je souhaite, j'ai voulu tester une 2ème méthode à l'aide d'une requête Création de Table dont le champ est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbM1217Masc: CpteDom("[Datenaissance]";"T_adherentformulaire";"[Datenaissance]<#01/09/2002#" & "And [Datenaissance]>#01/09/1997#" & "And [Genre]='Masculin'")
    pour moi, le champ NbM1217Masc dénombre les enregistrements de T_adherentformulaire dont le genre est masculin et la date de naissance comprise entre les 2 dates indiquées
    Dans cette requête, le champ NbM1217Masc vaut 11 !!

    J'ai l'impression que les 2 méthodes sont identiques malheureusement elles ne donnent pas le même résultat : il y en a donc forcément une de fausse.

    Avez-vous une idée de l'erreur que j'ai pu commettre pour l'une ou l'autre des solutions ?

    Merci d'avance
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  2. #2
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Bonsoir,

    J'ai bien lu ton énoncé et je viens te proposer une 3ème solution qui pourra t'éviter ce que tu crains: "avoir à créer autant de requêtes que de critères que je souhaite"

    Tu réalises une petite fonction, placée dans un module, qui va te donner ce que tu cherches, sur la base de 3 variables: Debut, Fin, Genre

    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
    Public Function Essai(Debut As Date, Fin As Date, Genre As String) As Integer
    Dim rst         As DAO.Recordset
    Dim sql         As String
    Dim lngDebut    As Long     ' Une date est stockée dans le format Long et c'est pour en
    Dim lngFin      As Long     ' faciliter la lecture que différents formats sont proposés
                                ' Donc avec ces deux variables, retour au point de départ et
                                ' beaucoup plus pratique et fiable à l'utilisation.
        lngDebut = Debut
        lngFin = Fin
        sql = "SELECT * FROM tblParticipants " & _
              "WHERE DdN Between " & lngDebut & " And " & lngFin & " AND Titre='" & Genre & "'"
     
        Set rst = CurrentDb.OpenRecordset(sql)
        rst.MoveLast            ' Il faut parcourir toute la table pour pouvoir compter
        Essai = rst.RecordCount ' Attribution de ce résultat au retour que doit faire la fonction "Essai"
     
        ' Libération des objets
        rst.Close
        Set rst = Nothing
     
    End Function
    Et, pour - par exemple - un formulaire dans lequel tu as 4 champs et un bouton:
    1. Champ nommé "dtDebut"
    2. Champ nommé "dtFin"
    3. Champ nommé "Genre" (Possibilité d'utiliser une liste déroulante avec les valeurs "Masculin" & "Féminin" ou autre selon...)
    4. Champ nommé "Total"
    5. Un bouton nommé "btnTest"


    Tu pourras utiliser cette fonction de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub btnTest_Click()
        Me.Total = Essai(Me.dtDebut, Me.dtFin, Me.cboGenre)
    End Sub


    Voilà... bonne soirée :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  3. #3
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut
    Bonjour

    Merci pour ton aide.
    J'ai quelques questions/interrogations sur ta méhode :
    - les dates indiquées dans ma table sont au format date : le fait d'avoir des formats Long dans la fonction n'est pas dérangeant ?
    - une fois mes champs à remplir selon les critères que je souhaite (dans ce que tu proposes dtDebut, dtFin et Genre) et le bouton qui exécute la fonction, comment je fais pour faire apparaître le résultat dans le champ Total ?
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  4. #4
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Bonjour,

    Mes réponses dans ta citation:

    Citation Envoyé par nlbmoi Voir le message
    Bonjour

    Merci pour ton aide.
    J'ai quelques questions/interrogations sur ta méhode :
    - les dates indiquées dans ma table sont au format date : le fait d'avoir des formats Long dans la fonction n'est pas dérangeant ?
    .
    => - Non, au contraire ! la conversion se fait naturellement puisqu'à la base une date EST un Numérique Long
    .
    - une fois mes champs à remplir selon les critères que je souhaite (dans ce que tu proposes dtDebut, dtFin et Genre) et le bouton qui exécute la fonction, comment je fais pour faire apparaître le résultat dans le champ Total ?

    => La réponse est déjà dans le code: Me.Total = Essai(Me.dtDebut, Me.dtFin, Me.cboGenre)
    En fait, le total se trouve être le résultat de la fonction donc, tu peux l'utiliser partout. Il te suffit de renseigner les 3 arguments demandés par la fonction (Début, Fin, Genre)... et le tour est joué.

    Tu trouveras en annexe un exemple. Pièce jointe 182228

    Cordialement.
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  5. #5
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut
    Merci pour l'exemple.

    Lorsque je clique sur le bouton, j'ai un message d'erreur "Erreur d'éxécution '3061' : trop peu de paramètres. 2 attendu" et il me surligne la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rst = CurrentDb.OpenRecordset(sql)
    Je suppose qu'il ne prend pas en compte 2 de mes zones de texte : j'ai pourtant vérifié à l'aide du fichier exemple si j'avais tout pris : les propriétés de mes objets correspondent pourtant bien aux propriétés de l'exemple.

    A l'aide du debug.print, j'ai les valeurs des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ?Debut
    01/01/1900 
    ?Fin
    01/01/2000 
    ?sql
    SELECT * FROM T_adherentformulaire WHERE DdN Between 2 And 36526 AND Titre='Masculin'
    ?lngDebut
     2 
    ?lngFin
     36526
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  6. #6
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Pour comprendre, il faudrait que tu m'envoies ton code en entier... :-)

    A priori, je pense qu'il s'agit d'un problème de format.
    En France vous écrivez les dates de la façon suivante: 31/12/2014
    En Suisse, le format est le suivant: 31.12.2014
    Si je te dis cela c'est parce-que je suis un peu étonné par le résultat de ton Debug.Print:
    01/01/1900
    01/01/2000
    Est-ce ces dates que tu as entrées ou un résultat ?
    A+
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  7. #7
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut
    Pour le code, j'ai repris celui que tu m'avais transmis en modifiant le nom de ma table (T_adherentformulaire)

    Les valeurs du debug.print correspondent aux valeurs rentrées pour le début (01/01/1900 dans cet ordre) et pour la fin (01/01/2000)
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  8. #8
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Je ne doute pas que ce que tu as fait soit correct. Envoies-moi tout de même tout le code où tu as une erreur.
    Merci :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  9. #9
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut
    Voici le lien pour récupérer la base : http://www.cjoint.com/c/EGesUQ1dybN
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  10. #10
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Hello !

    Alors, il s'agissait des noms des champs de ta table qui - évidemment - ne sont pas les mêmes que ceux que je t'avais proposé.

    Les deux éléments qu'Access te demandaient étaient:
    • Remplacer "DdN" par "Datenaissance"
    • Remplacer "Titre" par "Genre"


    Voici donc la ligne qu'il te faut changer pour que cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sql = "SELECT * FROM T_adherent " & _
              "WHERE Datenaissance Between " & lngDebut & " And " & lngFin & " AND Genre='" & Genre & "'"
    Cordialement et bon dimanche :-)
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

  11. #11
    Membre éprouvé

    Homme Profil pro
    Technicien
    Inscrit en
    Août 2013
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2013
    Messages : 437
    Points : 1 190
    Points
    1 190
    Par défaut
    Mais quel c** !!
    Merci beaucoup, c'est souvent ce genre de petites erreurs qui sont le plus pénible !!
    Et, par rapport à la question initiale, le résultat issu de ta proposition coincide avec les résultats que j'avais obtenus à l'aide de la requête de Sélection de table.
    [Nouveau] Envie de tracer des circuits électriques : essayez le package LaTeX CircuiTikZ

    Pour créer une belle table des matières sur LibreOffice - N'oubliez pas de consulter les FAQ en cas de question !

    Envie de se lancer dans l'aventure Arduino : allez faire un tour sur ce cours.


    Ma réponse vous a plu ? Un petit vote serait sympa

  12. #12
    Membre expérimenté 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
    Points : 1 591
    Points
    1 591
    Par défaut
    Tu verras dans mon code une instruction "MoveLast"
    Elle est là justement pour assurer le comptage. On parcours ainsi l'entier de la table. Si on ne le fait pas, le total n'est pas correct.
    Nous n'héritons pas la Terre de nos ancêtres, nous l'empruntons à nos enfants, prenons-en soin !
    (proverbe amérindien)

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

Discussions similaires

  1. Sous-requête avec plusieurs résultats souhaités
    Par devlm dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/08/2014, 12h02
  2. Réponses: 1
    Dernier message: 30/08/2013, 16h03
  3. Réponses: 6
    Dernier message: 09/06/2010, 06h49
  4. Création de requêtes avec 2 tables non liées
    Par Jusomi31 dans le forum Access
    Réponses: 15
    Dernier message: 28/08/2008, 16h12
  5. problemme avec requete de non concordance
    Par el_quincho dans le forum Access
    Réponses: 1
    Dernier message: 17/03/2006, 16h37

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