2008-12-15 3 views
0

J'ai le problème suivant. Si je demande des valeurs avec une keyfigure qui est une fonction, je ne peux pas spécifier plusieurs valeurs de la même restriction de dimension, mais si ce n'est pas une fonction cela fonctionne.restrictions de dimensions multiples dans un MDX où clause

ceci marche:

SELECT {[Measures].[Netto]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
    NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])}) 

Mais cela ne veut pas:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00]), 
NonEmpty([Time].[Month].[Month].&[2008-04-01T00:00:00])}) 

Et cela fonctionne aussi:

SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where 
({NonEmpty([Time].[Month].[Month].&[2008-03-01T00:00:00])}) 

Je suppose que la solution est quelque chose comme l'ajout de l'où clause à l'en-tête mais j'aime vraiment cette solution parce que c'est si simple.

La fonction Calucated est:

CREATE MEMBER CURRENTCUBE.[MEASURES].Ultimo 
AS (iif ((not [Time].[Year - Month - Date].currentmember is [Time].[Year - Month - Date].defaultmember), 
IIF(NOT ([Measures].[LagerStk] = 0), 
Sum([Time].[Year - Month - Date].[Date].members(0): 
ClosingPeriod([Time].[Year - Month - Date].[Date]), 
[Measures].[LagerStk]), NULL) 
, 
IIF(NOT ([Measures].[LagerStk] = 0), 
Sum([Time].[Year - Week - Date].[Date].members(0): 
ClosingPeriod([Time].[Year - Week - Date].[Date]), 
[Measures].[LagerStk]), NULL))), 
VISIBLE = 1; 

Le code est inspiré de cela et modifié pour deux hiérarchies dans la dimension temporelle: http://www.sqlserveranalysisservices.com/OLAPPapers/InventoryManagement%20in%20AS2005v2.htm

C'est sur le serveur SQL 2005 Enterprise Edition.

Répondre

1

Ok, cela fonctionne:

WITH MEMBER [Time].[Month].a AGGREGATE 
({[Time].[Month].[Month].&[2008-03-01T00:00:00], 
    [Time].[Month].[Month].&[2008-04-01T00:00:00]}) 
SELECT {[Measures].[CalculatedFunction]} on columns FROM TDC where a 
0

Le problème est dans votre mesure calculée. Vous utilisez .CurrentMember et ClosingPeriod sans référence de membre spécifique, ce qui implique un appel à .CurrentMember. Lorsque vous avez défini dans la clause WHERE, il n'y a aucun membre "en cours" - il existe plusieurs membres en cours. Ré-écrire votre MDX à quelque chose comme ce qui suit devrait lui permettre de travailler avec plusieurs membres dans la clause WHERE.

CREATE 
    MEMBER CURRENTCUBE.[MEASURES].Ultimo AS NULL; 

SCOPE ([MEASURES].Ultimo); 
     SCOPE ([Time].[Year - Month - Date].[All]); 
     this = IIF 
      (
      (NOT 
       [Measures].[LagerStk] = 0) 
      ,Sum 
      (
      NULL:Tail(Existing [Time].[Year - Week - Date].[Date],1).item(0).item(0) 
      ,[Measures].[LagerStk] 
      ) 
      ,NULL 
     ); 
     END SCOPE; 

     SCOPE ([Time].[Year - Week - Date].[All]); 
     this = IIF 
      (
      (NOT 
       [Measures].[LagerStk] = 0) 
      ,Sum 
      (
      NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0) 
      ,[Measures].[LagerStk] 
      ) 
      ,NULL 
     ) 
     ); 
    END SCOPE; 
END SCOPE; 

J'utilise SCOPE sur les Tous les membres des deux dimensions, cela devrait être rapide que l'IIF sur et évitera aussi une référence à .CurrentMember. J'ai ensuite remplacé le ClosingPeriod() appel avec Queue (existant [Heure]. [Année - Semaine - Date]. [Date], 1) .item (0) .item (0) ce que cela fait est d'obtenir l'ensemble des membres de date qui existent dans le contexte actuel, l'appel Tail() obtient alors le dernier de ceux-ci en tant qu'un seul ensemble de membres et les appels .Item (0) .Item (0) obtiennent le premier membre du premier tuple de cet ensemble.

De toute évidence, n'ayant pas accès à votre cube, je ne peux pas tester tout cela. Le problème que vous avez signalé dans votre commentaire peut se rapporter soit à une référence incorrecte à tous les membres (je peux avoir un format de nommage différent à celui de votre cube) ou il peut être lié à l'instruction IIF(). Je ne suis pas sûr que le chèque de 0 est en cours d'évaluation dans le contexte correct

Vous pouvez essayer des tests sans l'IIF()

CREER MEMBRE CURRENTCUBE [Measures] .Ultimo AS NULL.

SCOPE ([MESURES] .Ultimo); SCOPE ([Heure]. [Année - Mois - Date]. [Tout]); NULL: Queue (Existant [Heure]. [Année - Semaine - Date]. [Date], 1) .item (0) .item (0) , [Mesures][LagerStk] ); END SCOPE;

SCOPE ([Time].[Year - Week - Date].[All]); 
    this = Sum 
     (
     NULL:Tail(Existing [Time].[Year - Month - Date].[Date],1).Item(0).Item(0) 
     ,[Measures].[LagerStk] 
     ); 
END SCOPE; 

END SCOPE;

+0

Fonction calibrée supplémentaire à la description originale. Merci! –

+0

Merci cela fonctionne, petit nitpick il y a un bug dans la seconde portée. Devrait être: ');', au lieu de '),)'. –

+0

Eh bien, cela ne fonctionne pas réellement. Si je mets une semaine, une date ou un mois sur l'un des axes, cela ne calcule rien? –