28 Ecrire des requêtes MDX

MDX est un langage de type SQL que vous pouvez utiliser pour émettre des requêtes qui extraient des données d'Essbase. MDX est également utilisé pour définir des formules sur des cubes ASO, interroger des métadonnées, qualifier des noms de membre et délimiter des sous-ensembles de données ou de métadonnées. La meilleure façon d'apprendre MDX est d'écrire des requêtes.

Cette section vous aide à apprendre MDX en écrivant des requêtes sur le cube Sample Basic dans une série d'exercices.

Prérequis pour l'écriture des requêtes MDX

Pour effectuer les exercices, vous aurez besoin des éléments suivants :

Créer un modèle de requête MDX

Découvrez le format de base d'une requête MDX, afin de commencer à utiliser MDX avec Essbase. Comme pour les instructions SQL, les requêtes MDX commencent généralement par SELECT.

Dans cette section, vous allez créer un modèle à utiliser comme base pour le développement de requêtes MDX simples.

La plupart des requêtes peuvent être construites sur la structure grammaticale suivante :

SELECT
  {}
ON COLUMNS
FROM Sample.Basic

SELECT à la ligne 1 est le mot-clé qui commence le corps principal des instructions MDX.

Les accolades { } à la ligne 2 constituent un espace réservé pour un ensemble. Dans la requête ci-dessus, l'ensemble est vide, mais les accolades restent comme espace réservé.

Exercice 1 : Créer un modèle de requête MDX

Pour créer un modèle de requête :

  1. Créez un dossier pour stocker les requêtes échantillon qui peuvent être exécutées sur le cube Sample.Basic.

  2. A l'aide d'un éditeur de texte, saisissez le code suivant dans un fichier vide :

    SELECT
      {}
    ON COLUMNS
    FROM Sample.Basic
  3. Enregistrez le fichier sous le nom qry_blank.txt.

Ensembles et tuples MDX

Les ensembles MDX contiennent des uplets et les tuples MDX contiennent des noms de membre. Découvrez la différence entre les ensembles, les tuples et les noms de membre, et comment ils s'intègrent aux requêtes MDX Essbase.

Ecrivez votre première requête et exécutez-la dans le client MaxL pour extraire certaines données du cube Sample Basic.

Ensembles

Un ensemble MDX peut être vide, être un ensemble de tuples ou un ensemble d'ensembles.

Par exemple, l'ensemble suivant est vide.

{ }

Un ensemble doit être placé entre accolades {}, sauf dans les cas où l'ensemble est représenté par une fonction MDX qui renvoie un ensemble (plus d'informations sur les fonctions ultérieurement).

Ce qui suit est un ensemble composé d'un tuple.


  {[Cola]}

Dans la requête suivante, {([Cola], [Actual])} est également un ensemble composé d'un tuple, bien que dans ce cas, le tuple ait plusieurs noms de membre.

SELECT
  {([Cola], [Actual])}
ON COLUMNS
FROM Sample.Basic

{([Cola], [Actual])} est un tuple composé de deux membres (Cola et Actual) de deux dimensions (Product et Scenario).

Règle de dimensionnalité

Lorsqu'un ensemble comporte plusieurs tuples, les membres de chaque tuple doivent représenter les mêmes dimensions Essbase, dans le même ordre. Autrement dit, tous les tuples doivent avoir la même dimensionnalité que les autres.

  • OK : L'ensemble suivant se compose de deux tuples de même dimensionnalité :

    {(West, Feb), (East, Mar)}
  • Non OK : le jeu suivant enfreint la règle de dimensionnalité, car Feb et Sales proviennent de dimensions différentes :

    {(West, Feb), (East, Sales)}
  • Non OK : l'ensemble suivant rompt la règle de dimensionnalité, car bien que les deux tuples contiennent les mêmes dimensions, l'ordre des dimensions est inversé dans le deuxième tuple :

    {(West, Feb), (Mar, East)}

Tuples et noms de membre

Un uplet est un moyen de faire référence à un membre ou à une combinaison de membres de n'importe quel nombre de dimensions. Par exemple, dans le cube Sample.Basic, tous les tuples suivants sont valides :

  • Jan
  • (Jan, Sales)
  • ([Jan],[Sales],[Cola],[Utah],[Actual])

Les noms de membre peuvent être indiqués de l'une des manières suivantes :

  • En spécifiant le nom réel ou l'alias, par exemple :

    • Cola

    • Actual

    • COGS

    • [100]

    Si le nom du membre commence par un nombre ou contient des espaces, il doit être placé entre crochets (par exemple, [100] ou [New York]). Toutefois, les accolades de nom de membre sont recommandées pour tous les noms de membre, pour plus de clarté et de lisibilité du code.

    Si le nom de membre commence par une esperluette (&), il doit être placé entre guillemets ; par exemple, ["&xyz"]. En effet, l'esperluette de début est réservée aux variables de substitution (reportez-vous à Variables dans les requêtes MDX). Vous pouvez également l'indiquer en tant que StrToMbr("&100").

    Pour les membres d'attribut, le nom long (qualifié pour identifier de manière unique le membre) doit être utilisé ; par exemple, [Ounces_12] au lieu de [12].

  • En indiquant le nom de dimension ou l'un des noms de membre ancêtre comme préfixe du nom de membre (par exemple, [Product].[100-10] et [Diet].[100-10]). Cet exercice est recommandé pour tous les noms de membre, car il élimine les ambiguïtés et permet de référencer avec précision les membres partagés. Voir : "Membres qualifiés en différenciant ancêtre" dans la rubrique Noms de membre en double dans les profils.

    Remarques :

    N'utilisez pas plusieurs ancêtres dans la qualification de nom de membre. Essbase renvoie une erreur si plusieurs ancêtres sont inclus. Par exemple, [Market].[New York] et [East].[New York] sont des noms valides pour New York. Cependant, [Market].[East].[New York] renvoie une erreur.

  • En spécifiant le nom d'un membre calculé défini dans la section WITH.

Exercice 2 : Exécuter la première requête

Rappelons que les accolades {} à la ligne 2 de votre modèle de requête sont un espace réservé pour un ensemble. Dans cet exercice, nous allons ajouter un ensemble à la requête et l'exécuter.

Pour exécuter la requête, vous devez :

  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé à partir de Créer un modèle de requête MDX.

  2. Comme un ensemble peut être aussi simple qu'un tuple, ajoutez le tuple entre accolades { } qui contient l'ensemble.

    Saisissez [Jan] entre accolades { } à la ligne 2 :

    SELECT 
      {[Jan]}
    ON COLUMNS
    FROM Sample.Basic
  3. Enregistrez la requête sous le nom qry_first.txt.

  4. Vérifiez qu'Essbase est en cours d'exécution.

  5. Démarrez le client MaxL et connectez-vous avec un nom d'utilisateur et un mot de passe valides. Exemple :

    login admin1 my_Pa55w0rD on "https://myserver.example.com:9001/essbase/agent";
  6. Copiez et collez l'intégralité de la requête SELECT dans le client MaxL, mais n'appuyez pas encore sur Entrée.

  7. Entrez un point-virgule à la fin, n'importe où après Basic, mais avant d'appuyer sur Entrée. (Le point-virgule n'est pas une exigence MDX, mais requis par le client MaxL pour indiquer la fin d'une instruction).

  8. Appuyez sur Entrée pour envoyer la requête à Essbase.

    Les résultats doivent être similaires aux suivants :

    Jan
      8024

Présentation de requête MDX avec axes et spécification de cube

Un axe MDX est une instruction qui met en forme la présentation de grille des résultats de requête à partir d'un cube Essbase. ON COLUMNS et ON ROWS sont des mots-clés d'axe qui décrivent où les résultats doivent apparaître. Une spécification de cube inclut le mot-clé FROM et indique à Essbase le cube à interroger.

Axe MDX

Les axes s'adaptent aux requêtes MDX après la sélection :

SELECT <axis> [, <axis>...]
FROM <database> 

Dans la requête suivante, la spécification d'axe est {Jan} ON COLUMNS :

SELECT
  {Jan} ON COLUMNS
FROM Sample.Basic

Au moins un axe doit être spécifié dans une requête MDX.

Jusqu'à 64 axes peuvent être indiqués, en commençant par AXIS(0) et en continuant avec AXIS(1)... AXE(63). L'utilisation de plus de trois axes est rare. L'ordre des axes n'est pas important. Toutefois, lorsqu'un ensemble d'axes 0 à n est spécifié, aucun axe compris entre 0 et n ne doit être ignoré. En outre, une dimension ne peut pas apparaître sur plusieurs axes.

Les cinq premiers axes ont des alias de mot-clé, comme indiqué dans le tableau suivant :

Tableau 28-1 Alias de mot-clé Axes

Alias de mot-clé Axes Axes

SUR LES COLONNES

Peut être utilisé à la place d'AXIS(0)

SUR LES LIGNES

Peut remplacer AXIS(1)

SUR LES PAGES

Peut remplacer AXIS(2)

SUR LES CHAPITRES

Peut remplacer AXIS(3)

SUR LES SECTIONS

Peut remplacer AXIS(4)

Spécification du cube MDX

Une spécification de cube est la partie de la requête qui détermine quelle base de données Essbase est interrogée. La spécification de cube s'intègre dans une requête MDX comme suit :

SELECT <axis> [, <axis>...]
FROM <cube> 

La section <cube> suit le mot-clé FROM et doit être composée d'identificateurs délimités ou non qui spécifient d'abord un nom d'application, puis un nom de base de données. Par exemple, les spécifications suivantes sont valides :

  • FROM Sample.Basic

  • FROM [Sample.Basic]

  • FROM [Sample].[Basic]

  • FROM'Sample'.'Basic'

Exercice 3 : Exécuter une requête à deux axes

Pour exécuter une requête à deux axes :

  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé dans Créer un modèle de requête MDX.

  2. Ajoutez une virgule après ON COLUMNS, puis ajoutez un espace réservé pour un deuxième axe en ajoutant ON ROWS :

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. Enregistrez le nouveau modèle de requête sous le nom qry_blank_2ax.txt.

  4. En tant que spécification définie pour l'axe de colonne, entrez les membres Product 100-10 et 100-20. Exemple :

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic

    Etant donné que ces noms de membre contiennent des caractères spéciaux, vous devez utiliser des crochets. La convention utilisée ici, pour placer tous les noms de membre entre crochets même s'ils ne contiennent pas de caractères spéciaux, est recommandée.

  5. En tant que spécification définie pour l'axe de ligne, entrez les membres Year Qtr1 à Qtr4.

    SELECT
      {[100-10],[100-20]}
    ON COLUMNS,
      {[Qtr1],[Qtr2],[Qtr3],[Qtr4]}
    ON ROWS
    FROM Sample.Basic
  6. Enregistrez la requête sous le nom qry_2ax.txt.

  7. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

Les résultats de l'interrogation doivent se présenter comme suit :

Tableau 28-2 Résultats : Exécution d'une requête à deux axes

L'image d'un espace est utilisée pour vider les cellules 100-10 20/100

Qtr1

5 096

1 359

Trim 2

5 892

1 534

Trimestre3

6 583

1 528

Trim4

5 206

1 287

Exercice 4 : Interroger plusieurs dimensions sur un même axe

Pour interroger plusieurs dimensions sur un même axe :

  1. Ouvrez qry_blank_2ax.txt, le modèle de requête que vous avez créé dans l'exercice précédent.

  2. Sur l'axe des colonnes, spécifiez deux tuples, chacun étant une combinaison de membres plutôt qu'un seul membre. Placez chaque tuple entre parenthèses car plusieurs membres sont représentés dans chaque tuple.

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  3. Sur l'axe des lignes, indiquez quatre tuples à deux membres, imbriqués chaque trimestre avec profit :

    SELECT
      {([100-10],[East]), ([100-20],[East])}
    ON COLUMNS,
      {
      ([Qtr1],[Profit]), ([Qtr2],[Profit]),
      ([Qtr3],[Profit]), ([Qtr4],[Profit])
      }
    ON ROWS
    FROM Sample.Basic
  4. Enregistrez la requête sous le nom qry_1ax.txt.

  5. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Les résultats doivent être similaires aux suivants :

    Tableau 28-3 Résultats : Interrogation de plusieurs dimensions sur un seul axe

    L'image d'un espace est utilisée pour vider les cellules L'image d'un espace est utilisée pour vider les cellules 100-10 20/100
    L'image d'un espace est utilisée pour vider les cellules L'image d'un espace est utilisée pour vider les cellules

    East

    East

    Qtr1

    Profit

    2 461

    212

    Trim 2

    Profit

    2 490

    303

    Trimestre3

    Profit

    3 298

    312

    Trim4

    Profit

    2 430

    287

Utiliser les fonctions MDX pour créer des ensembles

Vous pouvez utiliser les fonctions MDX pour travailler sur des métadonnées ou des données Essbase. Les fonctions peuvent renvoyer des membres, des ensembles, des valeurs, des tuples ou des chaînes. Ils sont utiles que vous utilisiez MDX pour analyser, mettre à jour ou exporter des données.

Apprenez à utiliser les fonctions MemberRange et CrossJoin en effectuant les exercices.

Cette introduction aux fonctions MDX se concentre sur quelques fonctions qui génèrent des ensembles. Plutôt que d'entrer manuellement des ensembles membre par membre ou tuple par tuple dans une requête MDX, vous pouvez remplacer ces énumérations par une expression de fonction simple. Les fonctions MDX peuvent renvoyer des jeux, ainsi que d'autres valeurs.

Par exemple, Children est une fonction définie. Elle renvoie l'ensemble des membres enfant du membre d'entrée. Par conséquent, Children(Qtr1) renvoie {Jan, Feb, Mar}.

Les exercices qui suivent peuvent vous aider à apprendre à utiliser les fonctions MDX dans des requêtes simples. Une référence complète des fonctions MDX prises en charge par Essbase est répertoriée dans la liste des fonctions MDX.

Exercice 5 : Utiliser la fonction MemberRange

La fonction MDX de MemberRange renvoie une plage de membres incluant et entre deux membres spécifiés de la même génération. Sa syntaxe est la suivante :

MemberRange (<member1>, <member2>, [,<layertype>])

où le premier argument que vous fournissez est le membre qui commence la plage, et le deuxième argument est le membre qui termine la plage. L'argument layertype est facultatif.

Remarques :

Une autre syntaxe pour MemberRange consiste à utiliser le signe deux-points entre les deux membres, au lieu d'utiliser le nom de fonction : member1 : member2.

Pour utiliser la fonction MemberRange :

  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé dans Créer un modèle de requête MDX.

  2. Supprimez les accolades {}, qui ne sont pas nécessaires lorsque vous utilisez une fonction pour renvoyer l'ensemble.

  3. Utilisez l'opérateur deux-points pour sélectionner une plage de membres de Qtr1 à Qtr4 :

    SELECT 
      [Qtr1]:[Qtr4]
    ON COLUMNS 
    FROM Sample.Basic
  4. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Les valeurs Qtr1, Qtr2, Qtr3 et Qtr4 sont renvoyées.

  5. Utilisez la fonction MemberRange pour sélectionner la même plage de membres, Qtr1 à Qtr4.

    SELECT
      MemberRange([Qtr1],[Qtr4])
    ON COLUMNS
    FROM Sample.Basic
  6. Collez la requête dans le client MaxL et exécutez-la.

  7. Enregistrez la requête sous le nom gry_member_range_func.txt.

Exercice 6 : Utiliser la fonction CrossJoin

La fonction CrossJoin renvoie le produit croisé de deux ensembles provenant de dimensions Essbase différentes. Sa syntaxe est la suivante :

CrossJoin(set,set)

Cette fonction prend deux ensembles de dimensions différentes en entrée, et crée un ensemble qui est un produit croisé de ceux-ci. Cela est utile pour créer des rapports symétriques.

Pour utiliser la fonction CrossJoin :

  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé dans Créer un modèle de requête MDX.

  2. Remplacez les accolades {} de l'axe des colonnes par CrossJoin().

    SELECT
      CrossJoin () 
    ON COLUMNS, 
      {}
    ON ROWS
    FROM Sample.Basic
  3. Ajoutez deux paires d'accolades séparées par des virgules en tant qu'espaces réservés pour les deux arguments que vous fournirez à la fonction CrossJoin :

    SELECT
      CrossJoin ({}, {})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  4. Dans le premier ensemble, indiquez le membre Product [100-10]. Dans le second ensemble, indiquez les membres du marché [East], [West], [South] et [Central].

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  5. Sur l'axe de ligne, utilisez CrossJoin pour croiser un ensemble de membres Measures avec un ensemble contenant Qtr1 :

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin ( 
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]} 
      ) 
    ON ROWS
    FROM Sample.Basic
  6. Enregistrez la requête sous le nom qry_crossjoin_func.txt.

  7. Collez la requête dans le client MaxL et exécutez-la.

Lorsque vous testez l'utilisation de CrossJoin, notez que l'ordre des arguments affecte l'ordre des tuples dans la sortie.

Les résultats de la requête sont présentés ci-dessous :

Tableau 28-4 Résultats : Utilisation de la fonction CrossJoin

L'image d'un espace est utilisée pour vider les cellules L'image d'un espace est utilisée pour vider les cellules 100-10 100-10 100-10 100-10
L'image d'un espace est utilisée pour vider les cellules L'image d'un espace est utilisée pour vider les cellules

East

Région de l'Ouest

Sud

Centre

Sales

Qtr1

5 731

3 493

2 296

3 425

COGS

Qtr1

1 783

1 428

1 010

1 460

% de marge

Qtr1

66,803

59,118

56,01

57,372

% profit

Qtr1

45,82

29,974

32,448

24,613

Remarques :

Envisagez d'utiliser CrossJoinAttribute si les jeux d'entrées sont une dimension de base et sa dimension d'attribut.

Exercice 7 - Utilisation de la fonction children

La fonction Children renvoie un ensemble de tous les membres enfant du membre donné. Utilisez la syntaxe suivante :

Children (member)

Remarques :

Une autre syntaxe pour les enfants consiste à l'utiliser comme opérateur sur le membre d'entrée, comme suit : member.Children. Nous allons utiliser la syntaxe de l'opérateur dans cet exercice.

Pour utiliser la fonction Enfants pour introduire un raccourci dans la spécification du premier axe :

  1. Ouvrez qry_crossjoin_func.txt, la requête que vous avez créée dans l'exercice précédent.

  2. Dans le deuxième ensemble de la spécification d'axe de colonne, remplacez [East],[West],[South],[Central] par [Market].Children.

    SELECT 
      CrossJoin ({[100-10]}, {[Market].Children})
    ON COLUMNS,
      CrossJoin (
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]}
      )
    ON ROWS
    FROM Sample.Basic
  3. Enregistrez la requête sous le nom gry_children_func.txt.

  4. Collez la requête dans le client MaxL et exécutez-la.

    Vous devriez voir les mêmes résultats que ceux renvoyés pour l'exercice CrossJoin précédent.

Niveaux de référence et générations avec MDX

Certaines fonctions MDX effectuent des opérations ensemblistes basées sur un argument de couche d'entrée. La couche représente une génération ou un niveau d'une dimension Essbase. Apprenez à référencer un ensemble à l'aide de la fonction Membres.

Dans MDX, le concept de couche fait référence aux générations et aux niveaux d'une hiérarchie Essbase.

Dans Essbase, les numéros de génération commencent par 1 dans le nom de la dimension. Les numéros de génération supérieurs sont ceux qui sont les plus proches des membres feuille d'une hiérarchie.

Les numéros de niveau commencent par 0 dans la partie la plus folle de la hiérarchie, et le numéro de niveau le plus élevé est un nom de dimension.

Vous pouvez spécifier un argument de couche de l'une des manières suivantes :

  • Nom de génération ou de niveau ; par exemple, States ou Regions.

  • Nom de la dimension et nom de la génération ou du niveau (par exemple, Market.Regions et [Market].[States]).

  • Les niveaux fonctionnent avec une dimension et un numéro de niveau en entrée. Par exemple, [Year].Levels(0).

  • Fonction Level avec un membre en entrée. Par exemple, [Qtr1].Level renvoie le niveau des trimestres dans Sample.Basic, qui est le niveau 1 de la dimension Market.

  • Les générations fonctionnent avec une dimension et un numéro de génération en entrée. Par exemple, [Year].Generations (3).

  • Fonction de génération avec un membre en entrée. Par exemple, [Qtr1].Generation renvoie la génération des trimestres dans Sample.Basic, qui est la génération 2 de la dimension Market.

Remarques :

Dans la base de données Sample.Basic, Qtr1 et Qtr4 se trouvent dans la même couche. Cela signifie que Qtr1 et Qtr4 sont également dans la même génération. Cependant, dans une base de données différente avec une hiérarchie irrégulière, Qtr1 et Qtr4 peuvent ne pas nécessairement être dans le même niveau, bien qu'ils soient dans la même génération. Par exemple, si la hiérarchie de Qtr1 descend en semaines et que la hiérarchie de Qtr4 s'arrête en mois, Qtr1 est un niveau supérieur à Qtr4, mais ils sont toujours dans la même couche.

Exercice 8 : Utiliser la fonction Members

Utilisez la fonction Members pour renvoyer tous les membres d'une génération ou d'un niveau donné. Lorsqu'elle est utilisée avec un argument de couche, la syntaxe est la suivante :

Members (layer)

où l'argument layer indique la génération ou le niveau de membres à renvoyer.

Remarques :

Une autre syntaxe pour les membres est layer.Members.

Pour utiliser la fonction Members :

  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé dans Créer un modèle de requête MDX.

  2. Supprimez les accolades {}, qui ne sont pas nécessaires lorsque vous utilisez une fonction pour renvoyer un ensemble.

  3. Utilisez les fonctions Membres et Niveaux pour sélectionner tous les membres de niveau 0 dans la dimension Marché de Sample.Basic :

    SELECT
      Members(Market.levels(0))
    ON COLUMNS
    FROM Sample.Basic
  4. Enregistrez la requête sous le nom qry_members_func.txt.

  5. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Résultats : tous les états de la dimension Marché sont renvoyés.

Utiliser un axe de trancheur pour définir le point de vue de requête MDX

Un axe slicer est un moyen de limiter une requête MDX pour ne prendre en compte qu'une zone spécifique du cube Essbase. Apprenez à utiliser la trancheuse dans la clause WHERE en essayant l'exemple d'exercice.

La tranche, si elle est utilisée, doit se trouver dans la section WHERE d'une requête MDX. En outre, la section WHERE doit être le dernier composant de la requête, suivant la spécification du cube (la section FROM) :

SELECT {set}
ON axes
FROM cube
WHERE slicer

Utilisez l'axe de tranche pour définir le contexte de la requête. Il s'agit généralement du contexte par défaut pour tous les autres axes.

Pour sélectionner uniquement les ventes réelles dans le cube Sample.Basic, à l'exception des ventes budgétées, la clause WHERE peut se présenter comme suit :

WHERE ([Actual], [Sales])

Etant donné que (Actual, Sales) est spécifié dans l'axe de tranche, vous n'avez pas besoin de les inclure dans les spécifications ON AXIS(n) définies.

Remarques :

La même dimension ne peut pas apparaître sur d'autres axes et sur l'axe de la tranche. Pour filtrer un axe à l'aide de critères de sa propre dimension, vous pouvez utiliser une sous-sélection.

Exercice 9 : Limiter les résultats avec un axe de trancheur

Pour utiliser l'axe de la tranche pour limiter les résultats :

  1. Ouvrez gry_crossjoin_func.txt, la requête que vous avez créée dans l'exercice 6 de Utilisation des fonctions MDX pour créer des ensembles.

  2. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Notez les résultats dans l'une des cellules de données. Par exemple, notez que le premier tuple, ([Cola],[East],[Sales],[Qtr1]), a une valeur de 5731.

  3. Ajoutez un axe de tranche pour limiter les données renvoyées aux valeurs budgétées uniquement.

    SELECT
      CrossJoin ({[100-10]}, {[East],[West],[South],[Central]})
    ON COLUMNS,
      CrossJoin (
        {[Sales],[COGS],[Margin %],[Profit %]}, {[Qtr1]}
      )
    ON ROWS
    FROM Sample.Basic
    WHERE (Budget)
  4. Collez la requête dans le client MaxL et exécutez-la.

  5. La valeur du tuple ([Cola],[East],[Sales],[Qtr1]) est désormais 5020.

  6. Enregistrez la requête sous le nom qry_slicer_axis.txt.

Fonctions de relation MDX courantes

Les fonctions de relation MDX renvoient des ensembles ou des membres en fonction des relations hiérarchiques des membres dans l'outline du cube Essbase.

Les fonctions de relation MDX suivantes renvoient des jeux.

Tableau 28-5 Liste des fonctions de relation MDX renvoyant des jeux

Fonction de relation Description

Enfants

Renvoie les enfants du membre d'entrée.

Semblables

Renvoie les semblables du membre d'entrée.

Descendants

Renvoie les descendants d'un membre, avec des options variables.

Les fonctions de relation MDX suivantes renvoient un seul membre plutôt qu'un ensemble :

Tableau 28-6 Liste des fonctions de relation MDX renvoyant un seul membre

Fonction de relation Description

Ancêtre

Renvoie un ancêtre au niveau de la couche indiquée.

Cousin(e)

Renvoie un membre enfant à la même position qu'un membre d'un autre ancêtre.

Parent

Renvoie le parent du membre d'entrée.

Premier enfant

Renvoie le premier enfant du membre d'entrée.

Dernier enfant

Renvoie le dernier enfant du membre d'entrée.

Premier semblable

Renvoie le premier enfant du parent du membre d'entrée.

Dernier semblable

Renvoie le dernier enfant du parent du membre d'entrée.

Exercice 10 : Essayez quelques exemples de fonctions relationnelles à partir de la documentation

Pour savoir comment fonctionnent les fonctions relationnelles :

  1. Cliquez sur un lien vers une fonction dans l'une des tables ci-dessus ou cliquez sur Enfants.

  2. Lisez l'exemple et copiez la requête SELECT dans le presse-papiers.

  3. Collez la requête dans le client MaxL, ajoutez un point-virgule fermant et exécutez la requête, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

Fonctions MDX pour les opérations définies

Vous pouvez utiliser les fonctions MDX suivantes avec Essbase pour comparer, joindre, combiner ou réduire des ensembles : CrossJoin, CrossJoinAttribute, Distinct, Except, Generate, Head, Intersect, Subset, Tail et Union.

Essayez les exercices pour faire la différence entre les fonctions Intersect et Union.

Les fonctions de jeu suivantes fonctionnent sur des jeux d'entrées sans dériver d'informations supplémentaires à partir d'un cube :

Tableau 28-7 Liste des fonctions d'ensemble pur

Fonction Pure Set Description

CrossJoin, CrossJoinAttribute

Renvoie une section transversale de deux ensembles de différentes dimensions.

Distinct

Supprime les tuples en double d'un ensemble.

Sauf

Renvoie un sous-ensemble contenant les différences entre deux ensembles.

Génération

Une fonction itérative. Pour chaque tuple dans set1, renvoie set2.

HEAD

Renvoie les premiers membres ou tuples n présents dans un ensemble.

Intersect

Renvoie l'intersection de deux ensembles d'entrée.

Sous-ensemble

Renvoie un sous-ensemble d'un ensemble, dans lequel le sous-ensemble est une plage de tuples indiquée numériquement.

Extrémité

Renvoie les derniers membres ou tuples n présents dans un ensemble.

Union

Renvoie l'union de deux ensembles d'entrée.

Exercice 11 - Utilisation de la fonction Intersect

La fonction MDX Intersect renvoie le croisement de deux ensembles d'entrées, en conservant éventuellement les doublons. Utilisez-le pour comparer des ensembles en recherchant les tuples présents dans les deux ensembles.

Voici la syntaxe à suivre :

Intersect (set, set [,ALL])
  1. Ouvrez qry_blank.txt, modèle de requête que vous avez créé dans Créer un modèle de requête MDX.

  2. Supprimez les accolades vides {} de l'axe et remplacez-les par Intersect(). Laissez de la place à l'intérieur des accolades pour ajouter plus de code. Exemple :

    SELECT
       Intersect (
    
       )
    ON COLUMNS
    FROM Sample.Basic
  3. Ajoutez deux paires d'accolades séparées par des virgules à utiliser comme espaces réservés pour les deux arguments définis que vous fournirez à la fonction Intersect. Exemple :

    SELECT
       Intersect ( 
       { },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  4. Indiquez les enfants de East comme premier argument set. Exemple :

    SELECT
       Intersect (
       { [East].children },
       { }
       )
    ON COLUMNS
    FROM Sample.Basic
  5. Pour le deuxième argument set, spécifiez tous les membres de la dimension Market qui ont un UDA de "Major Market". Exemple :

    SELECT
       Intersect (
       { [East].children },
       { UDA([Market], "Major Market") }
       )
    ON COLUMNS
    FROM Sample.Basic
  6. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Tous les enfants East dont l'attribut défini par l'utilisateur est Major Market sont renvoyés. Exemple :

    New York   Massachusetts   Florida
    
    8202       6172            5029
  7. Enregistrez la requête sous le nom qry_intersect_func.txt.

Exercice 12 - Utilisation de la fonction Union

La fonction MDX Union joint deux ensembles d'entrées, en conservant éventuellement les doublons. Utilisez-le pour combiner deux ensembles en un seul ensemble.

Voici la syntaxe à suivre :

Union (set, set [,ALL])
  1. Ouvrez qry_intersect_func.txt, la requête que vous avez créée dans l'exercice précédent.

  2. Remplacez Intersect par Union.

  3. Enregistrez la requête sous le nom qry_union_func.txt.

  4. Collez la requête dans le client MaxL et exécutez-la.

    Alors qu'Intersect a retourné un ensemble contenant uniquement les enfants de l'Est qui ont un UDA de Major Market, Union retourne un ensemble plus grand. Il comprend tous les enfants d'Est, ET tous les membres du marché qui ont un UDA de marché majeur.

     (New York)      (Massachusetts) (Florida)       (Connecticut)   (New Hampshire) (East)          (California)    (Texas)         (Central)       (Illinois)      (Ohio)          (Colorado)
    +---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------
                8202            6712            5029            3093            1125           24161           12964    6425           38262           12577            4384            7227
    

Ensembles et membres réutilisables : MDX AVEC section

La définition de membres et d'ensembles dans la section WITH de la requête MDX vous aide à filtrer les données sans affecter le cube. Un membre calculé est un membre logique qui n'existe que dans l'interrogation. Un ensemble nommé est un ensemble logique qui n'existe que dans l'interrogation. Essayez un exemple d'exercice.

Les membres calculés et les ensembles nommés sont des entités logiques de la requête qui peuvent être utilisées plusieurs fois au cours de sa durée de vie. Les membres calculés et les ensembles nommés peuvent gagner du temps dans les lignes de code écrites ainsi que dans le temps d'exécution. La section WITH facultative au début d'une requête MDX permet de définir les membres calculés et/ou les ensembles nommés.

L'interrogation suivante utilise un membre calculé :

WITH
MEMBER [Measures].[Max Qtr2 Sales] AS
  'Max (
    {[Year].[Qtr2]},
    [Measures].[Sales]
  )'
SELECT
{ [Measures].[Max Qtr2 Sales] } on columns,
{ [Product].children } on rows
FROM Sample.Basic

L'interrogation suivante utilise un ensemble nommé :

WITH SET [NewSet] 
AS 'CrossJoin([Product].Children, [Market].Children)'
SELECT
   Filter([NewSet], NOT IsEmpty([NewSet].CurrentTuple)) 
ON COLUMNS
FROM Sample.Basic
WHERE
   {[Sales]}

Membres calculés

Un membre calculé est un membre hypothétique qui existe pendant toute la durée de l'exécution de l'interrogation. Les membres calculés permettent une analyse complexe sans qu'il soit nécessaire d'ajouter des membres physiques à l'outline du cube. Les membres calculés stockent les résultats des calculs effectués sur les membres physiques.

Utilisez les instructions suivantes pour les noms de membre calculés :

  • Associez le membre calculé à une dimension. Par exemple, pour associer le membre MyCalc à la dimension Mesures, nommez-le [Measures].[MyCalc].

  • N'utilisez pas de noms de membre réels pour nommer les membres calculés. Par exemple, ne nommez pas un membre calculé [Measures].[Sales], car Sales existe déjà dans la dimension Mesures.

Il est recommandé de définir l'ordre de résolution pour chaque membre calculé lorsque vous utilisez plusieurs membres calculés pour créer des ratios ou des totaux personnalisés.

Ensembles nommés

Vous définissez des ensembles nommés à l'aide des mots-clés WITH SET, avant la partie SELECT de l'interrogation. Cela est utile car vous pouvez référencer l'ensemble par son nom lors de la création de la partie SELECT de l'interrogation.

Par exemple, l'ensemble nommé Best5Prods identifie un ensemble des cinq produits les plus vendus en décembre :

WITH
SET [Best5Prods]
  AS
  'Topcount (
    [Product].members,
    5,
    ([Measures].[Sales], [Scenario].[Actual], [Year].[Dec])
  )'
SELECT [Best5Prods] ON AXIS(0),
  {[Year].[Dec]} ON AXIS(1)
FROM Sample.Basic

Exercice 13 : Créer un membre calculé

Cet exercice utilise la fonction Max, une fonction MDX commune pour les calculs. Elle renvoie le nombre maximal de valeurs trouvées dans les tuples d'un ensemble.

Voici la syntaxe à suivre :

Max (set, numeric_value)
  1. Ouvrez qry_blank_2ax.txt, le modèle de requête que vous avez créé dans l'exercice 3 de Disposition de requête MDX avec axes et spécification de cube.

    SELECT
      {}
    ON COLUMNS,
      {}
    ON ROWS
    FROM Sample.Basic
  2. Dans l'ensemble d'axes de ligne, indiquez les enfants de Product. Exemple :

    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  3. Au début de l'interrogation, ajoutez un espace réservé pour la spécification de membre calculée. Exemple :

    WITH MEMBER [].[]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  4. Pour associer le membre calculé à la dimension Mesures et lui attribuer le nom Max Qtr2 Sales, ajoutez ces informations à la spécification de membre calculé. Exemple :

    WITH MEMBER [Measures].[Max Qtr2 Sales]
     AS ''
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
  5. Après le mot-clé AS et entre apostrophes, définissez la logique du membre calculé nommé Max Qtr2 Sales.

    Utilisez la fonction Max avec l'ensemble à évaluer (Qtr2) comme premier argument et la mesure à évaluer (Sales) comme deuxième argument. Exemple :

    WITH MEMBER [Measures].[Max Qtr2 Sales]
      AS '
      Max (
        {[Year].[Qtr2]},
        [Measures].[Sales]
      )'
    SELECT
      {}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
    
  6. Le membre calculé Max Qtr2 Sales est défini dans la section WITH. Pour l'utiliser dans une requête, référencez-la sur l'un des axes de la partie SELECT de la requête. Exemple :

    WITH MEMBER [Measures].[Max Qtr2 Sales]
      AS '
      Max (
        {[Year].[Qtr2]},
        [Measures].[Sales]
      )'
    SELECT
      {[Measures].[Max Qtr2 Sales]}
    ON COLUMNS,
      {[Product].children}
    ON ROWS
    FROM Sample.Basic
    
  7. Enregistrez la requête sous le nom gry_calc_member.txt.

  8. Collez la requête dans le client MaxL et exécutez-la, comme décrit dans le premier exercice (dans la section MDX Sets and Tuples).

    Les résultats de la requête sont présentés ci-dessous :

    Tableau 28-8 Résultats : Créer un membre calculé

    L'image d'un espace est utilisée pour vider les cellules Ventes maximum du trimestre 2

    100

    27 187

    200

    27 401

    300

    25 736

    400

    21 355

    Régime alimentaire

    26 787

Remarques :

De nombreux autres exemples sont disponibles dans la documentation de référence MDX. Voir MDX With Section.

Fonctions itératives MDX

Les fonctions MDX itératives effectuent une boucle sur des ensembles de données dans le cube Essbase, en exécutant les conditions de recherche que vous indiquez pour personnaliser les résultats. Voir un exemple qui filtre les données en fonction d'un test booléen.

Tableau 28-9 Liste des fonctions itératives de MDX

Fonction Description

Filtre

Renvoie le sous-ensemble de tuples dans set pour lesquels la valeur de la condition de recherche est TRUE.

IIF

Effectue un test conditionnel et renvoie une expression numérique appropriée ou définie selon que le résultat du test est TRUE ou FALSE.

Dossier

Effectue des tests conditionnels et renvoie les résultats que vous indiquez.

Génération

Pour chaque tuple dans set1, renvoie set2.

Exemple de fonction de filtre

La requête suivante utilise la fonction Filtre MDX pour renvoyer tous les membres de la dimension Marché pour lesquels l'expression IsChild([Market].CurrentMember,[East]) renvoie TRUE. La requête renvoie tous les enfants de East.

SELECT
  Filter([Market].Members,
    IsChild([Market].CurrentMember,[East])
  )
ON COLUMNS
FROM Sample.Basic

La fonction Filter dans MDX est comparable à la commande RESTRICT dans Report Writer.

Gérer les données manquantes avec MDX

Lorsque vous interrogez un cube Essbase à l'aide de MDX, vous pouvez utiliser les mots-clés NON EMPTY sur les axes pour supprimer les cellules ne contenant aucune valeur. Les fonctions MDX qui gèrent les valeurs manquantes incluent Moyenne, CoalesceEmpty, IsEmpty, NonEmptyCount et NonEmptySubset. Les propriétés NONEMPTYMEMBER et NONEMPTYTUPLE permettent de filtrer les valeurs vides des jeux de données volumineux.

L'inclusion des mots-clés facultatifs NON EMPTY avant la spécification définie dans un axe entraîne la suppression des tranches de cet axe qui contiennent entièrement des valeurs #MISSING.

Voici la syntaxe de spécification d'axe avec NON EMPTY :

<axis_specification> ::=
  [NON EMPTY] <set> ON
  COLUMNS | ROWS | PAGES | CHAPTERS |
  SECTIONS | AXIS (<unsigned_integer>)

Pour un tuple donné sur un axe (tel que (Qtr1, Actual)), une tranche est constituée des cellules issues de la combinaison de ce tuple avec tous les tuples de tous les autres axes. Si toutes ces valeurs de cellule sont #MISSING, le mot clé NON EMPTY entraîne l'élimination du tuple.

Par exemple, si une seule valeur d'une ligne n'est pas vide, la ligne entière est renvoyée. Si vous incluez NON EMPTY au début de la spécification de l'axe de ligne, la tranche de ligne suivante sera éliminée de l'ensemble renvoyé par une requête :

Une ligne de valeurs #MISSING pour Qtr1, Actual

En plus de supprimer les valeurs manquantes avec NON EMPTY, vous pouvez utiliser les fonctions MDX suivantes pour gérer les résultats #MISSING :

  • CoalesceEmpty, qui recherche les expressions de valeur numérique pour les valeurs non #MISSING

  • IsEmpty, qui renvoie TRUE si la valeur d'une expression de valeurs numériques d'entrée est #MISSING.

  • Moyenne, qui omet les valeurs manquantes dans les moyennes, sauf si vous utilisez l'indicateur facultatif Inclure vide

La fonction MDX NonEmptyCount renvoie le nombre de tuples dans un ensemble qui correspondent à des valeurs non manquantes. Chaque tuple est évalué et inclus dans le nombre renvoyé par cette fonction. Si l'expression de valeur numérique est spécifiée, elle est évaluée dans le contexte de chaque tuple et le nombre de valeurs non manquantes est renvoyé.

Sur les cubes en mode "aggregate storage" uniquement, la fonction NonEmptyCount est optimisée afin que le calcul du nombre distinct pour toutes les cellules puisse être effectué en analysant le cube une seule fois. Sans cette optimisation, la base de données est analysée autant de fois que le nombre de cellules correspondant au nombre distinct. L'optimisation NonEmptyCount est déclenchée lorsqu'une formule de membre d'outline présente la syntaxe suivante :

NONEMPTYCOUNT(set, measure, exclude_missing)

Le paramètre exclude_missing prend en charge l'optimisation NonEmptyCount sur les bases de données agrégées en améliorant les performances d'une requête qui interroge les mesures qui effectuent un calcul de nombre distinct.

Les propriétés d'optimisation NONEMPTYMEMBER et NONEMPTYTUPLE permettent à MDX d'interroger des ensembles volumineux de membres ou de tuples tout en ignorant l'exécution de la formule sur des valeurs non contributives qui contiennent uniquement des données #MISSING.

  • Utilisez une seule clause de propriété NONEMPTYMEMBER au début d'un membre calculé ou d'une expression de formule pour indiquer à Essbase que la valeur de la formule ou du membre calculé est vide lorsque l'un des membres spécifiés dans nonempty_member_list est vide.

  • Utilisez une seule clause de propriété NONEMPTYTUPLE au début d'un membre calculé ou d'une expression de formule pour indiquer à Essbase que la valeur de la formule ou du membre calculé est vide lorsque la valeur de cellule au niveau du tuple indiqué dans nonempty_member_list est vide.

En fonction d'un ensemble d'entrées, la fonction MDX NonEmptySubset renvoie un sous-ensemble de cet ensemble d'entrées dans lequel tous les tuples sont évalués comme non vides. Une expression de valeur facultative peut être spécifiée pour la vérification non vide. Cette fonction permet d'optimiser les requêtes qui sont basées sur un ensemble volumineux pour lequel l'ensemble de combinaisons non vides est connu pour être petit. NonEmptySubset réduit la taille de l'ensemble en présence d'une métrique. Par exemple, vous pouvez demander le sous-ensemble non vide de descendants pour des unités spécifiques.

Variables des requêtes MDX

Vous pouvez utiliser des variables de substitution Essbase prédéfinies dans MDX pour référencer des informations fréquemment modifiées sans modifier vos requêtes. Pour référencer une variable dans une requête ou une expression MDX, entrez le nom de la variable précédé d'une esperluette (&).

Les variables de substitution dans Essbase servent d'espaces réservés pour les informations qui changent régulièrement. Vous définissez les variables de substitution au niveau du cube, de l'application ou du niveau global Essbase et affectez une valeur à chaque variable. Vous pouvez modifier la valeur à tout moment. Vous devez avoir au moins le rôle Database Manager pour définir des variables de substitution. Reportez-vous à Implémentation de variables pour la modification des informations.

Pour utiliser une variable de substitution dans une expression MDX, tenez compte des éléments suivants :

  • La variable de substitution doit être accessible à partir de l'application et du cube que vous interrogez.

  • Une variable de substitution comporte deux composants : le nom et la valeur.

  • Le nom de variable peut être une combinaison alphanumérique dont la taille maximale est indiquée dans Limites de nom et d'artefact associées. N'utilisez pas d'espaces, de ponctuation ou de crochets ([ ]) dans les noms de variables de substitution utilisés dans MDX.

  • A l'endroit où vous souhaitez utiliser la variable, entrez le nom de la variable précédé d'une esperluette (&) ;, par exemple, où CurMonth est le nom de la variable de substitution définie sur le serveur, incluez &CurMonth dans l'expression MDX.

  • Lorsque vous effectuez l'extraction, Essbase remplace le nom de la variable par la valeur de substitution et cette valeur est utilisée par l'expression MDX.

Par exemple, l'expression est écrite avec le nom de variable CurQtr précédé du signe & :

SELECT 
  {[&CurQtr]}
ON COLUMNS
FROM Sample.Basic

Lorsque l'expression est évaluée, la valeur en cours (Qtr1) est remplacée par le nom de la variable, de sorte que l'expression exécutée soit efficace :

SELECT 
  {[Qtr1]}
ON COLUMNS
FROM Sample.Basic

Requête de propriétés dans MDX

Les propriétés décrivent certaines caractéristiques des métadonnées et des données Essbase. MDX vous permet d'écrire des requêtes qui extraient et analysent des données en fonction de propriétés Essbase, qui peuvent être intrinsèques ou personnalisées. Vous pouvez appeler des propriétés sur les axes de requête MDX ou dans une expression de valeur.

Propriétés intrinsèques et personnalisées

Dans MDX, properties décrit certaines caractéristiques des données et des métadonnées. MDX vous permet d'écrire des requêtes qui utilisent des propriétés pour extraire et analyser des données. Les propriétés peuvent être intrinsèques ou personnalisées.

Propriétés intrinsèques

Les propriétés intrinsèques sont définies pour les membres de toutes les dimensions. Les propriétés de membre intrinsèques définies pour tous les membres d'une outline de base de données Essbase sont MEMBER_NAME, MEMBER_ALIAS, LEVEL_NUMBER, GEN_NUMBER, IS_EXPENSE, COMMENTS et MEMBER_UNIQUE_NAME.

Reportez-vous à la section MDX Intrinsic Properties pour une description de chacun d'entre eux.

Propriétés personnalisées

Dans Essbase, MDX prend en charge deux types de propriétés personnalisées : les propriétés d'attribut et les propriétés UDA. Les propriétés d'attribut sont définies par les dimensions d'attribut dans une outline. Dans la base de données Sample.Basic, la dimension d'attribut Pkg Type décrit les caractéristiques de packaging des membres de la dimension Product. Ces informations peuvent être interrogées dans MDX à l'aide du nom de propriété [Type de package].

Les propriétés d'attribut sont définies uniquement pour des dimensions spécifiques et uniquement pour un niveau spécifique dans chaque dimension. Par exemple, dans l'outline Sample.Basic, [Ounces] est une propriété d'attribut définie uniquement pour les membres de la dimension Product, et cette propriété a des valeurs valides uniquement pour les membres de niveau 0 de la dimension Product. La propriété [Ounces] n'existe pas pour d'autres dimensions, telles que Market. La propriété [Ounces] d'un membre autre que de niveau 0 dans la dimension Product est une valeur NULL. Les propriétés d'attribut d'une outline sont identifiées par les noms des dimensions d'attribut de cette outline.

Les propriétés personnalisées incluent également des UDA. Par exemple, [Major Market] est une propriété UDA définie sur les membres de la dimension Market. Il renvoie une valeur TRUE si l'attribut défini par l'utilisateur [Major Market] est défini pour un membre, et FALSE dans le cas contraire.

Voir également la section MDX Custom Properties.

Appeler des propriétés dans un axe de requête

Vous pouvez répertorier les combinaisons de dimension et de propriété pour chaque jeu d'axes. Lorsqu'une requête est exécutée, la propriété indiquée est évaluée pour tous les membres de la dimension indiquée et incluse dans l'ensemble de résultats.

Par exemple, sur l'axe de colonne, la requête suivante renvoie les informations GEN_NUMBER pour chaque membre de la dimension Market. Sur l'axe des lignes, l'interrogation renvoie les informations MEMBER_ALIAS pour chaque membre de la dimension Product.

SELECT
  [Market].Members
    DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
  Filter ([Product].Members, Sales > 5000)
    DIMENSION PROPERTIES [Product].[MEMBER_ALIAS] on rows
FROM Sample.Basic

Lors de l'interrogation de propriétés de membre à l'aide de la section DIMENSION PROPERTIES d'un axe, une propriété peut être identifiée par le nom de DIMENSION et le nom de la propriété, ou en utilisant le nom de propriété lui-même. Lorsqu'un nom de propriété est utilisé seul, ces informations sont renvoyées pour tous les membres de toutes les dimensions de cet axe, pour lesquels cette propriété s'applique.

Dans l'interrogation suivante, la propriété MEMBER_ALIAS est évaluée sur l'axe de ligne pour les dimensions Year et Product.

SELECT [Market].Members
  DIMENSION PROPERTIES [Market].[GEN_NUMBER] on columns,
  CrossJoin([Product].Children, Year.Children)
    DIMENSION PROPERTIES [MEMBER_ALIAS] on rows
FROM Sample.Basic

Appeler des propriétés dans une expression de valeur

Les propriétés peuvent être utilisées dans des expressions de valeur dans une requête MDX. Par exemple, vous pouvez filtrer un ensemble en fonction d'une expression de valeur qui utilise les propriétés des membres de l'ensemble d'entrée.

La requête suivante renvoie tous les produits contenant de la caféine qui sont emballés dans des boîtes.

SELECT
   Filter([Product].levels(0).members,
    [Product].CurrentMember.Caffeinated and
    [Product].CurrentMember.[Pkg Type] = "Can")
       Dimension Properties
       [Caffeinated], [Pkg Type] on columns
FROM Sample.Basic

La requête suivante calcule la valeur [BudgetedExpenses] selon que le marché actuel est un marché majeur, à l'aide de l'UDA [Major Market].

WITH
  MEMBER [Measures].[BudgetedExpenses] AS
    'IIF([Market].CurrentMember.[Major Market],
    [Marketing] * 1.2, [Marketing])'

SELECT  {[Measures].[BudgetedExpenses]} ON COLUMNS,
  [Market].Members ON ROWS
FROM Sample.Basic
WHERE ([Budget])

Type valeur des propriétés

La valeur d'une propriété MDX dans Essbase peut être de type numérique, booléen ou chaîne. Les propriétés MEMBER_NAME et MEMBER_ALIAS renvoient des valeurs de chaîne. Les propriétés LEVEL_NUMBER et GEN_NUMBER renvoient des valeurs numériques.

Les propriétés d'attribut renvoient des valeurs numériques, booléennes ou de chaîne en fonction du type de dimension d'attribut. Par exemple, dans Sample.Basic, la propriété d'attribut [Ounces] est une propriété numérique. La propriété d'attribut [Pkg Type] est une propriété de chaîne. La propriété d'attribut [Caffeinated] est une propriété booléenne.

Essbase autorise les dimensions d'attribut avec des types de date. Les propriétés de type de date sont traitées comme des propriétés numériques dans MDX. Lorsque vous comparez ces valeurs de propriété à des dates, utilisez la fonction Todate pour convertir les chaînes de date en valeurs numériques avant la comparaison.

La requête suivante renvoie tous les membres de la dimension Product qui ont été introduits le 25/03/2018. Comme la propriété [Intro Date] est un type de date, la fonction TODATE doit être utilisée pour convertir la chaîne de date "03-25-2018" en nombre avant de la comparer.

SELECT
  Filter ([Product].Members,
    [Product].CurrentMember.[Intro Date] = 
    TODATE("mm-dd-yyyy","03-25-2018"))ON COLUMNS
FROM Sample.Basic

Lorsqu'une propriété est utilisée dans une expression de valeur, vous devez l'utiliser correctement en fonction de son type de valeur : chaîne, numérique ou booléen.

Vous pouvez également interroger des dimensions d'attribut avec des plages numériques.

La requête suivante extrait les données Sales pour les plages de population Small, Medium et Large.

SELECT
  {Sales} ON COLUMNS,
  {Small, Medium, Large} ON ROWS
FROM Sample.Basic

Lorsque des attributs sont utilisés comme propriétés dans une expression de valeur, vous pouvez utiliser des membres de plage pour vérifier si la valeur de propriété d'un membre se situe dans une plage donnée, à l'aide de l'opérateur IN.

Par exemple, la requête suivante renvoie tous les membres de la dimension Marché dont la plage de population est Moyenne :

SELECT
  Filter(
    Market.Members, Market.CurrentMember.Population
    IN "Medium"
  )
ON AXIS(0)
FROM Sample.Basic

Valeurs de propriété NULL

Certains membres ne peuvent pas avoir de valeurs valides pour un nom de propriété donné. Par exemple, la propriété MEMBER_ALIAS renvoie un autre nom pour un membre donné tel que défini dans l'outline. Toutefois, des alias peuvent ne pas être définis pour tous les membres. Dans ce cas, une valeur NULL est renvoyée pour les membres qui n'ont pas d'alias.

Dans la requête suivante,

SELECT
  [Year].Members
   DIMENSION PROPERTIES [MEMBER_ALIAS]
ON COLUMNS
FROM Sample.Basic

Aucun des membres de la dimension Year n'a d'alias défini pour eux. Par conséquent, l'interrogation renvoie des valeurs NULL pour la propriété MEMBER_ALIAS pour les membres de la dimension Year.

Les propriétés d'attribut sont définies pour les membres d'une dimension spécifique et d'un niveau spécifique de cette dimension. Dans la base de données Sample.Basic, la propriété [Ounces] est définie uniquement pour les membres de niveau 0 de la dimension Product.

Par conséquent, si vous recherchez la propriété [Ounces] d'un membre de la dimension Market, comme indiqué dans la requête suivante, vous obtiendrez une erreur de syntaxe :

SELECT
  Filter([Market].members,
    [Market].CurrentMember.[Ounces] = 32) ON COLUMNS
FROM Sample.Basic

En outre, si vous recherchez la propriété [Ounces] d'un membre non de niveau 0 de la dimension, vous obtiendrez une valeur NULL.

Lorsque vous utilisez des valeurs de propriété dans des expressions de valeur, vous pouvez utiliser la fonction IsValid() pour rechercher des valeurs NULL. La requête suivante renvoie tous les membres de la dimension Product avec une valeur de propriété [Ounces] de 12, après avoir éliminé les membres avec des valeurs NULL.

SELECT
  Filter([Product].Members,
    IsValid([Product].CurrentMember.[Ounces]) AND
    [Product].CurrentMember.[Ounces] = 12) 
ON COLUMNS
FROM Sample.Basic