Business Geek

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 31 août 2008

Analysis Services - Support du format monétaire dans Excel

Dans un projet décisionnel, il est nécessaire lors de la restitution des données de les formater. Par exemple, si vous présentez des données financières, il va falloir les afficher correctement.

Dans une architecture applicative classique, on laisse ce travail à la couche de présentation. Dans un contexte décisionnel, cette couche de présentation peut être Reporting Services qui gère le formatage mais ce peut-être aussi un client OLAP autonome comme Excel.

Excel sait gérer aussi le formatage mais c'est aux utilisateurs de le configurer via les options de la PivotTable :

Cette manipulation n'est pas à faire par les utilisateurs finaux, surtout pour des formats triviaux comme des devises.

 

Analysis Services permet d'ajouter des informations de formatage sur chaque cellule pour guider les clients OLAP dans leur réprésentation des données. Ainsi, quand on déclare un membre calculé par exemple, on ajoute la clause FORMAT_STRING décrivant le membre :

CREATE MEMBER CURRENTCUBE.[Measures].[Prix TTC]
AS [Measures].[Prix Vendu]*1.196,
FORMAT_STRING = "Currency"

Cette configuration se fait aussi via l'assistant :

 

Un client OLAP peut récupérer cette information en précisant une clause dans la requête MDX qu'il fait à Analysis Services.

SELECT {[Measures].[Prix TTC]} ON COLUMNS
FROM [CubSales]
CELL PROPERTIES VALUE, FORMAT_STRING

Excel précise bien cette clause dans ses échanges avec SSAS. Or il se peut qu'il n'arrive pas à représenter un membre calculé de type monétaire malgré l'information provenant du cube.

 

Une des solutions pour résoudre ce problème serait d'ajouter la clause FORMATTED_VALUE pour forcer le formatage des cellules par Analysis Services avant de renvoyer les données. On peut le vérifier avec une requête MDX dans Management Studio :

SELECT {[Measures].[Prix TTC]} ON COLUMNS
FROM [CubSales]
CELL PROPERTIES VALUE, FORMAT_STRING, FORMATTED_VALUE

 

Mais Excel ne permet pas de préciser ce paramètre donc il nous faut trouver une solution. Dans le cadre de données monétaires, il est important de connaître le pays pour déterminer la bonne devise. En effet, si mon cube contient des montants en euros, je ne veux pas voir des dollars si le client ou le serveur est en version US. En conséquence, il faut préciser la culture (Locale) en plus du formatage dans les méta-données des cellules. Ainsi, corrigeons notre membre calculé :

CREATE MEMBER CURRENTCUBE.[Measures].[Prix TTC]
AS [Measures].[Prix Vendu]*1.196,
FORMAT_STRING = "Currency", LANGUAGE = 1036 //fr-FR

 

Et là, plus de problème dans Excel pour afficher vos membres calculés en € de façon automatique. Attention, cette manipulation n'est pas possible avec le formulaire d'édition du membre calculé, il vous faudra passé par le script MDX de création.

lundi 28 janvier 2008

Requêter un cube Analysis Services depuis SSIS

On pourrait penser que requêter un cube OLAP avec Integration Services est trivial et pourtant, avec un collègue, nous nous sommes heurtés à quelques difficultés.

Première tentative :

Naïvement, nous créons une connexion de type OLE DB Provider for Analysis Services 9.0. On la branche sur un OLE DB Source et en guise de SQL Command, je tape ma requête MDX (les ventes par catégories depuis le DataWarehouse de AdventureWorks) :

SELECT NON EMPTY { [Measures].[Sales Amount] } ON COLUMNS,NON EMPTY { ([Dim Product].[Dim Product Category].[Dim Product Category].ALLMEMBERS ) } ON ROWS FROM [AdventureWorks]

A la confirmation, l'avertissement suivant apparaît :

[OLE DB Source [1]] Warning: The output "OLE DB Source Output" (11) references an external data type that cannot be mapped to a Data Flow task data type. The Data Flow task data type DT_WSTR will be used instead.

Soit, qu'il en soit ainsi, un WSTR me plait bien, de plus que la preview me montre bien le résultat attendu. Je termine mon package en dirigeant le flux vers un bête FlatFile.

A l'exécution, le warning réapparaît mais plus grave, le package plante violemment(lançant SQLDumper.Exe au passage).

La solution :

Il faut en fait passer par .NET et utiliser les providers "managed". On crée donc une ADO.NET Connection via un clic droit dans la zone des Connection Managers. Dans la liste des .NET Providers for OleDb, on choisit Analysis Services 9.0 (oui, le même mais en managé) et on le configure pour pointer sur notre cube.

Dans le Data Flow Task, on glisse un DataReader Source auquel on branche la connexion créée ci-dessus. Pas d'avertissement, on continue en branchant la sortie vers le fichier, on teste et ça marche immédiatement. Vous aurez peut-être juste besoin d'une conversion de type si vous n'êtes pas en UNICODE mais rien de difficile là-dedans (Data Conversion Transformation).

Merci à Julien sans qui je n'aurai jamais publié cet article (avant un moment).

 

PS : désolé, toutes les instructions sont en anglais car j'utilise une version US des produits, ce que je vous conseille même si vous êtes fan de la loi Toubon.