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 9959 fois, 7 pages
 5 | Déploiement des rapports
Nous connaissons les principes de déploiement des rapports via le web service ReportingService.
Nous avons embarqué nos rapports en tant que ressources de notre Setup
Nous avons une classe .NET lancée depuis notre Setup.
Il ne reste plus qu'à implémenter notre code d'appel.
Les seules informations que nous ne connaissions pas à l'avance sont l'adresse du Web Service Reporting Service de la plateforme de production et le serveur d'où seront retirées les données. Nous allons donc laisser ces choix à l'utilisateur chargé du déploiement.
Nous créons un formulaire permettant de recueillir ces informations.
Une fois ces informations renseignées, nous déploierons les rapports. En termes de retour, nous afficherons une progressbar qui indiquera le statut du déploiement des rapports.
 
/content/f0717e7f-ba9b-4d9d-9c29-e72e76ffcfe1/FormDeploiementRapport.JPG
 
La classe de base appelée étant la classe héritant d'Installer, c'est à elle de créer une nouvelle instance de notre formulaire.
Notre classe installer va donc effectuer plusieurs opérations :
  1. Vérifier l'appelant via le paramètre ClassName.
  2. Passer les paramètres qu'elle connait au formulaire.
  3. Créer le formulaire et le lancer.
Récupérer le résultat du déploiement personnalisé des rapports et le transmettre au Setup.

if (Context.Parameters["ClassName"] == null ||

    Context.Parameters["ClassName"] != "ActionForReports")

    return;

 

base.Install(stateSaver);

 

try

{

    // Récupération du chemin complet de l'assembly

    string assemblyPath = Context.Parameters["assemblypath"];

    string[] splitPath = assemblyPath.Split(new string[] { @"\" }, StringSplitOptions.None);

    // Récupération du répertoire d'installation

    string assemblyFile = splitPath[splitPath.Length - 1];

    string installFolder = assemblyPath.Substring(0, assemblyPath.LastIndexOf(

        string.Format(@"\{0}", assemblyFile)));

 

    FrmReportCustomInstaller connexionForm = new FrmReportCustomInstaller(installFolder);

 

    if (DialogResult.OK != connexionForm.ShowDialog())

        throw new InstallException("Erreur lors de l'installation");

 

}

catch (InstallException ex)

{

    throw ex;

}

catch (Exception ex)

{

    throw new InstallException("Erreur lors de l'installation");

}

Référencement du Service Web
Pour pouvoir utiliser le service Web, il est nécessaire de référencer comme tout web service.
 
/content/f0717e7f-ba9b-4d9d-9c29-e72e76ffcfe1/ReportInstallerWebService.JPG
 
Inutile de garder le fichier de configuration (app.config) qui contient l'url du Web Service, puisque c'est notre interface qui fournira cette information.
Création des dossiers
Chaque rapport étant stocké dans un répertoire virtuel, il est nécessaire de savoir si celui-ci existe ou non et s'il est nécessaire de le créer (ou non)

// Création du répertoire

if (this.CheckExist(ItemTypeEnum.Folder, "/", "ArticleReportProject") == false)

    rs.CreateFolder("ArticleReportProject", "/", null);

On réitère l'opération pour le dossier contenant les sources de données :

// Création du répertoire

if (this.CheckExist(ItemTypeEnum.Folder, "/", "Data Sources") == false)

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

Création de la source de donnée
Nos dossiers sont prêts, nous pouvons commencer par créer la source de donnée :

DataSourceDefinition dsAdv = new DataSourceDefinition();

dsAdv.CredentialRetrieval = CredentialRetrievalEnum.Store;

dsAdv.ConnectString = String.Format(

    @"Data Source={0};Initial Catalog=AdventureWorks", txtRSReportServer.Text.Trim());

dsAdv.Enabled = true;

dsAdv.OriginalConnectStringExpressionBased = false;

dsAdv.WindowsCredentials = false;

dsAdv.ImpersonateUser = false;

dsAdv.Extension = "SQL";

dsAdv.Prompt = null;

dsAdv.UserName = "sa";

dsAdv.Password = "MonMotDePasse";

Puis la déployer :

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

Création des rapports
La création du rapport devient un jeu d'enfants, nous avons tous les éléments nécessaires pour cela.
Nous parcourons l'ensemble des fichiers déployés dans le répertoire d'installation dont l'extension est ".rdl"

DirectoryInfo di = new DirectoryInfo(this.folderName);

FileInfo[] rapports = di.GetFiles("*.rdl");

Pour chacun de ces fichiers, nous ouvrons un flux en lecture dans un tableau de Byte[] :

Byte[] reportDefinition = null;

System.IO.FileStream stream = System.IO.File.OpenRead(f.FullName);

reportDefinition = new Byte[stream.Length];

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

stream.Close();

Nous créons le rapport dans le répertoire virtuel correspondant :

Warning[] warnings = rs.CreateReport(normalName, "/ArticleReportProject", true, reportDefinition, null);

Affectation de la DataSource
Malheureusement déployer le rapport directement depuis le flux de donnée ne suffit pas. En effet, il existe un problème sur les sources de données. Un rapport publié via le Service Web perd sa référence sur la source de données.
Il va falloir la réaffecter à la main.
De plus, il n'existe aucun moyen de récupérer les sources de données référencées dans un rapport directement.
Il va falloir les récupérer en travaillant directement sur le fichier XML
Tout d'abord ouvrir le fichier XML :
Note : Nous avons déjà le rapport en mémoire, dans notre tableau de byte. Autant s'en servir et ouvrir un flux de type MemoryStream

XmlDocument doc = new XmlDocument();

MemoryStream memoryStream = new MemoryStream(reportDefinition);

doc.Load(memoryStream);

Ensuite récupérer l'ensemble des Data Source référencée :

// Récupération des DataSources incluses dans le document XML

XmlNodeList listXmlDataSources = doc.GetElementsByTagName("DataSource");

 

ArrayList lstDataSources = new ArrayList();

 

foreach (XmlNode xmlDs in listXmlDataSources)

{

    // Récupération de la DataSourceReference

    String dataSourceReference = xmlDs.FirstChild.InnerText;

    string dataSourceName = xmlDs.Attributes["Name"].Value;

    DataSource newDS = new DataSource();

    DataSourceReference dsRef = new DataSourceReference();

    dsRef.Reference = string.Format("/Data Sources/{0}", dataSourceReference);

    newDS.Item = dsRef;

    newDS.Name = dataSourceName;

    lstDataSources.Add(newDS);

}

Et les réaffecter via la méthode SetItemDataSources()

DataSource[] newDataSources = (DataSource[])lstDataSources.ToArray(typeof(DataSource));

rs.SetItemDataSources(String.Format("/ArticleReportProject/{0}", normalName), newDataSources);

Nos rapports sont publiés !
 
» Démarrer une discussion
 
Discussion démarée par SalemAnis le 24/08/2012 à 10:32, 1 commentaire(s).
Discussion démarée par pilote35 le 04/02/2010 à 16:08, 1 commentaire(s).
Discussion démarée par Geof75 le 13/11/2007 à 12:25, 1 commentaire(s).