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

SSRS Discussion :

[SSRS][2005][MDX] Créer une mesure


Sujet :

SSRS

  1. #1
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut [SSRS][2005][MDX] Créer une mesure
    Bonjour,

    J'ai un dataset qui liste les ventes sur plusieurs années.
    Dans mon état je dois avoir une colonne du total des ventes de l'année n, de l'année n-1 et de l'année n-2.
    Je voudrai savoir comment peut on faire pour ca, sachant que l'année d'exercice est un paramètre.
    Je pensais créer une mesure pour chaque année, mais ca ne fonctionnera pas vu que'on est filtré sur l'année d'exercice et donc que je n'aurai pas les données des années antérieures...
    qq a une idée?
    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Tu crées un membre calculé dans ta query pour chaque valeur année-n (donc un pour année-1, année-2).

    Dans la définition de chaque membre calculé, tu utlise la fonction "parallelperiod". Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    with member [Measures].[N-1]
    as
        (parallelperiod([DimTemps].[CalendarTime].[Year], -1, strtomember(@ParamAnnee)), [Measures].[MesureAAfficher])
     
    select ...

  3. #3
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    le pb c'est que mon parametre "Année d'exercice" n'est pas basé sur ma dimension de temps...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    C'est à dire?

    Tu ne peux pas t'arranger pour que ça le deviennent?

    Ex : sa valeur est "2002".

    Ton code devient donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WITH member [Measures].[N-1]
    AS
        (parallelperiod([DimTemps].[CalendarTime].[Year], -1, strtomember('[DimTemps].[CalendarTime].&[' + CStr(@ParamAnnee) + ']')), [Measures].[MesureAAfficher])
     
    SELECT ...

  5. #5
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    Je ne vois pas comment je peux faire pour baser mon année d'exercice sur ma dimension de temps.
    J'ai une table dimExercice dans laquelle j'ai:
    id Année Société
    1 2000 Société1
    2 2001 Société1
    3 2002 Société1
    ...

    Dans ma table de fait j'ai
    IdFact IdExercice IdProduit MntVente
    1 1 1 1000
    2 1 2 2000
    3 1 3 3000
    4 2 1 10000
    5 2 2 20000
    6 3 1 10000000
    7 3 2 20000000
    ...

    Je ne vois pas comment faire pour rattacher ca à ma dimension de temps, ou alors faudrait tout exploser et là ca devient chaud...Trop d'impacts...
    Je tiens à signaler que j'ai récupérer le projet comme ca...

    Sinon j'ai tj l'option de faire ca dans SSIS, mais ca m'aurait eviter de modifier mon package et mon datawarehouse... et puis c'est pas terrible comme solution...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Ok, ta dimension de temps est différente de ta dimension exercice. Est-ce qu'une année d'exercice correspond à une année de ta dimension de temps?

    Si ton paramètre te renvoie une une valeur de type "2000" (comme expliqué dans l'exemple donné précédemment), tu devrais pouvoir appliqué la technique que je t'ai exposée juste avant.

    Tu n'as pas à te préocuper des id de clés utilisés dans les tables. C'est le moteur OLAP qui se chargera de te renvoyer les bons enregistrements...

  7. #7
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    qd j'execute ma requete j'ai "Préparation de la requete en cours,pour annuler appuyer sur CTRL+C pendant au moins une demi seconde", et ca ne fait rien...

  8. #8
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Ca vérifie juste que la syntaxe de ta requête est correcte.
    Ensuite si tu n'as rien après exécution, c'est qu'il n'y a pas de retour de ta requête, c'est tout à fait possible.
    Alexandre Chemla - Consultant MS BI chez Masao

  9. #9
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    ca reste scotcher sur le message "Preparation de la requete..."
    Et j'ai un message d'erreur qd j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (parallelperiod([DimTemps].[CalendarTime].[Year], -1, strtomember('[DimTemps].[CalendarTime].&[' + CStr(@ParamAnnee) + ']')), [Measures].[MesureAAfficher])
    J'ai :
    DimTemps est introuvable dans le cube
    Alors effectivement dans mon cube la dimension des dates relatives aux ventes a été renommé en "Date de Vente"

    Mais dans ma source j'ai bien "DimTemps".

    Alors j'ai essayé en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (parallelperiod([Date de Vente].[CalendarTime].[Year], -1, strtomember('[Date de Vente].[CalendarTime].&[' + CStr(@ParamAnnee) + ']')), [Measures].[MesureAAfficher])
    J'ai pas de message d'erreur mais ca reste scotché sur le message "Preparation de la requete..."

    J'ai un doute sur [calendarTime].[Year], d'où ca sort? je ne le trouve pas dans ma dimension de temps...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Mon exemple partait du principe que tu avait une dimension de temps (dans ton cube, pas en source), s'appelant "DimTemps".

    Cette dimension contient une hiérarchie "CalendarTime" avec les niveau "Year", "Month" et "Date" par exemple.

    Il faut que tu adaptes les noms d'objets à ton cas particulier.

    De plus, il faut bien faire attention que ta dimension de temps soit bien de type "Time" (attribut "Type" de ta dimension).

    Les fonction de maninupalion des hiérarchie de temps (comme parallelperiod) ne fonctionne que si ta dimension est configurée correctement.

  11. #11
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    ok, donc si ma dimension de temps pour les dates de vente dans mon cube s'appelle "date de vente", avec des attributs "ANNEE", "DATE", "MOIS"...
    J'ai pas de hierarchie.
    Je devrais mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with member [Measures].[N1] as (parallelperiod([Date de vente].[ANNEE], -1, strtomember('[Date de vente].[ANNEE].&[' + CStr(@AnneeExercice) + ']')),  [Measures].[MNT Vente])
    ca devrait fonctionner?

  12. #12
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    Je viens de m'apercevoir que ma dimension de temps avait un type "regular"...
    Donc je l'ai mis en "Time"...
    Y a d'autres modifications à faire dans mon cube?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Il faut également spécifier le type de chaque attribut (comme pour la dimension).

    Donc "Année" aura le type "Year", "Mois" le type "Month", ...

    Par contre, "parallelperiod" prend en premier paramètre une expression de niveau. Donc, il faut que tu aies une hiérarchie de définie (je pense).

  14. #14
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    Donc j'ai fait tout ce que tu m'as dit...
    J'ai mis tous les type comme ca devait etre.
    J'ai créé une hiérarchie bidon dans laquelle je n'ai qu'un attribut "ANNEE"
    Et qd j'execute ma requete j'ai tj ce p***** de message "Requete en cours de préparation...." et ca scotche.
    Ma requete MDX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with member [Measures].[N1] as (parallelperiod([Date de Vente].[CalendarANNEE].[ANNEE], -1, strtomember('[Date de vente - Marché].[CalendarANNEE].[ANNEE].&[' + CStr(@DimExercice) + ']')),  [Measures].[MNT Vente
     
    SELECT NON EMPTY { [Measures].[N1] ,[Measures].[MNT Vente] } ON COLUMNS, 
    NON EMPTY { ([Dim Exercice ].[ETABLISSEMENT].[ETABLISSEMENT].ALLMEMBERS * [Dim Exercice].[EXERCICE].[EXERCICE].ALLMEMBERS * [Dim Produit].[NUMERO].[NUMERO].ALLMEMBERS * [Dim Produit].[LIBELLE].[LIBELLE].ALLMEMBERS * [Date de Vente].[DATE].[DATE].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS 
    FROM ( SELECT ( STRTOSET(@DimExercice, CONSTRAINED) ) ON COLUMNS 
    FROM [Cube]) CELL PROPERTIES VALUE, BACK_COLOR, FORE_COLOR, FORMATTED_VALUE, FORMAT_STRING, FONT_NAME, FONT_SIZE, FONT_FLAGS
    Y a un truc que je fais mal?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    Bon y a déjà un truc qui me saute aux yeux, c'est que le niveau que tu spécifie dans la fonction parallelperiod n'est pas bon par rapport à ce que tu mets dans ton "strtomember".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WITH member [Measures].[N1] AS (parallelperiod([Date de Vente].[CalendarANNEE].[ANNEE], -1, strtomember('[Date de vente - Marché].[CalendarANNEE].[ANNEE].&[' + CStr(@DimExercice) + ']')),  [Measures].[MNT Vente])
    Ca devrait plutôt être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      WITH member [Measures].[N1] AS (parallelperiod([Date de Vente].[CalendarANNEE].[ANNEE], -1, strtomember('[Date de vente].[CalendarANNEE].[ANNEE].&[' + CStr(@DimExercice) + ']')),  [Measures].[MNT Vente])
    Vérifie bien aussi les parenthèses ouvrantes et fermantes.

    Puis pour valider ta query, exécute là dans le Management Studio en remplaçant ton paramètre par une de ses valeurs (donc le @DimExercice par '2000' par exemple). C'est plus simple. Une fois qu'elle est bonne, tu la copies colle dans ton dataset SSRS en remettant le paramètre.

    J'ai également noté que tu fait beaucoup de crossjoin et plusieurs fois sur des attributs différents d'une même dimension. Ca ne me parait pas très bon pour les perfs (enfin, sauf si ton cube contient très peu de données). Essaie de t'arranger pour éviter ça.

    Ex: tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Dim Produit].[NUMERO].[NUMERO].ALLMEMBERS * [Dim Produit].[LIBELLE].[LIBELLE].ALLMEMBERS
    Je suppose que c'est pour récupérer le numéro du produit ainsi que son libellé... Tu pourrais probablement éviter cela en créant un membre calculé récupérant le libellé du produit grâce à une "member property". Ou tu pourrais encore configurer la propriété "keycolumn" du numéro de produit à "Numero" et la propriété "namecolumn" à "libellé".

    Idem pour ta dimension exercice. A ce niveau là, tu pourrais probablement créer une hiérarchie "Etablissement - Exercice" ou l'inverse qui t'éviterait de faire un crossjoin entre les 2 attributs puisque en SSRS, lorsque tu récupère un membre d'un niveau donné d'une hiérarchie, le query designer inclut automatiquement les parents de ce membre (enfin, le parent de chaque niveau supérieur au niveau récupéré par ta query).

  16. #16
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    merci pour toutes ces infos,je vais mettre ca en pratique...
    et si ca te derange pas je reviendrai vers toi pour te dire ce qu'il en est.

  17. #17
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    Je ne m'en sors pas...
    Ma requete boucle tj ...
    Je l'ai simplifiée au max et ca ne fonctionne tj pas.
    Ma requete mdx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    WITH MEMBER [Measures].[N1] as (parallelperiod([Date de Vente].[CalendarANNEE].[ANNEE],1))
     SELECT 
     NON EMPTY { [Measures].[MNT Vente],[Measures].[N1] } ON COLUMNS, 
     NON EMPTY { ([Dim Exercice].[EXERCICE].[EXERCICE].ALLMEMBERS * [Dim Produit].[NUMERO].[NUMERO].ALLMEMBERS * [Dim Tiers].[NOM TIERS].[NOM TIERS].ALLMEMBERS * [Date de vente].[DATE].[DATE].ALLMEMBERS ) } DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS 
    FROM [Win M9DW])
    Dans ma dimension "Dim Temps" j'ai un attribut "Dim Temps", comme dans toutes mes dimensions j'ai un attribut du meme nom que ma dimension.
    Cet attribut a une clé à coté de son nom dans l'onglet "Structure de la dimension" dans mon cube.
    Le "type" de cet attribut est à "regular", est-ce normal?
    Et "Usage" est à "key".

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    269
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 269
    Points : 339
    Points
    339
    Par défaut
    C'est normal, c'est l'attribut clé de dimension. Il est mappé sur la primary key de ta table source et par défaut, il prend le nom de la dimension.

    Tu as essayé d'exécuter ta requête dans le Management Studio?
    Est-ce que tu as une message d'erreur ou est-ce que la requête tourne et ton CPU est à fond?
    Est-ce que si tu enlèves la dimension de temps dans tous les crossjoin, tu obtiens un résultat?

  19. #19
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    j'ai testé dans SSMS, qd j'execute ma requete mon CPU s'emballe.
    qd je retire la dimension de temps dans le crossjoint, j'ai un résultat mais pas ma mesure N1...

  20. #20
    Membre actif
    Inscrit en
    Avril 2005
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 644
    Points : 254
    Points
    254
    Par défaut
    A chaque fois que je veux utiliser une fonction de temps je n'ai pas ma mesure.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With MEMBER [Measures].[YTD VENTE] AS 'Sum(PeriodsToDate([Date de Vente].[CALENDARANNEE].[ANNEE]),[Measures].[MNT Vente])'
     
    SELECT NON EMPTY { [Measures].[Vente],Measures].[YTD Salaries]   } ON COLUMNS, 
    NON EMPTY { ([Dim Produit].[PRODUIT].[PRODUIT].ALLMEMBERS } ON ROWS 
    FROM [Cube]
    Je n'ai que la mesure "Vente" qui est affiché dans mon résultat...
    La mesure "YTD VENTE" n'est pas affiché.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SSRS][2005][MDX] Left outer join en MDX
    Par geof dans le forum SSRS
    Réponses: 7
    Dernier message: 20/06/2008, 12h15
  2. Réponses: 2
    Dernier message: 17/06/2008, 09h52
  3. Réponses: 23
    Dernier message: 28/09/2007, 13h16
  4. [SQL SERVER 2005] comment créer une base de données ?
    Par Syrrus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/03/2007, 14h26
  5. [C#/SQL Server 2005] Comment créer une base de donnée par le code ?
    Par FraktaL dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/09/2006, 17h27

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