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 :

Ajout de jours ouvrés à une date - requète vers MSSQL sous Visual Basic 2k8


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut Ajout de jours ouvrés à une date - requète vers MSSQL sous Visual Basic 2k8
    Bonjour

    Je ne suis pas sur d'être dans la bonne section mais bon...
    Bref, je développe un programme en vb sous visual studio 2008. Je doit récupérer des donnés sur un serveur MSSQL.

    Voilà quelles sont les tables concernées :

    -Activity (Id, Description, LineNumber)

    -Task (Id, IdActivity, StartDate, Duration)

    -TaskMean (Id, IdTask, IdMean, DayNumber, Quantity)

    -Mean (Id, Unite)

    -RateMean (Id, IdMean, Rate)


    Bon, je cherche à écrire une requête remplissant une table contenant les infos suivantes :

    -Line number (qui est le numéro de l'activité)
    -Numéro de semaine
    -Cout des moyens pour chaque activité, chaque activité comportant plusieurs tâches


    Je suis bloqué par le groupement par semaine. En effet, le "DayNumber" est basé sur des semaines de 5 jours. Je ne peut donc pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATEPART(nbweek, StartDate+DayNumber)
    J'ai cherché toute la journée sans succès Bon, en même temps je débute...

    Voilà ce que j'obtiens sans groupement par semaine :

    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
    51
    52
    53
    SELECT Act.LineNumber, T.StartDate, TM.DayNumber, SUM(TM.Quantity*RMeP.Rate) As PricePers, SUM(TM.Quantity*RMeM.Rate) As PriceMat
     
    FROM dbo.TaskMean TM
     
     
     
    LEFT OUTER JOIN (
    (SELECT Code, Id
    FROM dbo.Mean
    WHERE SUBSTRING (Mean.Code, 1, 2 ) = 'ML') MeP
     
    JOIN (
    SELECT IdMean, SUM(Rate) AS Rate
    FROM dbo.RateMean
    GROUP BY IdMean) RMeP
     
    ON RMeP.IdMean = MeP.Id)
     
    ON TM.IdMean = MeP.Id
     
     
    LEFT OUTER JOIN (
    (SELECT Code, Id
    FROM dbo.Mean
    WHERE SUBSTRING (Mean.Code, 1, 2 ) = 'ME') MeM
     
    JOIN (
    SELECT IdMean, SUM(Rate) AS Rate
    FROM dbo.RateMean
    GROUP BY IdMean) RMeM
     
    ON RMeM.IdMean = MeM.Id)
     
    ON TM.IdMean = MeM.Id
     
     
     
    JOIN dbo.Task T
    ON TM.IdTask = T.Id
     
    JOIN dbo.Activity Act
    ON T.IdActivity = Act.Id
     
    JOIN dbo.Schedule Sch
    ON Act.IdSchedule = Sch.Id
     
    JOIN dbo.Site S
    ON S.Id = Sch.IdSite
     
    WHERE Sch.IdSite='9900a5b9-14b5-4afc-abec-d6b3c2bc2f42' AND Sch.ScheduleType=0
     
    GROUP BY Act.LineNumber, TM.DayNumber, T.StartDate
    ORDER By LineNumber ASC
    ça me donne ça :

    [IMG][/IMG]
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Ajoutez une table des dates à votre base, soit directement, soit dans un schema SQL particulier, soit même dans une autre base et faites vos requêtes avec une jointure sur cette table.

    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/gestiontemps/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Merci pour votre réponse SQLPro mais le fait est que je ne peut pas altérer la base de donnée. (Je ne peut pas créer de tables notamment).

    Je peut peut-être créer une datatable sous visual studio et la joindre à la requête ? Je ne suis pas sur que ce soit possible car il ne s'agira pas d'une table sur un serveur lié :s

    Sinon si vous avez d'autres idées pour contourner le problème je suis preneur...
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Qu'est-ce qui vous empêche de créer une table de dates ?
    Si c'est une histoire de droits, vous pouvez peut-être écrire le script et le soumettre au DBA ...
    Sans cela il est difficile de calculer les jours ouvrés à la volée (prenez l'exemple de Pâques dont la date varie d'année en année), et cela pénalisera forcément les performances de la requête

    @++

  5. #5
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    En fait il s'agit d'un projet de fin d'étude. L'administrateur ne veux pas que la bdd soit modifiée donc en gros je dois me dem..der :/

    Pour l'instant vu que je ne trouve pas je vais essayer de faire le regroupement par semaine sous vb à partir de la table montrée dans mon premier post.
    Le problème c'est que c'est quand même assez long et en plus c'est pas évident à coder, je me retrouve à faire plein de boucles et de tableaux dans tous les sens...

    Bref, il n'y a pas moyen de faire ça dans la requête sans créer des tables en plus ? Sachant qu'il y a une table avec les jours fériés. Le problème viens des samedis et dimanches


    ---Edit 14h45---

    Bon alors si je vous dit qu'après deux jours à sécher je viens de trouver une table contenant les jours fériés et les weekend qu'est-ce que vous dites ?
    (Bon, à ma décharge, elle n'était pas explicite et ne figurait pas sur la liste que l'on m'a fourni... )


    Bref je vais essayer de m'en sortir avec ça.

    ---
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

  6. #6
    Membre éclairé Avatar de methylene
    Profil pro
    Inscrit en
    Février 2010
    Messages
    659
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 659
    Points : 813
    Points
    813
    Par défaut
    Bon bah en fait je n'y arrive pas, même avec cette table...

    ---EDIT 17h34---

    Finalement, mon ABD m'a gentiment ajouté une fonction qui calcule une date de fin à partir d'une date de début et d'une durée en "évitant" les jours non travaillés stockés dans la table dont je vous parlait dans le post juste au dessus.

    Résultat j'ai fini par trouver un truc qui marche même si je pense que ce n'est pas très optimisé...

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    SELECT Kaa.LineNumber, DATEPART(week, dbo.Calculate_EndDate(Kaa.StartDate, (Kaa.DayNumber+1), '9900a5b9-14b5-4afc-abec-d6b3c2bc2f42')) AS Week,
    SUM(Kaa.PriceMat) AS PriceMat, SUM(Kaa.PricePers) AS PricePers
     
    FROM (
    SELECT Act.LineNumber, T.StartDate, TM.DayNumber, SUM(TM.Quantity*RMeP.Rate) AS PricePers, SUM(TM.Quantity*RMeM.Rate) AS PriceMat
     
    FROM dbo.TaskMean TM
     
     
     
    LEFT OUTER JOIN (
    (SELECT Code, Id
    FROM dbo.Mean
    WHERE SUBSTRING (Mean.Code, 1, 2 ) = 'ML') MeP
     
    JOIN (
    SELECT IdMean, SUM(Rate) AS Rate
    FROM dbo.RateMean
    GROUP BY IdMean) RMeP
     
    ON RMeP.IdMean = MeP.Id)
     
    ON TM.IdMean = MeP.Id
     
     
    LEFT OUTER JOIN (
    (SELECT Code, Id
    FROM dbo.Mean
    WHERE SUBSTRING (Mean.Code, 1, 2 ) = 'ME') MeM
     
    JOIN (
    SELECT IdMean, SUM(Rate) AS Rate
    FROM dbo.RateMean
    GROUP BY IdMean) RMeM
     
    ON RMeM.IdMean = MeM.Id)
     
    ON TM.IdMean = MeM.Id
     
     
     
    JOIN dbo.Task T
    ON TM.IdTask = T.Id
     
    RIGHT OUTER JOIN dbo.Activity Act
    ON T.IdActivity = Act.Id
     
    JOIN dbo.Schedule Sch
    ON Act.IdSchedule = Sch.Id
     
    JOIN dbo.Site S
    ON S.Id = Sch.IdSite
     
    WHERE Sch.IdSite='9900a5b9-14b5-4afc-abec-d6b3c2bc2f42' AND Sch.ScheduleType=0
     
    GROUP BY Act.LineNumber, TM.DayNumber, T.StartDate) Kaa
     
     
     
    GROUP BY Kaa.LineNumber, DATEPART(week, dbo.Calculate_EndDate(Kaa.StartDate, (Kaa.DayNumber+1), '9900a5b9-14b5-4afc-abec-d6b3c2bc2f42'))
    ORDER BY LineNumber ASC, Week ASC
    En tout cas merci pour votre aide
    Geeker c'est comme manger, on ne peut pas s'en passer !!!

    Tout est objet !!!

    ____________________________________

    http://www.geekingmania.com

Discussions similaires

  1. [AC-2010] Soustraire ou ajouter des jours ouvrés à une date
    Par typouce dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 28/01/2015, 13h01
  2. [Toutes versions] Ajouter X jours ouvré à une date
    Par DaD92 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/11/2011, 20h30
  3. [AIDE] Comment ajouter un nb de jours ouvres à une date
    Par Diablo_22 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 15/06/2009, 10h15
  4. Requête pour ajouter un jour a une date
    Par Diablo_22 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/04/2009, 11h41
  5. Ajouter 15 jours a une date
    Par azorol dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/12/2005, 14h36

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