Les semaines sont dans le désordre dans le Cube OLAP de Project Server 2007

Bonjour,

Je souhaite parler aujourd’hui d’un problème qui nous a été remonté par un client, et qui peut potentiellement vous concerner.

Ce mois-ci (février 2011), les semaines ne sont pas ordonnées correctement dans la vue Data Analysis:

 

clip_image002[4]clip_image003[4]

 

La Semaine 10 apparait avant la deuxième partie de la Semaine 6. Ce problème apparaissant déjà en février 2010. Par contre, cela ne se produit pas avec Project Server 2010. 

La cause de ce problème est lié à la dimension Time qui est construite à partir de la vue MSP_TimeByDay_OLAPView dans la base de Reporting. Cette vue renvoie les informations Année, Trimestre, Mois, Semaine et Jour sous la forme d’un binôme [CalendarMemberKey, CalendarMemberName]:

 

SELECT TimeByDay, TimeYear AS CalendarMemberKeyYear, TimeYear AS CalendarMemberNameYear, TimeQuarter AS CalendarMemberKeyQuarter,

                      'Quarter' + CONVERT(CHAR, TimeQuarter) AS CalendarMemberNameQuarter, TimeMonthOfTheYear AS CalendarMemberKeyMonth,

                      dbo.MFN_GetLocalizedMonthName(TimeMonthOfTheYear) AS CalendarMemberNameMonth, TimeWeekOfTheYear AS CalendarMemberKeyWeek,

                      'Week' + CONVERT(CHAR, TimeWeekOfTheYear) AS CalendarMemberNameWeek, TimeByDay AS CalendarMemberKeyDay, 'Day' + CONVERT(CHAR,

                      TimeDayOfTheMonth) AS CalendarMemberNameDay, ISNULL(CAST(FiscalYear AS nvarchar(255)), N'Not Set') AS FiscalMemberKeyYear,

                      ISNULL(CAST(FiscalYear AS nvarchar(255)), N'Not Set') AS FiscalMemberNameYear, ISNULL(CAST(FiscalQuarter AS nvarchar(255)), N'Not Set')

                      AS FiscalMemberKeyQuarter, 'Qtr' + ISNULL(CAST(FiscalQuarter AS nvarchar(255)), N'Not Set') AS FiscalMemberNameQuarter,

                      ISNULL(CAST(FiscalPeriodName AS nvarchar(255)), N'Not Set') AS FiscalMemberKeyPeriod, ISNULL(CAST(FiscalPeriodName AS nvarchar(255)),

                      N'Not Set') AS FiscalMemberNamePeriod, TimeByDay AS FiscalMemberKeyDay, dbo.MFN_GetLocalizedMonthName(TimeMonthOfTheYear)

                      + ' ' + 'Day' + ' ' + CONVERT(CHAR, TimeDayOfTheMonth) AS FiscalMemberNameDay

FROM dbo.MSP_TimeByDay

 

Quand le cube OLAP est construit, la hiérarchie de la dimension Time est créée par cette requête basée sur la vue MSP_TimeByDay_OLAPView. Si l’on fait une trace SQL Profiler dans Analysis Services, on peut voir :

 

SELECT [MSP_TimeByDay_OlapView_Dimension].[CalendarMemberKeyDay] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberKeyDay0_0],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberNameDay] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberNameDay0_1],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberKeyWeek] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberKeyWeek0_2],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberKeyMonth] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberKeyMonth0_3],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberKeyQuarter] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberKeyQuarter0_4],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberKeyYear] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberKeyYear0_5],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberNameWeek] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberNameWeek0_6],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberNameMonth] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberNameMonth0_7],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberNameQuarter] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberNameQuarter0_8],[MSP_TimeByDay_OlapView_Dimension].[CalendarMemberNameYear] AS [MSP_TimeByDay_OlapView_DimensionCalendarMemberNameYear0_9],[MSP_TimeByDay_OlapView_Dimension].[TimeByDay] AS [MSP_TimeByDay_OlapView_DimensionTimeByDay0_10]

FROM [MSP_TimeByDay_OlapView] AS [MSP_TimeByDay_OlapView_Dimension]

 

Chaque niveau de la hiérarchie Time est un binôme tel que [CalendarMemberKey, CalendarMemberName]. C’est le cas pour Année, Trimestre, Mois, Semaine et Jour. Tous les niveaux sont attachés à la racine [All Time] en fonction de leur CalendarMemberKey :

 

Et c’est là que le problème intervient, car la valeur CalendarMemberKeyest est traitée en type Text et non en type Integer (numérique). Dans ce cas, la valeur “10” de CalendarMemberKey est placée devant la valeur “6” de CalendarMemberKey. C’est la raison pour laquelle on obtient, dans le cube OLAP :

 

clip_image006[4]clip_image007[4]

 

Pour résoudre ce problème, il faut modifier la vue MSP_TimeByDay_OLAPView en forçant l’ajout d’un “0” devant les valeurs de CalendarMemberKey qui ne contiennent qu’un seul chiffre (1->01, 2->02 etc…) :

 

SELECT TimeByDay, TimeYear AS CalendarMemberKeyYear, TimeYear AS CalendarMemberNameYear, TimeQuarter AS CalendarMemberKeyQuarter,

                      'Quarter' + CONVERT(CHAR, TimeQuarter) AS CalendarMemberNameQuarter, TimeMonthOfTheYear AS CalendarMemberKeyMonth,

                      dbo.MFN_GetLocalizedMonthName(TimeMonthOfTheYear) AS CalendarMemberNameMonth,

                 (CASE WHEN LEN (CONVERT(CHAR,TimeWeekOfTheYear))<2 THEN '0' ELSE '' END) + CONVERT(CHAR,TimeWeekOfTheYear) AS CalendarMemberKeyWeek,

                      'Week' + CONVERT(CHAR, TimeWeekOfTheYear) AS CalendarMemberNameWeek, TimeByDay AS CalendarMemberKeyDay, 'Day' + CONVERT(CHAR,

                      TimeDayOfTheMonth) AS CalendarMemberNameDay, ISNULL(CAST(FiscalYear AS nvarchar(255)), N'Not Set') AS FiscalMemberKeyYear,

                      ISNULL(CAST(FiscalYear AS nvarchar(255)), N'Not Set') AS FiscalMemberNameYear, ISNULL(CAST(FiscalQuarter AS nvarchar(255)), N'Not Set')

                      AS FiscalMemberKeyQuarter, 'Qtr' + ISNULL(CAST(FiscalQuarter AS nvarchar(255)), N'Not Set') AS FiscalMemberNameQuarter,

                      ISNULL(CAST(FiscalPeriodName AS nvarchar(255)), N'Not Set') AS FiscalMemberKeyPeriod, ISNULL(CAST(FiscalPeriodName AS nvarchar(255)),

                      N'Not Set') AS FiscalMemberNamePeriod, TimeByDay AS FiscalMemberKeyDay, dbo.MFN_GetLocalizedMonthName(TimeMonthOfTheYear)

                      + ' ' + 'Day' + ' ' + CONVERT(CHAR, TimeDayOfTheMonth) AS FiscalMemberNameDay

FROM dbo.MSP_TimeByDay

 

Ainsi, après la création du cube OLAP, vous obtenez :

 

clip_image009[4]clip_image010[4]

 

J’ai proposé cette solution au Groupe Produit qui l’a validée. Elle est donc considérée comme officielle et elle doit être utilisée pour corriger ce problème.

Pour information, la prochaine occurrence de ce problème se situe en mars 2012.

N’hésitez pas à commenter cet article.

Bonne journée

Marc Biarnès