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

Designer Discussion :

Du 12 mois flottant mois par mois?


Sujet :

Designer

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Points : 688
    Points
    688
    Par défaut Du 12 mois flottant mois par mois?
    Bonjour,

    On m'a demandé récement de faire un rapport avec un objet sur 12 mois flottant a comparer avec les 12 mois flottants précédents

    J'ai fais ca
    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
    sum(CASE  WHEN  (@Select(TIME\Day Date) <(CASE  
    WHEN  (month(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free)) =12)
     
    THEN  (CONVERT(DATETIME,CONVERT(char, 1+year(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))) +'-'+CONVERT(char, 1) +'-'+CONVERT(char, 1), 102))
     
     
    ELSE  (CONVERT(DATETIME,CONVERT(char, year(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))) +'-'+CONVERT(char, 1+month(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))) +'-'+CONVERT(char, 1), 102))
    END)
     
     and @Select(TIME\Day Date)>=(CASE  
    WHEN  (month(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free)) =12)
     
    THEN  (CONVERT(DATETIME,CONVERT(char, year(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))) +'-'+CONVERT(char, 1) +'-'+CONVERT(char, 1), 102))
     
     
    ELSE  (CONVERT(DATETIME,CONVERT(char, year(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))-1) +'-'+CONVERT(char, 1+month(@Prompt('Type in the last day like dd/mm/YYYY','d','TIME\Day Date',mono,free))) +'-'+CONVERT(char, 1), 102))
    END)
    )
    THEN  @Select(REFERENCES\CA FAC)
    ELSE  0
    END)
    Pour résumer, je demande une date a l'utilisateur, je la manipule pour en faire le premier jour du mois suivant et le premier jour du mois selectionnée mais l'année passée (en faisant un traitement différencier si c'est décembre ou non, pou rne pas avoir de bug en essayant de manipuler un mois n°13) et je prend un chiffre d'affaire qui est entre ces deux bornes

    Et j'ai fais un autre objet similaire pour l'année d'avant (meme formule, mais on fait -1 a toute les années)

    Le code m'avait l'air lourd et peu élégant, mais je suis hélas tres peu compétente en SQL (a dire vrai, c'est plutot de la logique excel, sauf qu'en excel, d'une part, c'est tres facile de recomposer une date, et d'autre part, il gere tout seul les dépassements) mais ca marchait bien

    Le probleme, c'est que le destinataire du rapport est extrement content du résultat (bon, ca en soi, c'est plutot chouette ) et que maintenant, il voudrait un nouveau rapport avec des objets de ce type, mais par mois

    C'est a dire qu'il voudrait un tableau avec en colonne 1, le total de chiffre d'affaire sur les douze mois précédent la date, et puis en colonne 2, les 12 mois précédents le mois précédent, ...

    Donc par exemple, il voudrait
    en colonne 1 le chiffre d'affaire de mars 2010 à février 2011 ,
    en colonne 2 le chiffre d'affaire de février 2010 à janvier 2011,
    en colonne 3, le chiffre d'affaire de janvier 2010 à décembre 2010,
    en colonne 4, le chiffre d'affaire de decembre 2009 à novembre 2010,
    ...

    Et des colonnes, il en voudrait 18 (et évidement, tout relatif a un seul prompt de date, sinon ca sera pas pratique)

    Du coup, mon code que je trouvais déja pas joli, je le regarde d'un oeil noir, parce que la seule facon d'obtenir ca avec le modele du code que j'ai fais, c'est de faire 18 objets et ca m'a l'air d'une idée idiote

    J'ai un acces admin a l'univers, je peux creer des nouvelles tables SQL (a condition que ca soit simple :p), l'univers dispose d'une table calendrier qui a les colonnes suivantes

    day_date smalldatetime
    year_id float
    year_nr nvarchar(50)
    qtr_nr decimal(18, 0)
    month_nr decimal(18, 0)
    week_nr decimal(18, 0)
    day_nr float
    month_name nvarchar(50)
    day_name nvarchar(50)
    quarter_name nvarchar(50)
    month_id nvarchar(50)
    month_year nvarchar(50)
    short_month_name varchar(50)
    day_datetime datetime
    Legal_holiday varchar(50)
    date_char varchar(50)
    EndMonth_Date smalldatetime
    BeginMonth_Date smalldatetime
    FY_Dec_Nov varchar(50)
    FY_Apr_March varchar(50)
    FY_Oct_Sept varchar(50)

    Je ne peux par contre ni suprimer ni alterer ce qui existe (l'univers n'est pas le mien a la base, je ne peux pas le casser, si je veux ajouter des trucs je peux, mais je ne peux pas décider que cette table la, sa tete ne me revient pas et que je le vire)

    Qu'est-ce que je peux faire de futé avec tout ca?

    Idéalement, pas 18 objets en tout cas

    L'objet month_year se présente sous la forme suivante "6/2011", est-ce ca serait une bonne idée de m'en servir pour faire un join avec une nouvelle table qui serait un add on a la table calendrier (j'ai peur de faire une bétise en essayant de lui ajouter des colonnes) qui pour chaque combinaison mois/année aurait, dans deux colonnes, une date de début et une date de fin
    Et ensuite, je ferrais un objet objet qui prendre le chiffre d'affaire entre ces deux dates et je pourrais, dans un tableau croisé, avoir pour chaque mois, le chiffre d'affaire sur les deux mois précédents.

    Ca marcherait? Et surtout, est-ce que ca serait une bonne idée, ou est-ce que je suis entrain de chercher midi a 14h?

    En espérant que j'ai réussi a expliquer correctement ce que j'ai et de quoi j'ai besoin

    Et merci beaucoup a ceux qui prendront un peu de leur temps pour réfléchir avec moi a ce sujet

    Emmanuelle

  2. #2
    Membre expérimenté
    Avatar de Julien59
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    1 142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 142
    Points : 1 458
    Points
    1 458
    Par défaut
    Salut,

    J'avoue ne pas avoir tout lu concernant ta méthode
    Si tu as accès au designer, est ce que tu ne pourrais pas juste créer un objet Mois Année Précédente qui te ramènerait par exemple pour 01/01/2010 : 01/01/2009 (basé sur la table calendrier)?

    L'idée est de filtrer dans le rapport :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme([TonObjet] where ([TaDate] Entre [Mois Année] and [Mois Année Précédente])
    En entête de colonne, tu mettrais [Mois Année].

    Concernant le prompt, je dirais qu'il en faut 2 :
    L'un sur calendrier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mois Année between @prompt('Quel mois ?','A',,mono,free,) and add_months(@prompt('Quel mois ?','A',,mono,free,),-18)
    L'autre sur TaDate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TaDate between @prompt('Quel mois ?','A',,mono,free,) and add_months(@prompt('Quel mois ?','A',,mono,free,),-30)
    30 étant égal à 18 (le nombre de mois affiché) + 12 (le nombre de mois glissants)

    Dans l'idée, je pense que ca pourrait marcher. Par contre, je l'ai fait pour de l'Oracle, donc le code sera à adapter à ton SGBD.

    A mon avis, il y'aura quelques modifs à effectuer sur ce que j'ai dit, donc reviens vers nous quand tu auras fait les tests pour remonter le résultat obtenu.

    Bon courage
    • Pensez à consulter la FAQ BO
    • Quand votre problème est solutionné, n'oubliez pas de cliquer sur le bouton

  3. #3
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut
    Bonjour,
    C'est quoi au juste ta Base de données ... SQL Server ?
    Et est ce que l'invite est obligatoire pour pouvoir choisir la date de départ de ce glissement de mois en mois vers l'arrière?
    ou bien peut on prendre la date du 1er jour du mois en cours ?
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Points : 688
    Points
    688
    Par défaut
    c'est du SQL 2005

    L'invite serait un plus apprécié (c'est pas une boite chiante, si on leur dit que c'est le premier du mois et puis c'est tout, ils seront d'accord, mais ca serait plus pratique avec une invite)

    Je n'ai pas encore eu le temps de tester mais je pense avoir trouvé la formulation dont j'avais besoin pour retirer des mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateAdd(m, -12, CONVERT(DATETIME, {fn CURDATE()}, 102))
    Des que je trouve 2h pour bosser la dessus, j'essaye de mettre en pratique ce que tu propose Julien.

    Merci pour les idées en tout cas

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 791
    Points : 688
    Points
    688
    Par défaut
    Bon, je me sens stupide, mais je n'y arrive pas

    J'ai ajouté une table qui contient 3 colonnes :
    - un champ month_year nvarchar(50) (qui contient des éléments de la forme "3/2011") qui sert a faire la liaison avec ma table de calendrier et dont j'aimerais bien faire des titres de colonnes
    - un champ months_12_before smalldatetime (par exemple, pour 3/2011 ca donne 1/04/2010 0:00:00)
    - un champ last_month smalldatetime (par exemple pour 3/2011 ca donne 31/03/2011 0:00:00)

    J'ai ajouté dans l'univers les 3 champs (le champs month_year n'avait pas encore d'objet dans l'univers) et j'ai dans l'univers un objet Day_date qui est basé sur ma table calendrier.

    Je pensais que j'avais toutes les pieces du puzzle, mais je n'arrive pas a les assembler

    Si je met dans un rapport mes 3 objets et mon turnover, ca me fait 2 table différentes alors que je m'attendais a avoir une répartition du turnover par période

    Si je vais voir le code SQL généré, il fait deux select. Et si j'essaye de le faire directement en sql server, il me pond un COLLATE. Est-ce que c'est ca le probleme? j'ai mal fait quelque chose en générant ma table?

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2011, 20h06
  2. WPF - Liste de taches par mois et regroupé par jours
    Par dauphinus dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 30/01/2008, 20h25
  3. Comment grouper une requête par mois ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/06/2005, 12h01
  4. résultat d'une requete affiché par mois
    Par zorely dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/05/2004, 07h18
  5. Regroupement par mois
    Par fplanglois dans le forum SQL
    Réponses: 7
    Dernier message: 29/07/2003, 16h32

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