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

SSAS Discussion :

[2K8] afficher une mesure pour une ligne n'ayant pas de données dans le cube


Sujet :

SSAS

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut [2K8] afficher une mesure pour une ligne n'ayant pas de données dans le cube
    bonjour,

    J'ai la dimension TEMPS qui est liée avec un groupe de mesure G1.
    Ce groupe de mesure G1 est issu d'une table de fait ne contenant que les dates où il y a des données.

    L'option NullProcessing dans la relation entre la dimension TEMPS et le groupe de mesure G1 est : NullProcessing = preserved.

    En naviguant dans le cube, j'ai réussi à afficher les dates ne contenant pas de données et ce en utilisant les options des tableaux croisés dynamiques d'Excel.

    Bref, mon problème c'est que je veux afficher ma mesure M qui , bien évidemment, s'affiche nulle dans les lignes vides. Je voudrais bien que l'affichage soit comme suit (les dates rouges sont celles qui ne contenaient pas de données):
    ------------------Mesure M
    date1---------------X
    date2---------------X
    date3---------------X
    date4---------------Y
    date3---------------Y
    .....
    ..... et ainsi de suite


    Pour cela, j'ai ajouté un membre calculé M1 qui prend comme valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CASE 
        WHEN ISEMPTY([Measures].[M])
        THEN ([Measures].[M], LASTPERIODS(1,[TEMPS].[TEMPS ATMD].CURRENTMEMBER))
        ELSE [Measures].[M]
    END
    Mais ça m'affiche

    Merci de m'aider si vous avez une proposition.

  2. #2
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    L'expression a été affichée car j'ai utilisé la fonction LastPeriods() qui me donne le jour courant (CURRENTMEMBER et la jour J-1) or moi j'avais seulement besoin du jour J-1. Alors, j'ai utilisé la fonction ParallelPeriod() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CASE 
        WHEN ISEMPTY([Measures].[M])
        THEN ([Measures].[M],PARALLELPERIOD([TEMPS].[TEMPS ATMD].[Jour],1,[TEMPS].[TEMPS ATMD].CURRENTMEMBER))
        ELSE [Measures].[M]
    END
    Il n'a y a plus de messages d'erreur affichés mais ça m'affiche seulement la valeur de la mesure M de chaque 1ère ligne vide après une ligne contenant initialement des données:

    ------------------Mesure M
    date1---------------X
    date2---------------X
    date3---------------(case vide)
    date4---------------Y
    date5---------------Y
    date6---------------(case vide)

    Est ce que quelqu'un a une idée comment peut-on faire un membre calculé qui se calcule de manière récursive pour que toutes les mesures M vides seront affichées.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 70
    Points
    70
    Par défaut
    bonjour,

    quelle est la version de SQL Server que tu utilises ?

    Dans la version Entreprise, tu peux utiliser les mesures semi additives, qui s'agrègent classiquement sur tous les axes sauf sur l'axe temps, sur lequel tu peux récupérer la dernière valeur non vide : LastNonEmpty. (Agregate Function)

    il me semble aussi qu'au préalable tu dois positionner ta dimension Temps sur le type TIME.


    Cordialement,
    Jo

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Tout d'abord merci pour votre réponse.

    Concernant la version, je travaille bien avec la version Entreprise et ma mesure M est déjà une mesure semi additive (LastNonEmpty). Et cela fera l'affaire quand on passe à un niveau d'agrégation plus élevé que le JOUR (qui est mon niveau le plus bas dans ma dimension TEMPS).

    Mon problème est d'afficher cette mesure pour les jours qui ne contenaient pas de données (comme je l'ai expliqué dans les msg ci-dessus).

    En tout cas, mnt je cherche comment récupérer la mesure du 1er jour qui précède chaque jour ne possédant pas de valeurs.

    Je vous tiendrai courant dès que ça aboutit à un résultat satisfaisant. (je l'espère! )

  5. #5
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 70
    Points
    70
    Par défaut
    oui bien sûr, j'ai répondu un peu trop vite !!

    du coup, ne serait ce pas plutôt une problématique d'alimentation, en essayant d'alimenter une valeur pour chaque date ?

    Cordialement,
    Jo

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonsoir,

    J'ai pas compris qu'est ce que vous voulez dire par problématique d'alimentation...

    sinon j'ai réussi à afficher le résultat en testant sur un exemple de date quelconque (04/07/2010) à l'aide d'une requête MDX:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT	{TOPCOUNT(
    				ORDER(
    					FILTER(
    						FILTER(
    							{DRILLUPMEMBER([TEMPS].[TEMPS ATMD].[Jour],[TEMPS].[TEMPS ATMD].[Année].&[2010].&[Trimestre3].&[7].&[2010-07-04T00:00:00])},
    							NOT ISEMPTY([Measures].[M])),
    						[TEMPS].[TEMPS ATMD].CURRENTMEMBER.MEMBERVALUE < [TEMPS].[TEMPS ATMD].[Année].&[2010].&[Trimestre3].&[7].&[2010-07-04T00:00:00].MEMBERVALUE),
    					[TEMPS].[TEMPS ATMD].CURRENTMEMBER.MEMBERVALUE,
    					DESC),
    				1)} ON 0 ,
    		{[Measures].[M]} ON 1
    FROM [MonCube]
    Sachant que les données de mon cubes sont comme suit:


    le résultat de ma requête est bien:



    Mon problème maintenant c'est comment pourrai je créer un membre calculé qui traduit ça sachant que j'aurai 2 dates différentes (CURRENTMEMBER) une qui correspond à l'exemple (04/07/2010) et une autre qui correspond à chaque date de l'ensemble sélectionné par la fonction DRILLUPMEMBER() .

  7. #7
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 70
    Points
    70
    Par défaut
    quand je parle d'alimentation, je veux parler du chargement des données de ta table de faits. Si tu arrives à mettre des données sur chaque date selon la règle de gestion que tu souhaites, ta restitution dans ton cube, sera du coup directe. Peut-être qu'en terme de perf ce serait mieux non ?

    c'est d'ailleurs un sujet que j'avais déjà soulevé ici : Valeur sur la dernière date connue, j'ai l'impression qu'au final, nous avons la même problématique

    Cordialement,

    Jo

  8. #8
    Membre émérite Avatar de FrancoisJehl
    Homme Profil pro
    BI Engineer
    Inscrit en
    Juillet 2009
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : BI Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 485
    Points : 2 883
    Points
    2 883
    Par défaut
    Et sinon un bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MEMBER M1
    AS Iif
    (
    	IsEmpty([Measures].[Order Count]) and [Date].[Calendar].CurrentMember.Level.Ordinal = 5,
    	[Date].[Calendar].PrevMember,
    	[Measures].[Order Count]
    )
    du genre de ce qu'on utilise pour émuler le LastNonEmpty en standard ne marcherait pas?

  9. #9
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par loggti Voir le message
    quand je parle d'alimentation, je veux parler du chargement des données de ta table de faits. Si tu arrives à mettre des données sur chaque date selon la règle de gestion que tu souhaites, ta restitution dans ton cube, sera du coup directe. Peut-être qu'en terme de perf ce serait mieux non ?

    c'est d'ailleurs un sujet que j'avais déjà soulevé ici : Valeur sur la dernière date connue, j'ai l'impression qu'au final, nous avons la même problématique

    Cordialement,

    Jo
    En fait ma table de fait correspond aux mouvements de stock et elle est traitée quotidiennement. Donc si je vais l'alimenter de façon à ce que j'obtiendrais tous les jours ça va être pénalisant en termes de performance d'alimentation et de volumétrie de données.

    ça sera l'idéal si c'est traité au niveau cube.

    sinon je t'ai proposé une solution pour ton problème récupération de la valeur de la dernière date connue. j'espère que ca sera utile.

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par FrancoisJehl Voir le message
    Et sinon un bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MEMBER M1
    AS Iif
    (
    	IsEmpty([Measures].[Order Count]) and [Date].[Calendar].CurrentMember.Level.Ordinal = 5,
    	[Date].[Calendar].PrevMember,
    	[Measures].[Order Count]
    )
    du genre de ce qu'on utilise pour émuler le LastNonEmpty en standard ne marcherait pas?
    J'ai déjà essayé avec PrevMember mais ça ne résout pas le Pbm quand on a plusieurs dates successives où la mesure est vide.

  11. #11
    Membre émérite Avatar de FrancoisJehl
    Homme Profil pro
    BI Engineer
    Inscrit en
    Juillet 2009
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : BI Engineer
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2009
    Messages : 1 485
    Points : 2 883
    Points
    2 883
    Par défaut
    Bah sauf si j'ai rien compris non: ton PrevMember va réévaluer à chaque fois a priori (quand il est vide il cherche le prev etc...). Si tu testes ce membre là sur Adventure Works tu verras qu'il adresse et remplit le mois de novembre 2006 sans données par exemple.

  12. #12
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 70
    Points
    70
    Par défaut
    ce ne serait pas un problème de récursivité ici ?

    Sinon, vous ne pensez pas que ce genre de traitement pourrait avoir un impact non négligeable sur les performances en restitution ?

    c'est vrai qu'une requête d'alimentation serait également bien pénalisante lors du chargement des données, mais au final, ne vaut il pas mieux "bichonner" nos utilisateurs pour que les restits soient "quasi" instantanées ?

    Cordialement,
    Jo

  13. #13
    Futur Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Re,

    Enfin, c'est résolu.

    Voilà mon membre calculé récursivement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Iif
    	(
    		not IsEmpty([Measures].[M]) ,
    		[Measures].[M],
    		[TEMPS].[TEMPS ATMD].PrevMember
    	)
    Par contre, si je fais (comme vous m'avez dit FrancoisJehl) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Iif
    	(
    		IsEmpty([Measures].[M]) ,
                    [TEMPS].[TEMPS ATMD].PrevMember,
    		[Measures].[M]
     
    	)
    ça marche pas et ça me donne que des valeurs null

    Je vous remercie pour vos interventions.

    A bientôt

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. afficher une mesure pour l'année n et année n-1
    Par alaabed dans le forum Cognos
    Réponses: 2
    Dernier message: 25/11/2010, 09h39
  3. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  4. afficher des entêtes pour les lignes d'une jtable
    Par minanoun dans le forum Composants
    Réponses: 4
    Dernier message: 13/04/2009, 02h14
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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