1. #1
    Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Industrie

    Informations forums :
    Inscription : août 2017
    Messages : 3
    Points : 2
    Points
    2

    Par défaut Requête de regroupement par intervalle de date à chaque changement d'une valeur

    Bonjour,

    Je sollicite votre aide pour la construction d'une requête. J'expose ci-dessous mon problème.

    1/ La table (avec exemple)

    Cette table comporte pour le moment 3 champs.

    $DateCalendrier
    $IDSalarie
    $IDPlanning


    Nom : table.jpg
Affichages : 71
Taille : 40,3 Ko


    Il ne peut y avoir qu'une IDPlanning par IDSalarie et par DateCalendrier.

    Soit en bon "François" Un salarié ne peut avoir qu'un seul planning par jour.

    Pour alimenter cette table, j'ai créé une boite de dialogue modale où je borne :

    - IDsalarie (reprise automatique des informations d'un autre formulaire)
    - IDPlanning (Liste déroulante basée sur une requête listant les Plannings)
    - DateCalendrier (entre date de début et date de fin)


    Nom : BoiteModale.jpg
Affichages : 72
Taille : 67,2 Ko


    2/ Je souhaite quoi ? (je vous explique)

    Je voudrais dans une requête qui servira de base à un SousFormulaire lister les Plannings par Salarié par Période continue

    Soit si on reprend les données de la table en exemple : (Oui j'ai triché j'ai utilisé Excel)


    Nom : requete.jpg
Affichages : 72
Taille : 23,1 Ko


    3/ La problèmatique (sinon je ne serais pas là)

    J'ai essayé les expressions Min/Max, Premier/Dernier.

    Mais bien sûr j'obtenais une synthèse par salarié et calendrier, prenant la première et la dernière date du couple IDSalarie / IDPlanning sans faire la séparation par période continue.

    Mon idée pour simplifier le traitement est d'ajouter un champs à la table (en reprenant une gestion par lot ? comme pour des stocks ?) :

    - IDLot -> Génération automatique d'un numéro pour le couple IDSalarie / IDPlanning commun au bornage initialisé par la boite de dialogue modale.

    Comment puis je créer de façon automatique cet IDLot ?

    Avez vous une autre suggestion ?

    J'espère avoir été clair dans mes explications, par avance merci,

    Cordialement,

    Shinichiro

  2. #2
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 5 509
    Points : 11 018
    Points
    11 018
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Il faut je pense programmer l'ajout dans une table temporaire t_temp(IdSalarie,datedebut,datefin,idplanning) que tu vides au début de la procédure :

    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
    dim db as dao.Database
    dim rs1 as dao.Recordset
    dim rs2 as dao.recordset
    Dim idsalarie as long, idplanning as long
    dim dt1 as date, dt2 as date
     
    set db=currentdb
     
    DoCmd.RunSQL("delete * from T_Temp") 'on vide la table temporaire en vue d'ajouter de nouvelles données
     
    set rs1=db.Openrecordset("select * from t_calendrier order by IdSalarie,datecalendrier;")
    set rs2 = db.OpenRecordset("T_Temp")
     
    do until rs1.eof
     
    idsalarie=rs1!IdSalarie
    dt1=rs1!datecalendrier
    dt2=rs1!datecalendrier
    idplanning=rs1!IdPlanning
     
          do while (rs1!IdSalarie=idsalarie) and (rs1!IdPlanning=idplanning) and (dt2=rs1!datecalendrier) ' parcourt des dates qui se suivent pour un même idsalarié      
             dt2=dt2+1
             rs1.MoveNext
             If rs1.EOF Then Exit Do
          Loop
     
          rs2.Addnew ' ajoute de la période pour le salarié dans la table temporaire
          rs2!IdSalarie=idsalarie
          rs2!datedebut=dt1
          rs2!datefin=dt2-1
          rs2!IdPlanning=idplanning
          rs2.Update
     
    Loop
     
    rs1.close
    set rs1=nothing
     
    rs2.close
    set rs2=nothing
     
    set db=nothing
    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance et sur le forum une aide précieuse vous sera également fournie gracieusement.
    Pour éviter un monde ou prendre est plus facile qu'apprendre.


    Si vous souhaitez mettre en place une gestion de planning, une gestion de stock, de ventes/achats ou tout autre application Office je peux vous proposer mes services.
    Pour cela n'hésitez pas à me contacter par courriel ou mp.

    Mes tutoriels et contributions sur ma page personnelle.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Industrie

    Informations forums :
    Inscription : août 2017
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    Bonsoir,

    Merci pour cette réponse, étant en vacances, je vais regarder cela à mon retour.

    Merci, à bientôt.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    août 2010
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 202
    Points : 304
    Points
    304

    Par défaut

    Bonjour,

    A vérifier, une possibilité par requete mais utilisable si plage de dates du filtre < ~1000 dates :
    Requete de base nommée "rShinichiroBase", penser à renommer 3 fois la table shinichiro par la vôtre et possibilité d'ajouter ici vos filtres sur idsalarie, datecalendrier min et max
    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
     
    SELECT t.IdSalarie,
           t.IdPlanning,
           t.DateCalendrier,
           nz(
                (SELECT Max(datecalendrier)
                 FROM Shinichiro
                 WHERE idsalarie=t.idsalarie
                   AND idplanning<>t.idplanning
                   AND datecalendrier<t.datecalendrier),#1/1/100#) AS OutMinDate,
           nz(
                (SELECT Min(datecalendrier)
                 FROM Shinichiro
                 WHERE idsalarie=t.idsalarie
                   AND idplanning<>t.idplanning
                   AND datecalendrier>t.datecalendrier),#1/1/100#) AS OutMaxDate
    FROM Shinichiro AS t
    et la requete finale qui utilise cette 1ere requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT r.IdSalarie, r.IdPlanning, Min(r.DateCalendrier) AS Du, Max(r.DateCalendrier) AS Au
    FROM rShinichiroBase AS r
    GROUP BY r.IdSalarie, r.IdPlanning, r.OutMinDate, r.OutMaxDate;

  5. #5
    Rédacteur/Modérateur
    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    5 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : août 2004
    Messages : 5 509
    Points : 11 018
    Points
    11 018
    Billets dans le blog
    6

    Par défaut

    Bonjour,

    Citation Envoyé par galoir Voir le message
    Bonjour,

    A vérifier, une possibilité par requete mais utilisable si plage de dates du filtre < ~1000 dates :
    Requete de base nommée "rShinichiroBase", penser à renommer 3 fois la table shinichiro par la vôtre et possibilité d'ajouter ici vos filtres sur idsalarie, datecalendrier min et max
    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
     
    SELECT t.IdSalarie,
           t.IdPlanning,
           t.DateCalendrier,
           nz(
                (SELECT Max(datecalendrier)
                 FROM Shinichiro
                 WHERE idsalarie=t.idsalarie
                   AND idplanning<>t.idplanning
                   AND datecalendrier<t.datecalendrier),#1/1/100#) AS OutMinDate,
           nz(
                (SELECT Min(datecalendrier)
                 FROM Shinichiro
                 WHERE idsalarie=t.idsalarie
                   AND idplanning<>t.idplanning
                   AND datecalendrier>t.datecalendrier),#1/1/100#) AS OutMaxDate
    FROM Shinichiro AS t
    et la requete finale qui utilise cette 1ere requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT r.IdSalarie, r.IdPlanning, Min(r.DateCalendrier) AS Du, Max(r.DateCalendrier) AS Au
    FROM rShinichiroBase AS r
    GROUP BY r.IdSalarie, r.IdPlanning, r.OutMinDate, r.OutMaxDate;
    Tout d'abord bravo pour cette astuce

    En fait j'avais envisagé dans ma réponse (non testée) le cas où il y a des sauts dans le calendrier :

    exemple :

    DateCalendrier IdSalarie IdPlanning
    01/01/2017 1 10
    02/01/2017 1 10
    04/01/2017 1 10
    05/01/2017 1 10
    ... ... ...

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information en abondance et sur le forum une aide précieuse vous sera également fournie gracieusement.
    Pour éviter un monde ou prendre est plus facile qu'apprendre.


    Si vous souhaitez mettre en place une gestion de planning, une gestion de stock, de ventes/achats ou tout autre application Office je peux vous proposer mes services.
    Pour cela n'hésitez pas à me contacter par courriel ou mp.

    Mes tutoriels et contributions sur ma page personnelle.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    août 2010
    Messages
    202
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 202
    Points : 304
    Points
    304

    Par défaut

    Bonjour User,

    Il a precise un planning par jour par personne, J aurais préfère un planning par semaine car beaucoup plus simple en s appuyant sur les numéros de semaine + AA pour regrouper....

    Amicalement

  7. #7
    Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    août 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Industrie

    Informations forums :
    Inscription : août 2017
    Messages : 3
    Points : 2
    Points
    2

    Par défaut

    Bonsoir à toutes et à tous,

    Fin des vacances, retour au bureau :p

    Je vous remercie pour vos réponses précieuses !

    Donc j'ai opté pour la solution suivante :

    La boite modale qui permet d'alimenter ma table via une requête ajout, lance maintenant une deuxième requête ajout dans une deuxième table incrémentant une numérotation automatique.

    Dans la table TblCalendrierComposition comportant initialement les champs suivants :

    $DateCalendrier (clé primaire)
    $IDSalarie (clé primaire)
    IDPlanning

    j'ai ajouté le champs IDSerie qui est renseignée par la valeur Max du numéroAuto de la nouvelle table.

    Maintenant, je peux faire mes regroupements comme je le souhaite.

    J'ai donc repris en partie l'idée de la table temporaire intermédiaire.

    Merci beaucoup, vous m'avez bien aidé !

    Bonne soirée.

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

Discussions similaires

  1. Regroupement par intervalle < 5min
    Par prophete3d dans le forum Langage SQL
    Réponses: 12
    Dernier message: 06/09/2007, 14h55
  2. requête de validation par rapport à des dates
    Par zougna dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/04/2007, 14h45
  3. Requete de regroupement par intervalle
    Par tonio-lille dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/01/2007, 17h22
  4. regroupement par intervalle de 24h
    Par habasque dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/11/2006, 18h39
  5. regroupement par intervalle de 24h
    Par habasque dans le forum Oracle
    Réponses: 2
    Dernier message: 08/11/2006, 11h49

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