Sébastien Pertus
Reporting Services. Déploiement automatisé
Article sur le déploiement automatisé d'un rapport Reporting Services.
Par Sébastien Pertus publié le 02/09/2007 à 23:06, lu 3605 fois, 7 pages
 3 | Web Services Reporting Services
Reporting Services met à votre disposition un ensemble de méthodes fournies par un Web Service pour faciliter les interactions entre votre code et votre Serveur de rapports.
On peut même dire que ce Web Service est le point d'accès le plus important de SSRS. Tout utilise cette API : l'admin avec SSMS et le ReportManager de même la génération avec les ReportViewer
Création de la référence
L'adresse du web service à appeler est :
Url_Connexion_ReportingServices/ReportService2005.asmx
Dans notre cas donc :
http://localhost/ReportServer$SQL2005/Reportservice2005.asmx
 
Référencement du web service

Référencement du web service

 
Une fois votre web service référencé, vous avez accès à un ensemble d'API vous permettant d'interagir avec votre serveur de rapports.
Nous allons nous intéresser plus particulièrement aux aspects Déploiement, mais sachez que vous pouvez faire de nombreuses manipulations que ce soit en terme de maintenance ou de gestions de votre serveur de rapports.
Pour plus d'informations sur l'ensemble des méthodes et propriétés fournies par ce web service, je vous conseil la documentation MSDN, très complète sur ce sujet :
Msdn Reporting Services 2005
Dans notre cas, nous allons utiliser principalement :
  1. les méthodes d'accès aux répertoires virtuels de notre serveur de rapports.
  2. Les méthodes nous permettant de vérifier l'existence d'un rapport, d'un répertoire ou encore d'une DataSource.
  3. Les méthodes de création d'un Report via un flux XML en mémoire (Rappelez vous, un rapport n'est rien d'autre qu'un fichier XML !)
Création d'une nouvelle instance du Web Service
Première étape pour utiliser notre web service : Création d'une instance. Affectation d'un context de sécurité (crédentials), et accessoirement, passage de l'url de connexion (accessoirement, car elle est déjà présente dans le fichier de configuration) :

ReportingService2005 rs = new ReportingService2005();

// rs.Url = txtRSWebService.Text.Trim();

 

rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

Recherche dans l'arborescence. Création d'un répertoire virtuel
Il est possible de parcourir l'ensemble des items de votre serveur de rapports et effectuer une recherche avec plusieurs critères.
Pour cela, nous allons utiliser plusieurs objets :
  1. CatalogItem : Représente un élément de la base de données Reporting Services. Il peut être de plusieurs types.
  2. ItemTypeEnum : Enumération des types possibles d'un CatalogItem
    • Unknown : Type inconnu
    • Folder : Répertoire
    • Report : Rapport
    • Resource : Ressource
    • LinkedReport : Rapport lié
    • DataSource : Source de données
    • Model : Modèle
  3. SearchCondition : Représente une condition unitairePropriété ConditionEnum : type de condition : Contains ou Equals
  4. BooleanOperatorEnum : Type d'interprétation des conditions (Or ou And)
Le web service utilise en suite la méthode FindItems pour effectuer sa recherche.
Le principe :
  1. Définir le chemin (virtuel) où va être exécutée la requête
  2. Définir une ou plusieurs SearchCondition
  3. Récupérer un tableau de CatalogItem
  4. Analyser le résultat renvoyé
Ainsi une recherche d'un dossier serait de la forme :

SearchCondition[] conditions;

 

SearchCondition condition = new SearchCondition();

condition.Condition = ConditionEnum.Contains;

condition.ConditionSpecified = true;

condition.Name = "Name";

condition.Value = "Data Sources";

conditions = new SearchCondition[1];

conditions[0] = condition;

 

CatalogItem[] _returnedItems;

_returnedItems = rs.FindItems("/", BooleanOperatorEnum.Or,

    conditions);

 

CatalogItem ci = null;

 

foreach (CatalogItem item in _returnedItems)

{

    if (item.Type == ItemTypeEnum.Folder)

    {

        if (item.Path == "/Data Sources")

        {

            ci = item;

            break;

        }

    }

}

Si un dossier n'existe pas, alors il nous faudra le créer. C'est chose faite avec la méthode CreateFolder() qui attend en arguments :
  1. Le nom du dossier virtuel.
  2. Le répertoire parent.
  3. Un tableau de propriétés (paire clé valeur de type string)
Le code de création d'un dossier Data Sources:

rs.CreateFolder("Data Sources", "/", null);

Création d'une DataSource
Sur le même principe, il est facile de vérifier l'existence d'une DataSource ou d'un Report.
La création d'une DataSource est tout de même plus compliquée que celle d'un répertoire, ne serait-ce que par le fait de ses nombreuses propriétés.
On reste quand même dans une certaine logique :
Création d'un objet DataSourceDefinition. Celui ci possède (entre autres) les propriétés suivantes :
  1. CredentialsRetrieval : Cette propriété définit si les crédentials sont embarqués ou non dans la DataSource, ou si la sécurité est intégrée, ou encore si un message invitera l'utilisateur à fournir des credentials corrects.
  2. ConnectString : Chaine de connexion. Attention, certains d'entre vous auront vite repérer que la propriété est bien ConnectString et non ConnectionString ! Pourquoi un écart dans la convention de nommage ? Tout simplement car ce n'est pas tout à fait une chaine de connexion complète. Elle ne possède pas les credentials. Elle est donc du type "Data Source={0};Initial Catalog={1};" uniquement.
  3. UserName; Password : Credentials
  4. Extension : type de Data Source : "SQL" dans notre cas.
Un exemple de création d'une DataSourceItem :

DataSourceDefinition dsAdv = new DataSourceDefinition();

dsAdv.CredentialRetrieval = CredentialRetrievalEnum.Store;

 

dsAdv.ConnectString = @"Data Source=(local)\sql2005;Initial  Catalog=AdventureWorks";

 

dsAdv.Enabled = true;

dsAdv.OriginalConnectStringExpressionBased = false;

dsAdv.WindowsCredentials = false;

dsAdv.ImpersonateUser = false;

dsAdv.Extension = "SQL";

dsAdv.Prompt = null;

dsAdv.UserName = "UserName";

dsAdv.Password = "Pass@word12";

Une fois notre Data Source créée, il suffit d'appeler la méthode de notre WebService : CreateDataSource() qui attend en arguments :
  1. Le nom de la DataSource
  2. Le répertoire qui la contient
  3. Un booléen qui spécifie si on écrase une Data Source existante
  4. L'objet DataSourceDefinition paramétré
  5. Un tableau de propriété (paire clé valeur de type string)
Dans notre cas, le code devient :

rs.CreateDataSource("Adv Data Source", "/Data Sources", true, dsAdv, null);

Création d'un Report
La dernière étape de création est celle du rapport. Enfin quand on parle ici de création, c'est plutôt de "Publication d'un rapport sur le serveur de rapports à partir d'un rapport existant"
Pour bien comprendre la création d'un Report via le service web, il est utile de connaître ne serait-ce que la signature de la méthode CreateReport :

public Warning[] CreateReport(string Report, string Parent, bool Overwrite,

    byte[] Definition, Property[] Properties) { }

  1. Warning[] : Représente le résultat d'une création d'un rapport.
  2. Report : Nom du rapport à créé
  3. Parent : Répertoire virtuel contenant le rapport
  4. Overwrite : Ecrase ou non un rapport existante
  5. Definition : Tableau de byte représentant le rapport à créé
  6. Properties : Un tableau de propriétés (paire clé valeur de type string)
Ce qui important ici c'est qu'un rapport doit être sous la forme d'un tableau de Byte pour être créé.
Dans notre scénario, on peut supposer que les rapports seront contenus en tant que ressources embarquées de notre projet de déploiement.
Nous allons donc pouvoir facilement les ouvrir, et en créer un tableau de byte à partir du flux, de la façon suivante :

Byte[] reportDefinition = null;

System.IO.FileStream stream = System.IO.File.OpenRead(filePath);

reportDefinition = new Byte[stream.Length];

stream.Read(reportDefinition, 0, (int)stream.Length);

stream.Close();

Le tableau de Warning récupéré lors de l'appel à la méthode CreateReport contient l'ensemble des éléments résultants de la création du rapport sur votre serveur de rapports.
 
» Démarrer une discussion
 
Discussion démarée par Geof75 le 13/11/2007 à 12:25, 1 commentaire(s).