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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : décembre 2011
    Messages : 2
    Points : 1
    Points
    1

    Par défaut Comment filtrer un cube sur une période ?

    Bonjour,

    Je souhaite filtrer un cube sur une période donnée.

    Au départ, j'avais créé dans mon cube une dimension de type "TimeDimension" avec 4 niveaux (Année, Trimestre, Mois et Jour), et je filtrais ainsi :

    WITH MEMBER [Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${jourdebut}/${moisdebut}/${anneedebut} au ${jourfin}/${moisfin}/${anneefin}] AS
    Aggregate([Date].[Toutes les dates].[${anneedebut}].[${quarterdebut}].[${moisdebut}].[${jourdebut}] : [Date].[Toutes les dates].[${anneefin}].[${quarterfin}].[${moisfin}].[${jourfin}])
    select NON EMPTY {[Measures].[Nombre 1], [Measures].[Nombre 2]} ON COLUMNS,
    NON EMPTY {[Zone].[Toutes les zones]} ON ROWS
    from [MonCube]
    where ([Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${jourdebut}/${moisdebut}/${anneedebut} au ${jourfin}/${moisfin}/${anneefin}])


    Chaque paramètre ${x} est le résultat d'une sélection d'un paramètre de mon appli (SpagoBI en l’occurrence).
    Cela marchait bien.

    Le problème est que pour arriver à ce résultat, l'utilisateur doit renseigner 8 paramètres. C'est donc beaucoup trop lourd.
    L'idée est donc de ne sélectionner en entrée qu'une date de début et de fin.

    J'ai donc créé une nouvelle dimension avec seulement le champs date qui est de type String (car le type date ne passe pas avec ma BD - Sybase IQ -). Ce champ s'écrit ainsi : "2011-05-30".
    J'ai donc pensé parser le résultat du paramètre avec la fonction 'Mid'. Et je me suis dit que j'allais adapter ma requête MDX ainsi :

    WITH MEMBER [Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${datedebut} au ${datefin}] AS
    Aggregate([Date].[Toutes les dates].['Mid(${datedebut},1,4)'].[A calculer].['Mid(${datedebut},6,2)'].['Mid(${datedebut},9,2)'] : [Date].[Toutes les dates].['Mid(${datefin},1,4)'].[A calculer].['Mid(${datefin},6,2)'].['Mid(${datefin},9,2)]')
    select NON EMPTY {[Measures].[Nombre 1], [Measures].[Nombre 2]} ON COLUMNS,
    NON EMPTY {[Zone].[Toutes les zones]} ON ROWS
    from [MonCube]
    where ([Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${datedebut} au ${datefin}])


    La fonction Mid récupère bien l'année, le mois et jour (pour le quarter, je m'en sortirai avec des Iif). En revanche, la requête MDX ne récupère pas le résultat de la fonction, mais la fonction entière.

    Par exemple, si mon paramètre $datedebut="2011-05-30" et $datefin="2011-06-30", alors la requête MDX est :
    WITH MEMBER [Date].[Toutes les dates].[annee].[quarter].[mois].[Du 2011-05-30 au 2011-06-30}] AS
    Aggregate([Date].[Toutes les dates].['Mid(2011-05-30,1,4)'].[A calculer].['Mid(2011-05-30,6,2)'].['Mid(2011-05-30,9,2)'] : [Date].[Toutes les dates].['Mid(2011-06-30,1,4)'].[A calculer].['Mid(2011-06-30,6,2)'].['Mid(2011-06-30,9,2)'])
    select NON EMPTY {[Measures].[Nombre 1], [Measures].[Nombre 2]} ON COLUMNS,
    NON EMPTY {[Zone].[Toutes les zones]} ON ROWS
    from [MonCube]
    where ([Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${datedebut} au ${datefin}])


    mais j'ai l'erreur suivante :
    Mondrian Error:Failed to parse query 'WITH MEMBER[Date].[Toutes les dates].[annee].[quarter].[mois].[Du 2011-05-30 au 2011-06-30}] as Aggregate([Date].[Toutes les dates].['Mid("2011-05-30",1,4)'].[Trimestre 2].['Mid("2011-05-30",6,2)'].['Mid("2011-05-30",9,2)'])

    Evidemment l'année 'Mid("2011-05-30",1,4)' n'existe pas dans mon cube. C'est bien l'année 2011 qui existe.
    La fonction Mid me renvoie les bons résultats ('Mid("2011-05-30",1,4)'=2011, 'Mid("2011-05-30",6,2)'=05, 'Mid("2011-05-30",9,2)'=30).

    Il faudrait que le résultat de la requête MDX soit :
    WITH MEMBER [Date].[Toutes les dates].[annee].[quarter].[mois].[Du 2011-05-30 au 2011-06-30}] AS
    Aggregate([Date].[Toutes les dates].[2011].[A calculer].[05].[30] : [Date].[Toutes les dates].[2011].[A calculer].[06].[30])
    select NON EMPTY {[Measures].[Nombre 1], [Measures].[Nombre 2]} ON COLUMNS,
    NON EMPTY {[Zone].[Toutes les zones]} ON ROWS
    from [MonCube]
    where ([Date].[Toutes les dates].[annee].[quarter].[mois].[Du ${datedebut} au ${datefin}])


    Le problème vient du fait que ma fonction est à l'intérieur d'un membre de ma dimension. Il faudrait que j'arrive à échapper ma fonction pour qu'elle soit exécutée avant l'exécution de la requête MDX.

    Quelle est alors la bonne syntaxe ? J'ai essayé avec le & ([Date].[Toutes les dates].&['Mid("2011-05-30",1,4)']), avec des +, ...
    Mais rien n'y fait.

    Merci de votre aide.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : décembre 2011
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    En fait, je croyais que pour filtrer sur une période, il fallait que la dimension portant sur les dates soit de type 'TimeDimension'.
    Mais ce n'est pas la peine. Une Dimension standard suffit.
    J'ai donc ajouté le niveau 'Date' dans ma dimension Date, et effectué le filtre sur la période avec :

    WITH MEMBER [Date].[Toutes les dates].[annee].[quarter].[mois].[jour].[Du ${datedebut} au ${datefin}] AS
    Aggregate([Date].[Date].[${datedebut}] : [Date].[Date].[${datefin}])
    select NON EMPTY {[Measures].[Nombre 1], [Measures].[Nombre 2]} ON COLUMNS,
    NON EMPTY {[Zone].[Toutes les zones]} ON ROWS
    from [MonCube]
    where ([Date].[Toutes les dates].[annee].[quarter].[mois].[jour].[Du ${datedebut} au ${datefin}])

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    juin 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 1
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    Alors voila, je suis confronté au même problème que toi, c'est à dire faire une requête sur une période spécifiée et j'aurai plusieurs questions concernant ta solution.

    1) Tu dis avoir créé un niveau "Date" dans ta dimension "Date" mais comment l'as tu créé (avec quelles options etc) et à quoi te sert-t-il?

    2) Quand tu écris "Du ${datedebut} au ${datefin}" quel est le format de tes deux dates?

    3) J'avais une solution ici mais elle ne fonctionnait que si les dates existaient dans mon cube, sinon j'avais une erreur "La Date n'existe pas". Ta solution permet-elle de d'enlever ce problème?

    Voila j'espère que tu pourras répondre à mes questions et te remercie d'avance. Bonne journée

Discussions similaires

  1. [WebI Xi3] Comment calculer une variation sur une période glissante ?
    Par Sites dans le forum Débuter
    Réponses: 3
    Dernier message: 05/07/2011, 15h34
  2. Comment filtrer des lignes sur la valeur d'une colonne
    Par BerBiX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/06/2010, 13h46
  3. [AC-2003] Comment filtrer un formulaire sur une date ?
    Par Ric500 dans le forum IHM
    Réponses: 2
    Dernier message: 31/03/2010, 10h41
  4. Réponses: 9
    Dernier message: 19/11/2009, 17h12
  5. Réponses: 3
    Dernier message: 12/07/2006, 09h13

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