Relever les défis subtils liés à la dimension temporelle dans MDX : une étude de cas multihiérarchique

Nathalie Leroy
Nathalie Leroy
March 21, 2025

Il s'agit d'un exemple MDX très avancé rencontré chez l'un de nos clients. Notez qu'il utilise une fonctionnalité d'icCube qui permet à un tuple d'avoir la même hiérarchie définie plusieurs fois.

TABLE DES MATIÈRES
Cubes roses générés par Grok AI
OLAP
Analyses

Nous présentons ici un exemple de MDX très avancé que nous avons rencontré chez l'un de nos clients. Notez qu'il utilise une fonctionnalité d'icCube qui permet à un tuple d'avoir la même hiérarchie définie plusieurs fois.

Le cas d'utilisation

Le cas d'utilisation implique plusieurs hiérarchies temporelles au sein d'une seule dimension temporelle de manière non standard.

La structure simplifiée est la suivante :

  • Dimension : Calendrier
    • Hiérarchie : Année
      • Niveau : Année
    • Hiérarchie : Période
      • Niveau : Valeur de la période (PV)
      • Niveau : Période (P)

Exemple de hiérarchie des périodes (enfants PV et P) :

  • 1
    • P1 2024
    • P1 2025
    • P1 2026
  • 2
    • P2 2024
    • P2 2025
    • P2 2026
  • ...

L'objectif est de calculer les ventes de l'année précédente tout en affichant l'année, la valeur nominale et P. Voici la requête initiale :

WITH

MEMBER [Measures].[Sales Prev Year] AS ([Calendar].[Year].currentMember.prevMember,  [Measures].[Sales])

SELECT

{ [Measures].[Sales], [Measures].[Sales Prev Year] } on 0

[Calendar].[Year].[Year] *

[Calendar].[Period].[PV] *

[Calendar].[Period].[P] on 1

[Product].[Product].[Product] on 2

FROM [Cube]

Dans notre exemple, nous cherchons quelque chose comme :

2024 2025
P1 2024 P1 2025
Sales Sales Prev-Year Sales Sales Prev-Year
Product 1 8 5 10 8

Mais ce que nous avons obtenu :

2024 2025
P1 2024 P1 2025
Sales Sales Prev-Year Sales Sales Prev-Year
Product 1 8 <empty> 10 <empty>

Que s'est-il passé ici ?

L'année et la période étant des hiérarchies distinctes, l'expression

([Calendar].[Year].currentMember.prevMember,  [Measures].[Sales])

devient (après complétion à partir du contexte défini par les axes) :

([Calendar].[Year].currentMember.prevMember, [Calendar].[Period].[PV].[1], [Calendar].[Period].[P].[P1 2025], [Measures].[Sales])

Pourquoi ?

MDX a conservé le contexte actuel de [P1 2025] depuis l'axe, en l'associant à l'année précédente [2024]. Étant donné que [P1 2025] n'existe pas sous [Year].[2024] dans le cube, le résultat était au lieu de 8.

Nous avons obtenu :

  • Actuel: ([Calendar].[Year].[2024], [Calendar].[Period].[PV].[1], [Calendar].[Period].[P].[P1 2025], [Measures].[Sales])
  • Attendu: ([Calendar].[Year].[2024], [Calendar].[Period].[PV].[1], [Measures].[Sales])

Visuellement :

  • Actuel : prevMember de [2025] * [1] * [P1 2025] est devenu [2024] * [1] * [P1 2025]
  • Attendu : prevMember de [2025] * [1] * [P1 2025] devrait être [2024] * [1] (ce qui correspond à [2024] * [1] * [P1 2024] car il n’y a qu’un seul enfant [P] de [PV] pour chaque année. Ceci est dû à la construction de la hiérarchie).

Ce que nous devons faire

Garder [Calendar].[Period].[PV].[1] et réinitialiser [Calendar].[Period].[P].[P1 2025]

Solution

Spécifiez le CurrentMember de la période pour remplacer la valeur par défaut :

WITH
 MEMBER [Measures].[Sales Prev Year] AS ([Calendar].[Year].currentMember.prevMember, [Calendar].[Period].currentMember(0), [Measures].[Sales])‍

SELECT
 { [Measures].[Sales], [Measures].[Sales Prev Year] } on 0
 [Calendar].[Year].[Year] * [Calendar].[Period].[PV] * [Calendar].[Period].[P] on 1
 [Product].[Product].[Product] on 2
FROM [Cube]

Comme on peut le lire dans la doc currentMember:

Depuis icCube 4.8, cette fonction renvoie un ensemble de membres si le tuple contient deux membres de la même hiérarchie. Cette fonctionnalité nécessite que la propriété icCube 'DimensionalityCheck' soit définie sur false.

C’est pourquoi nous devons récupérer [Calendar].[Period].currentMember(0)

Donc, (0) correspond au premier élément qui est [Calendar].[Period].[PV].[1]. Ce faisant, cela remplace tous les autres membres de la hiérarchie, réinitialisant ainsi [Calendar].[Period].[P].[P1 2025].

Points à prendre en compte :

  • Vous pouvez utiliser la même hiérarchie sur un ou plusieurs axes, mais cela peut compliquer vos calculs.
  • Dans ce scénario, currentMember renvoie un set.

Ce scénario subtil et avancé met en évidence la façon dont les interactions hiérarchiques peuvent fausser silencieusement les résultats. Des outils tels qu'un Débogueur MDX sont d'une valeur inestimable pour suivre ces calculs étape par étape.

Vous trouvez nos Articles utiles ?
Abonnez-vous pour ne Jamais en Manquer un !