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.