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 :

Calculer le nombre de personnes présentes sur des tranches horaires


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Calculer le nombre de personnes présentes sur des tranches horaires
    Bonjour,

    Je souhaiterai via Access et bien entendu si ce dernier me le permet calculer à l'aide d'une requête le nombre de personne qui effectue une activité que j'appelle AS sur plusieurs tranches horaires et sur 24H et cela du 01/01/2013 au 31/12/2013.

    Pour cela je dispose d'une table qui contient les éléments suivants:

    Champs 1: Nom
    Champs 2: Prénom
    Champs 3: Centre
    Champs 4: Type d'activité que j'appelle "PLANNING_ETAT_LIBELLE_COURT" dans lequel on retrouve le critère AS
    Champs 5: Début de l'activité que j'appelle "PLANNING_DEBUT_DATEHEURE" type 00/00/0000 00:00
    Champs 6: Fin de l'activité que j'appelle "PLANNING_FIN_DATEHEURE" type 00/00/0000 00:00

    Tableau que j'attends de ma requête:

    Centre Date Trache Horaire 08H-09H 09H-10H 10H-11H .... 07H-08H
    Paris 01/01/2013 5 5 6 3
    02/01/2013 4 8 9 7
    ....
    31/12/2013
    Lyon 01/01/2013
    02/01/2013
    ....


    J'espère avoir été assez explicite.

    Merci d'avance.

    Cordialement.

    Kader

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Le calcul de tranche est toujours un peu complex.

    Un événement est dans une tranche si :
    1. sa date (et l'heure) de début est dans la tranche
    2. sa date (et l'heure) de fin est dans la tranche
    3. la tranche est entre la date de début (et l'heure) et la date de fin (et l'heure) de l'événement


    personnellement je créerai :

    1. Une requête qui sélectionne les événements pour une date donnée (R1).
    2. Pour chacune des tranches, une requête qui sélectionne les données de R1 (R2-01 à R2-24 donc au total 24 requêtes)
    3. Une requête union qui "concatène" toutes les tranches d'une journée R3 (union de R2-01 à R2-24)
    4. Une requête union R4 qui "ajoute" toutes les tranches à R3 pour la date donnée dans R1 pour s'assurer qu'on a bien au moins une fois chaque tranche.
    5. Une requête croisée dynamique basée sur R4 qui présente tes données en tableau.


    Une autre solution serait de faire une table temporaire présentant autant de champs que de tranche horaire et une ligne par date et de la remplir avec du code VBA qui parcourrerai les données. S tu n'as pas beaucoup de données cette méthode est sans doute plus simple car plus intuitive à programmer.

    A+

  3. #3
    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
    Donnez au moins un exemple de données et de retour correct. Là, votre "tableau" ne possède pas les mêmes colonnes suivant les lignes ...

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 846
    Points : 7 983
    Points
    7 983
    Par défaut
    Bonsoir,

    Je propose de partir sur l'utilisation d'une table temporaire T_temp avec les champs :
    - NumEnr (identification de l'élément dans le planning)
    - IdPersonne (Identification de la personne en lieu et place de Nom et Prénom)
    - Centre (tu l'as)
    - PLANNING_ETAT_LIBELLE_COURT (tu l'as)
    - DateEnr (ce sera la date de la tranche horaire qui va être utilisé)
    - TrancheHEnr (Les tranches horaires, numérotons les de 0 à 23. 24 passe à la DateEnr suivante)

    1- On vide cette table temporaire avec un DELETE* FROM T_temp
    2- On exécute le code suivant qui permet de charger les informations à partir de la table T_Planning vers la table T_temp avec la valeur "AS" et les délais de présence seront répartis dans les tranches de 0 à 23.
    Un premier module permettant d'ajouter les valeurs dans T_temp selon les débuts et fins dans planning
    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
    'Fonction pour ajouter les valeurs dans la table T_temp
    Public Sub AjoutTrancheH(parDebut As Date, parFin As Date, _
                        parCentre As String, parLib As String, _
                        parPers As Integer, parNumer As Integer)
    Dim rstTemp As DAO.Recordset
    Dim valdate As Date
    valdate = parDebut
    Set rstTemp = CurrentDb.OpenRecordset("T_temp", dbOpenDynaset)
    With rstTemp
        While valdate <= parFin
            .AddNew
            ![NumEnr] = parNumer
            ![IdPersonne] = parPers
            ![Centre] = parCentre
            ![PLANNING_ETAT_LIBELLE_COURT] = parLib
            ![DateEnr] = DateValue(valdate)
            ![TrancheHEnr] = IIf(Hour(valdate) = 24, 0, Hour(valdate))
     
            .Update
        valdate = DateAdd("h", 1, valdate)
        Wend
    End With
    rstTemp.Close
    Set rstTemp = Nothing
    End Sub
    Parcourir la table T_Planning pour trouver les valeurs avec "AS"
    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
    'Fonction pour parcourir la table T_Planning
    Public Sub ParcourirValPlanningAS()
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("T_Planning", dbOpenDynaset)
    With rst
        .MoveFirst
        While Not .EOF
        Debug.Print ![NumEnr]
        If ![PLANNING_ETAT_LIBELLE_COURT] = "AS" Then
        Call AjoutTrancheH(![PLANNING_DEBUT_DATEHEURE], ![PLANNING_FIN_DATEHEURE], _
                        ![Centre], ![PLANNING_ETAT_LIBELLE_COURT], _
                        ![IdPersonne], ![NumEnr])
        End If
        .MoveNext
        Wend
    End With
    rst.Close
    Set rst = Nothing
    End Sub
    L'appel des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function execut()
    Dim strSQl As String
    strSQl = "DELETE * FROM T_temp"
    DoCmd.RunSQL strSQl
    ParcourirValPlanningAS
    End Function
    3- Exécuter la requête croisée dynamique suivante pour faire apparaitre le résultat voulu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM Count(T_temp.IdPersonne) AS CompteDeIdPersonne
    SELECT T_temp.Centre, T_temp.DateEnr, Count(T_temp.IdPersonne) AS [Total de IdPersonne]
    FROM T_temp
    GROUP BY T_temp.Centre, T_temp.DateEnr
    PIVOT T_temp.TrancheHEnr;
    Attention : Je n'ai pas fait le filtre selon les dates extrêmes. A toi de l'appliquer vu que je ne sais pas si on prend en compte ou non un enregistrement qui commence le 31/12/2013 à 21:00 et se termine le 01/01/2014 à 06:00.

    Bonne continuation

  5. #5
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 396
    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 396
    Points : 19 821
    Points
    19 821
    Billets dans le blog
    66
    Par défaut
    Bonjour à tous,

    Comme mentionné par madefemere:

    Est-ce que le début et la fin de l'activité peuvent être sur plusieurs jours ?

    Exemple :

    Durand, Paul, Paris, AS, 01/01/2013 15:00, 02/01/2013 07:00

    Cdt,

  6. #6
    Expert confirmé
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Points : 4 047
    Points
    4 047
    Par défaut
    Bonjour,

    J'avais donné un début de piste => http://www.developpez.net/forums/d14...ate-naissance/

  7. #7
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 396
    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 396
    Points : 19 821
    Points
    19 821
    Billets dans le blog
    66
    Par défaut
    Bonjour,

    Avez-vous trouvez une solution à votre problème ?

    Sinon, j'aurais un exemple à vous proposer un peu dans le style de pc75 mais avec en plus une table pour enregistrer les heures.

    a+
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [AC-2007] Liste déroulante sur des tranches horaire
    Par Razorback dans le forum IHM
    Réponses: 8
    Dernier message: 04/05/2009, 10h42
  2. compter le nombre de personnes présentes
    Par contremaitre dans le forum Traitement d'images
    Réponses: 91
    Dernier message: 25/04/2008, 08h23
  3. Réponses: 25
    Dernier message: 02/09/2007, 15h06
  4. Réponses: 11
    Dernier message: 19/07/2006, 18h28
  5. Nombre de personnes connectées sur le forum
    Par portu dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 18/04/2006, 13h49

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