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() et requête paramétrée ?


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut DCount() et requête paramétrée ?
    Bonjour à tous et merci de votre aide et de votre temps.

    • J'ai trois niveaux hiérarchiques : Direction, Territoire et Groupe d'affectation.
    • J'ai une requête de regroupement un peu complexe qui fait actuellement le regroupement au niveau du groupe d'affectation.
      Elle me donne entre autre le nombre de personnes. (ex : 21 personnes dans le groupes d'affectation 1).
    • J'ai la possibilité de filtrer mes données par niveau hiérarchique (ex : je ne veux voir que les données du territoire 1 qui comprend 6 groupes).
      Donc j'ai fait un DCount("ClefPersonne", "MaRequête", MonFiltreVariable) pour trouver le nombre au trois niveaux avec une seule et même requête.
      MonFiltreVariable contient quelque chose comme [NoDir]=0 and [NoTerr]=1.
      Ce filtre est composé par VBA en réaction aux choix du client.


    Tout allait bien jusqu'à ce que mon client me demande la possibilité d'avoir une personne dans plusieurs groupes d'affectation.
    Donc si je fais un bête regroupement au niveau de la direction, une même personne est comptées autant de fois qu'elle a de groupes.

    J'ai trouvé une parade : passer un paramètre [prmNiveauHierarchique] à ma requête de regroupement qui va "annuler" les niveaux hiérarchiques dont je n'ai pas besoin (ex : Annule le niveau Groupe quand je demande un total au niveau du territoire).

    Là je ne trouve pas de moyen de passer à la fois le filtre ET mon paramètre ni pour le moment de voie de contournement simple.

    Comme ma requête est complexe ET que je fais souvent des modifs, je n'ai pas envie d'avoir une requête pour la direction, le territoire et le groupe.

    Dernier point, j'appelle ce DCount() depuis pas mal d'endroits et donc je ne peux pas supposer qu'un formulaire soit ouvert au moment où j'en ai besoin.
    On pourrait envisager d'utiliser une variable globale pour passer [prmNiveauHierarchique], mais je ne suis pas un grand amateur de variable globale.

    Compte tenu de ces contraintes, quelqu'un aurait-il une idée ou une piste ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    DAO est interdit ? sinon possible...

  3. #3
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Bonsoir,

    Je ne suis pas sûr de bien tout comprendre, mais la 1re idée qui me vient c'est de passer par une requête intermédiaire qui élimine les doublons au niveau des personnes, en vba ça ferait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim leSql as string
    Dim qry as querydef
     
    leSql = "select distinct ClefPersonne from MaRequête where " & MonFiltreVariable
     
    On Error Resume Next
    DoCmd.DeleteObject acQuery, "MaRequête"
     
    Set qry = CurrentDb.CreateQueryDef("MaRequête", leSql)
     
    Effectif = DCount("ClefPersonne","MaRequête")
     
    ...
    CDlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonne idée User, mais Dcount attend un nom de table ou de requête

    La même mais en passant par DAO :
    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
     
    Public Function DistinctCount(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As String) As Long
    'v1.01 : COUNT(*) -> COUNT(Expr) pour ne pas compter les éventuelles valeurs NULL sauf si Expr = *
    Dim oDb As DAO.Database, oRs As DAO.Recordset, sql As String
    On Error GoTo Catch
    sql = "SELECT COUNT(" & Expr & ") As C FROM (SELECT DISTINCT " & Expr & " FROM " & Domain
    If Trim$(Criteria) = vbNullString Then
        sql = sql & ") As R"
    Else
        sql = sql & " WHERE " & Criteria & ") As R"
    End If
    Set oDb = CurrentDb
    Set oRs = oDb.OpenRecordset(sql, dbOpenSnapshot)
    If Not oRs.EOF Then DistinctCount = oRs.Fields(0)
    oRs.Close
    fin:
    Set oRs = Nothing
    Set oDb = Nothing
    Exit Function
    Catch:
        MsgBox "Erreur n°" & err.Number & vbCrLf & "Description: " & err.Description, vbExclamation, "DistinctCount()"
        Resume fin
    End Function
    Dernière modification par Invité ; 20/06/2017 à 23h39.

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par galoir Voir le message
    Bonne idée User, mais Dcount attend un nom de table ou de requête

    La même mais en passant par DAO :
    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
     
    Public Function DistinctCount(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As String) As Long
    Dim oDb As DAO.Database, oRs As DAO.Recordset, sql As String
    On Error GoTo Catch
    sql = "SELECT COUNT(*) As C FROM (SELECT DISTINCT " & Expr & " FROM " & Domain
    If Trim$(Criteria) = "" Then
        sql = sql & ") As R"
    Else
        sql = sql & " WHERE " & Criteria & ") As R"
    End If
    Set oDb = CurrentDb
    Set oRs = oDb.OpenRecordset(sql, dbOpenSnapshot)
    If Not oRs.EOF Then DistinctCount = oRs.Fields(0)
    oRs.Close
    fin:
    Set oRs = Nothing
    Set oDb = Nothing
    Exit Function
    Catch:
        MsgBox "Erreur n°" & err.Number & vbCrLf & "Description: " & err.Description, vbExclamation, "DistinctCount()"
        Resume fin
    End Function
    Oui merci j'avais corrigé et ne m'étais pas relu
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ca me rassure, même les meilleurs ont parfois un oubli !

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci de vos réponse.

    Je vais étudier cela demain matin.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 261
    Points : 19 424
    Points
    19 424
    Billets dans le blog
    63
    Par défaut
    Citation Envoyé par galoir Voir le message
    Ca me rassure, même les meilleurs ont parfois un oubli !
    Merci c'est sympa, mais vous êtes aussi bien actif sur le forum et c'est utile pour les intervenants, donc merci pour eux
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci Galoir c'est exactement ce dont j'avais besoin.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  2. Requête paramétrée
    Par lou.souleu dans le forum Access
    Réponses: 2
    Dernier message: 22/06/2005, 05h36
  3. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 08h39
  4. Requête paramétrée qui remplit une DBLookUpComboBox
    Par navis84 dans le forum Bases de données
    Réponses: 6
    Dernier message: 02/12/2004, 21h23
  5. VBA & Requête paramétrée
    Par gripoil dans le forum Access
    Réponses: 4
    Dernier message: 25/11/2004, 09h54

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