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

Développement SQL Server Discussion :

Planning des Abscences sur une période [trimestre]


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut Planning des Abscences sur une période [trimestre]
    Bonsoir,
    Je voudrais faire le planning des 5 équipes sur le trimestre qui constituent le groupe. Les équipes sont A,B,C,D et E. Chaque equipe travaille 4 jours et se repose le 5e.
    Soit A l'equipe au repos le 21 Août, B le 22 Août, C le 23 Août, D le 24 Août et E le 25 Août. Pour se faire j'ai créer une Table Calendrier constitué comme suit:

    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
     
    CREATE TABLE Calendrier(
        CalDate date primary key,
        CalDateStr varchar(10) NOT NULL,
        CalYear int NOT NULL,
        CalMonth int NOT NULL,
        CalMonthStr varchar(9) NOT NULL,
        CalTrim int NOT NULL,
        CalDay int NOT NULL,
        CalDW int NOT NULL,
        CalDWstr varchar(8) NOT NULL,
        CalWeek int NOT NULL,
        CalWeekYear int NOT NULL,
        CalWorked bit NOT NULL
    )
    (le script de remplissage de la table Calendrier en fichier joint).
    Mon est le suivant:
    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
     
    DECLARE @EquipeAuRepos char(2),@DateDebut datetime,@DateFin datetime,@NbreEquipe int
    	SET @DateDebut = '20/08/2014'
    	SET @DateFin = '01/11/2014'
    	SET @NbreEquipe = 5
     
    	WHILE (@DateDebut < @DateFin )
    		BEGIN
    			SELECT [ANNEE] = (DATENAME(YEAR,CalDate)), [MOIS]=(UPPER(DATENAME(MONTH,CalDate))),[DATE]=CONVERT(varchar,(SELECT DAY(CalDate)),105) , EquipeAuRepos = 
    				CASE	
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 0 THEN 'A'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 1 THEN 'B'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 2 THEN 'C'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 3 THEN 'D'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 4 THEN 'E'
    				END
    			FROM Calendrier WHERE [CalDate] BETWEEN @DateDebut AND @DateFin
     
    			 SET @DateDebut = (SELECT DATEADD(DAY,1 ,@DateDebut))
     
    			 IF ( @DateDebut = @DateFin)
    				BREAK
    			 ELSE
     
    			  CONTINUE
    		END
    --SELECT * FROM Calendrier
    Et ensuite faire un pivot si possible pour affichage comme un calendrier. La requete est fichier joint.

    Mon souhait est de faire un planning comme sur l'image:

    Quelqu'un aurait-il une piste?

    Cordialement.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    quel est votre problème ?

    (je ne comprend pas bien l'interet de votre boucle....)

    Par ailleurs, vous pouvez remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CASE	
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 0 THEN 'A'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 1 THEN 'B'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 2 THEN 'C'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 3 THEN 'D'
    						WHEN ((SELECT DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe) ) = 4 THEN 'E'
    				END
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CASE	DATEDIFF(DAY,@DateDebut,@DateFin)% @NbreEquipe 
    	WHEN 0 THEN 'A'
    	WHEN 1 THEN 'B'
    	WHEN 2 THEN 'C'
    	WHEN 3 THEN 'D'
    	WHEN 4 THEN 'E'
    END
    Un peu plus lisible.

    Enfin, dans ce cas, il me semble que vous devriez remplacer @DateFin par ColDate, mais je n'en suis pas sûr car je n'ai pas bien compris votre problème.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut
    Bonjour,

    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    quel est votre problème ?


    Enfin, dans ce cas, il me semble que vous devriez remplacer @DateFin par ColDate, mais je n'en suis pas sûr car je n'ai pas bien compris votre problème.
    Le problème est que je voudrais faire un planning des absences des 5 équipes sur au moins 1 trimestres comme sur l'image ci- dessus. Les jours du mois en colonne, et les équipes en ligne. Sur ton indication, la requête a été beaucoup améliorée. Effectivement la boucle était inutile. Voici le code finale:
    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
     
    DECLARE @EquipeAuRepos char(2),@DateDebut datetime,@DateFin datetime,@NbreEquipe int
    	SET @DateDebut = '20/08/2011'
    	SET @DateFin = '01/11/2014'
    	SET @NbreEquipe = 5
     
     
    		BEGIN
    			SELECT [ANNEE] = (DATENAME(YEAR,CalDate)), [MOIS]=(UPPER(DATENAME(MONTH,CalDate))),[DATE]=CONVERT(varchar,(SELECT DAY(CalDate)),105) , EquipeAuRepos = 
    				CASE	DATEDIFF(DAY,@DateDebut,CalDate)% @NbreEquipe
    						WHEN  0 THEN 'A'
    						WHEN  1 THEN 'B'
    						WHEN  2 THEN 'C'
    						WHEN  3 THEN 'D'
    						WHEN  4 THEN 'E'
    				END
    			FROM Calendrier WHERE [CalDate] BETWEEN @DateDebut AND @DateFin 
     
    		END
    Il fonctionne proprement. L'Amélioration que je voulais est d'afficher les dates en colonne, et les équipes de repos en ligne de sorte que l'intersection des dates et des lignes correspondantes marquent les dates de repos comme sur l'image suivante:
    Images attachées Images attachées  
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  4. #4
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut IHM Client
    Je te conseil de regarder PIVOT , le soucis c'est que tu ne connais pas lors du code l'intégralité de tes colonnes d'arrivées.


    De plus c'est plutôt un soucis d'affichage donc pour moi c'est plus tot L'IHM Cliente qui doit géré cette problématique d'affichage...
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Full-stack
    Inscrit en
    Novembre 2010
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Full-stack

    Informations forums :
    Inscription : Novembre 2010
    Messages : 372
    Points : 489
    Points
    489
    Par défaut
    Bonjour,

    Citation Envoyé par mokona18 Voir le message
    Je te conseil de regarder PIVOT ...


    c'est plutôt un soucis d'affichage donc pour moi c'est plus tot L'IHM Cliente qui doit géré cette problématique d'affichage...
    Pour faire un PIVOT, une fonction agrégat est nécessaire. Ce n'est pas le cas ici. Voici un lien msdn pour un éclairci.

    Quant à l'Affichage, je réfléchi à une solution comme la tienne, avec les vraies données dans les lignes et des entêtes (les colonnes) pour signifiées les intervalles (périodes) ou jours .

    Cordialement.
    La recherche de la connaissance est une Lumière qui apaise le Cœur.
    Si une réponse vous a été utile , n'oubliez pas de voter en cliquant sur:.

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    PIVOT, à éviter !

    @mokona18 a raison au final, c'est de la cosmétique.

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  7. #7
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Bonjour Chtulus ,
    Citation Envoyé par Chtulus Voir le message
    Bonsoir,

    PIVOT, à éviter !
    Pourquoi ? Evidement en dehors d'un simple besoin de cosmétique ...
    Séverine Capon - Consultante MS BI
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Merci de dés que le commentaire vous a aidé ou de marquer si votre problème est résolu

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2014, 23h30
  2. Réponses: 2
    Dernier message: 13/03/2014, 18h14
  3. [MySQL-5.1] DateDebut et DateFin des lots produits sur une période
    Par pureos dans le forum Requêtes
    Réponses: 0
    Dernier message: 04/07/2013, 15h36
  4. [MySQL] Meilleure facon de récupérer des resultats sur une période
    Par beninsky dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/03/2010, 15h01
  5. Recupération des selections sur une DBGrille multi Selection
    Par Andry dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/11/2004, 11h43

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