mardi 13 février 2007

Modification du blog !

Bonjour à tous !

Suite aux multiples avis des différentes personnes qui m'ont fait de nombreuses remarques, ce blog vient de subir un léger lifting...
Alors n'hésitez pas à poster vos commentaires et vos idées concernant la nouvelle mise en page !

Typiquement, je suis à la recherche d'une couleur et d'une police intéressantes pour les blocs de code... Avis bienvenus ;-)

vendredi 9 février 2007

Analysis Services 2000 Service Pack 4 - l'arme anti DSO distant !

Bonjour à tous !

Si le pilotage d'Analysis Services 2000 via le namespace DSO est extrêmement simple, comme nous l'avons vu précédemment, il n'en demeure pas moins surprenant que la connexion s'effectue correctement sans une chaîne de connexion bien formée.
En effet, seul le nom du serveur est fourni lors de la connexion avec les objets DSO. La chaîne de connexion est alors récupérée en base de registre, décryptée, et permet d'accéder au Repository d'Analysis Services.

En pratique, Analysis Services stocke deux chaînes de connexion encryptées dans la base de registre :
- une première chaîne pour les connexions locales :
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Microsoft Analysis Services\Bin\msmdrep.mdb
- une deuxième chaîne pour les connexions distantes :
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\<NomDuServeur>\MsOLAPRepository$\msmdrep. mdb

Vous remarquerez ici que le Repository d'Analysis Services 2000 est stocké dans une base de données Access.

A partir du Service Pack 3, un bug est apparu concernant la connexion avec les objets DSO. Malheureusement, le HOTFIX réalisé à l'époque n'a pas été incorporé dans le Service Pack 4 d'Analysis Services 2000.
En effet, l'encryption de la chaîne de connexion distante est défaillante. Il en résulte que la chaîne de connexion décryptée par les objets DSO n'est pas valide.

Ainsi, lors d'une connexion distante via DSO, le message suivant peut-être obtenu :
Cannot connect to the repository. OLAP Server: Error: <NomDuServeur> [Microsoft][ODBC Driver Manager] Data source name too long

L'incompréhension vient souvent du fait que la même action effectuée avec une connexion locale ne pose aucun problème, brouillant un peu plus les pistes de correction.

Un bug incidieux donc, pour lequel vous trouverez un HOTFIX ici. La référence de la description du HOTFIX est KB907323.
Plus simplement, vous pouvez modifier la valeur de la clé contenant la chaîne de connexion distante en effectuant un click droit sur le nom de votre serveur dans Analysis Manager dans le menu "Edit Repository Connection String".

Bien entendu, il est totalement inutile de passer ce HOTFIX si vous ne rencontrez aucun problème ;-)

Effectuer un process de cube dynamiquement...

Bonjour à tous !
Bon nombre d'entre vous ont peut-être souhaité un jour pouvoir effectuer un process de cube Analyses Services dynamiquement dans une application.
Le namespace DSO (Decision Support Objects) permet de se connecter au serveur Analysis Services simplement et offre une API intuitive en s'appuyant sur des composants COM via interop.
Le namespace DSO est disponible dans le framework 1.1 et permet de piloter Analysis Services 2000 et 2005.
Le namespace AMO (Analysis Management Object - Microsoft.AnalysisServices) a remplacé avantageusement le namespace DSO dans le framework 2.0.

Voici quelques bases pour l'utilisation de DSO...

Le code suivant permet d'effectuer une connexion au serveur local :
DSO.ServerClass dsoServer = new DSO.ServerClass();
dsoServer.Connect("localhost");

Puis il est possible de se positionner sur la base "Test" de la façon suivante :
DSO.Database dsoDB = dsoServer.MDStores.Item("Test");

Enfin, un cube ou une dimension donnés peuvent être identifiés de la façon suivante :
DSO.Cube dsoCube = dsoDB.MDStores.Item("MonCube");
DSO.Dimension dsoDim = dsoDB.Dimensions.Item("MaDimension");

Le process du cube ou d'une dimension est alors très aisément exécuté :
dsoDim.Process(DSO.ProcessTypes.processFull);
dsoCube.Process(DSO.ProcessTypes.processFull);

Si vous modifiez le cube dynamiquement (ajout ou suppression de dimension, modification des clauses de jointure, ...), il est nécessaire de mettre à jour le cube avant d'en effectuer le process :
dsoCube.Update();

Pensez à toujours vous déconnecter - typiquement dans le finally de vos blocs try-catch :
dsoServer.Disconnect();

... Et pour l'utilisation de AMO...

Le code suivant permet d'effectuer une connexion au serveur local :
Microsoft.AnalysisServices.Server amoServer = new Microsoft.AnalysisServices.Server();
amoServer.Connect("Data Source=localhost");

Le process du cube est tout aussi simple :
amoServer.Databases["Test"].Cubes["MonCube"].Process();

On notera les noms des collections beaucoup plus propres (Databases au lieu de MDStores).

Un pilotage simple pour des applications d'administration interactives ! Attention toutefois à ne pas oublier qu'un process de cube peut être une action coûteuse, et qu'il n'est souvent pas de très bon ton de rendre les données indisponibles pendant la journée ;-)