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 :

"Eclater" en autant de dates un enregistrement dans un intervalle de dates [AC-2016]


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Points : 87
    Points
    87
    Par défaut "Eclater" en autant de dates un enregistrement dans un intervalle de dates
    Bonjour,

    Désolée pour le titre, je ne trouve pas plus parlant...
    je trouve des réponses à ma problématique sur le web mais pas vraiment qui correspondent.

    Je voudrais, à partir d'enregistrements avec des dates (début et fin) , obtenir les dates intermédiaires avec les données du coup qui se dupliquent et tout ça en select SQL sous Access ?

    Exemple : j'ai ça au départ
    HEB ID Date début Date fin
    Camping 159 08/07/2016 11/07/2016
    Camping 172 11/07/2016 11/07/2016
    Camping 180 15/07/2016 17/07/2016


    Et je voudrait obtenir ça :
    HEB ID LaDate
    Camping 159 08/07/2016
    Camping 159 09/07/2016
    Camping 159 10/07/2016
    Camping 159 11/07/2016
    Camping 172 11/07/2016
    Camping 180 15/07/2016
    Camping 180 16/07/2016
    Camping 180 17/07/2016

    Le but ultime serait d'avoir (mais bon ça ça sera en utilisant une table calendrier d'après ce que j'ai pu lire que je créerais à la volée selon les intervalles de dates demandés)
    HEB Count(ID) LaDate
    Camping 1 08/07/2016
    Camping 1 09/07/2016
    Camping 1 10/07/2016
    Camping 2 11/07/2016
    Camping 0 12/07/2016
    Camping 0 13/07/2016
    Camping 0 14/07/2016
    Camping 1 15/07/2016
    Camping 1 16/07/2016
    Camping 1 17/07/2016

    En tout cas est-ce que passer du 1er état au second par une requête Access est faisable?

    merci beaucoup
    Anne

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour.

    Avec du SQL c'est possible si tu fournis une table qui contient tous les jours de l'année.
    Il te suffit de faire un produit croisé entre tes données et cette table puis de ne garder QUE les enregistrements qui sont compris entre le début et la fin.

    Sinon avec un petit bout VBA cela se fait très bien.
    Un simple boucle qui va créer un enregistrement pour chaque jour entre début et fin.
    Si tu es intéressé, dit le.

    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.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Points : 87
    Points
    87
    Par défaut
    Ok je suis intéressée par toutes les méthodes en fait!

    Je sais déjà créer un calendrier entre 2 dates en VBA (récupéré dans un super tuto qui aurait pu le faire mais qui ne correspond pas totalement..et je sèche sur la suite...
    je mets le code de la création du calendrier à toute fin utile pour ceux qui sont intéressés par ce fil
    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
    32
    33
    34
    35
    Public Sub MajCalendrier(debut As Date, fin As Date)
    ' Met à jour le calendrier en fonction des dates de début et de fin.
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim dt As Date
     
    ' Suppression des données contenues dans la table T_Calendrier.
    DoCmd.SetWarnings False
    DoCmd.RunSQL "delete * from T_Calendrier;"
    DoCmd.SetWarnings True
     
    'Ouverture de la table T_Calendrier.
    Set db = CurrentDb
    Set rs = db.OpenRecordset("T_Calendrier")
     
    dt = debut
     
    'Parcours de la période définies par les paramètres debut et fin passés en argument.
    Do While dt <= fin
     
       rs.AddNew ' ajout du jour dans la table T_Calendrier.
       rs!DateCalendrier = dt
       rs.Update
     
       dt = dt + 1 ' prochain jour.
     
    Loop
     
    rs.Close
    Set rs = Nothing
     
    db.Close
    Set db = Nothing
     
    End Sub

    Merci!

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Points : 87
    Points
    87
    Par défaut
    Ah et puis il faudra peut-être dans un 1er temps utiliser aussi une table Nb de jours dans l'intervalle d'après ce que je viens de découvrir sur ce fil !! non?
    mais après comment faire mon regroupement , mon count et le "comblement des trous" avec 0...là est la question...

  5. #5
    Rédacteur/Modérateur

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

    Dans une requête basée sur votre table de référence et la table T_Calendrier utiliser un critère du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    DateCalendrier between [Date Début] and [Date Fin]

    Il y a une contribution sur le même sujet :

    generer-dates-comprises-entre-date-debut-fin/

    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

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bonjour.

    Voici une idée de solution en VBA qui est une variante de 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Public Sub CreerJour(prmRDonnees as dao.recordset)
    ' Met à jour le calendrier en fonction des dates de début et de fin.
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim dt As Date
     
    'Ouverture de la table T_Calendrier.
    Set db = CurrentDb
    Set rs = db.OpenRecordset("T_Calendrier", dbOpenDynaset)
     
    dt = prmRDonnees![daetDebut]
     
    'Parcours de la période définies par les paramètres debut et fin passés en argument.
    Do While dt <= prmRDonnees![dateFin] 
       rs.AddNew ' ajout du jour dans la table T_Calendrier.
       rs!DateCalendrier = dt
       rs![Heb_Id]=prmRDonnees![Heb_Id]
       rs.Update
     
       dt = dt + 1 ' prochain jour.
     
    Loop
     
    rs.Close
    Set rs = Nothing
     
    db.Close
    Set db = Nothing
     
    End Sub
    Tu l'appelle en faisant quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dim db as dao.databse:set db=currentdb
    dim r as dao.recordset:set r=db*.openrecordset("NomTaSource", dbOpenSnapshot)
     
    do while not r.eof
      call CreerJour(r)
      r.movenext
    loop
     
    r.close:set r=nothing
    db.close:set db=nothing
    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.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Points : 87
    Points
    87
    Par défaut
    Merci beaucoup à tous!

    J'explique ce que j'ai fait et qui fonctionne en mixant vos propositions et des requêtes.
    (Bon c'est pas finalisé du tout au niveau interface)
    J'ai une table où sont inscrits des gens pour un hébergement entre 2 dates. Genre comme ça :
    Camping 159 08/07/2016 11/07/2016
    Camping 172 11/07/2016 11/07/2016
    Camping 180 15/07/2016 17/07/2016
    Mon objectif est de pouvoir voir dans un formulaire les lieux occupés et combien de personnes les occupent

    Voici la finalité..Je sélectionne un début, une fin, un hébergement et je valide et cela me donne les dates et les occupations de l'hébergement

    Nom : Presse-papiers-2.jpg
Affichages : 289
Taille : 36,3 Ko

    Au clic sur le bouton j'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MajCalendrier CDate(Me.DateDeb), CDate(Me.DateFin)
    dont voici le code pour mettre à jour mes table temporaires T_Calendrier et T_NbreJours qui me serviront dans mes requêtes (en fait j'ai remarqué que j'aurais pu me passer de la table T_NbreJours en utilisant l'identifiant de ma date de calendrier que je réinitialise toujours en partant à 1..bref)
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Public Sub MajCalendrier(debut As Date, fin As Date)
    ' Met à jour le calendrier en fonction des dates de début et de fin.
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rs2 As DAO.Recordset
    Dim dt As Date
    Dim x As Long
    Dim n As Long
    ' Suppression des données contenues dans la table T_Calendrier.
    DoCmd.SetWarnings False
    DoCmd.RunSQL "delete * from T_Calendrier;"
    DoCmd.RunSQL "delete * from T_NbreJours;"
    DoCmd.SetWarnings True
     
    'Ouverture de la table T_Calendrier.
    Set db = CurrentDb
    Set rs = db.OpenRecordset("T_Calendrier")
    Set rs2 = db.OpenRecordset("T_NbreJours")
     
    x = 1
    n = 1
    dt = debut
     
    'Parcours de la période définies par les paramètres debut et fin passés en argument.
    Do While dt <= fin
     
       rs.AddNew ' ajout du jour dans la table T_Calendrier.
       rs!IdCalendrier = x
       rs!DateCalendrier = dt
       rs.Update
     
    rs2.AddNew ' ajout
       rs2!NbreJours = n
       rs2.Update
       dt = dt + 1 ' prochain jour.
        x = x + 1
        n = n + 1
    Loop
     
    ' Mise à jour des périodes successives avec la quantité correspondante.
    'MajPeriodes debut, fin
     
    rs.Close
    Set rs = Nothing
    rs2.Close
    Set rs2 = Nothing
    db.Close
    Set db = Nothing
     
    End Sub
    Je crée une 1ere requête (premiereReq) qui va chercher le type d'hébergement et qui me donne comme résultat mon jeu d'enregistrements avec les dates en colonnes sur un intervalle comme ça
    HEB ID LaDate
    Camping 159 08/07/2016
    Camping 159 09/07/2016
    Camping 159 10/07/2016
    Camping 159 11/07/2016
    Camping 172 11/07/2016
    Camping 180 15/07/2016
    Camping 180 16/07/2016
    Camping 180 17/07/2016
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Hébergement.[Type hébergement], Hébergement.CodeIntParticipation, [Date début]+[NbreJours]-1 AS DateJ
    FROM T_NbreJours, Participation INNER JOIN Hébergement ON Participation.CodeIntParticipation = Hébergement.CodeIntParticipation
    WHERE (((Hébergement.[Type hébergement])=[Formulaires]![DispoHebergement]![Typeheb]) AND ((T_NbreJours.NbreJours)<=DateDiff("d",[Date début],[Date fin])+1))
    ORDER BY Hébergement.[Type hébergement], [Date début]+[NbreJours]-1;
    Je fais une 2eme requête avec la 1ere et ma table calendrier (qui ne contient que le range de date que j'ai défini en cliquant sur mon bouton et qui m'a généré mon calendrier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT IIf(Nz(Count([premiereReq].[CodeIntParticipation]),0)>0,Nz(Count([premiereReq].[CodeIntParticipation]),0),0) AS CompteDeCodeIntParticipation, T_Calendrier.DateCalendrier
    FROM T_Calendrier LEFT JOIN [premiereReq] ON T_Calendrier.DateCalendrier = [premiereReq].DateJ
    GROUP BY T_Calendrier.DateCalendrier
    ORDER BY T_Calendrier.DateCalendrier;
    Et c'est cette requête qui est la source de mon sous-formulaire (sous form dont je ne mets la source que au moment du chargement de mon form car je mets des valeurs par défaut...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Form_Open(Cancel As Integer)
    Me.DateDeb = Date
    Me.DateFin = Date + 6
     
    MajCalendrier CDate(Me.DateDeb), CDate(Me.DateFin)
    Me.[reqregrouphebdate sous-formulaire].SourceObject = "reqregrouphebdate sous-formulaire"
    Me.[reqregrouphebdate sous-formulaire].Requery
    End Sub
    Voilà c'est peut-être un peu usine à gaz mais (pour le moment) ça fonctionne et mes données on l'air d'être cohérentes..il faut encore que je teste un peu

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

Discussions similaires

  1. Requête date d'anniversaire dans un intervalle
    Par Korg_Meridian dans le forum Requêtes
    Réponses: 6
    Dernier message: 28/03/2017, 15h20
  2. Réponses: 3
    Dernier message: 16/06/2011, 11h25
  3. Réponses: 8
    Dernier message: 13/05/2008, 23h15

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