Code C# pour convertir un rapport SSRS 2008 R2 en format SSRS 2008 R1

Cette article est le troisième de la série qui explique le comportement de BIDS R2 lors du déploiement lorsque la cible est Reporting Services 2008 R1.

J’ai développé une classe C# ainsi qu’un petit programme de test qui permet de prendre un rapport SSRS R2 et le convertir en format SSRS R1:

image

Évidemment, si vous utilisez des fonctionnalités propres à R2 il peut se produire différentes choses :

Cela peut échouer si le rapport contient des

  1. Nouveaux types de sources de données (SharePointList, Azure ou SqlAzure et SQLPDW
  2. Shared Datasets
  3. Variables en lecture/écriture

Des éléments peuvent être enlevés

  1. Cartes
  2. Indicateurs
  3. Options de bris de page (Disabled et ResetPageNumber)

Des éléments peuvent être modifiés

  1. Globals!RenderFormat.Name -> « RPL »
  2. Globals!RenderFormat.IsInteractive -> True
  3. Globals!OverallPageNumber -> Globals!PageNumber
  4. Globals!OverallTotalPages -> Globals!TotalPages
  5. Globals!PageName –> «  »
  6. Rotate270 –> Vertical (pour WritingMode)

Le déploiement peut échouer lors de l’appel aux services Web

  1. Utilisation des fonctions Lookup, LookupSet ou Multilookup
  2. Utilisation d’aggrégation d’aggrégation

Code Source

Vous pouvez obtenir le code source sur GitHub à cet endroit: https://github.com/samsonfr/BIDS2008R2Downgrade

Il y a aussi un projet de rapports SSRS contenant des éléments SSRS R2 afin de vous permettre de tester le comportement à différents niveaux d’erreur (ErrorLevel).

image

Détail sur le code source

Tout d’abord, une énumération permet de reproduire les niveaux d’erreurs de BIDS et d’ajouter un cas où on laisse le déploiement échouer:

public enum ErrorLevel
{
FatalError = 0,
  LayoutDrasticError = 1,
LayoutSignificantError = 2,
LayoutMinorError = 3,
Warning = 4,
LetDeployFail = 5
}

Puis, une classe permet d’enregistrer nos préférences sur ce qui devrait générer une erreur ou un avertissement:

public class DesiredSeverity …

Il faut créer une instance de la classe RdlDowngradeEngine en spécifiant le niveau d’erreur de la configuration et optionnellement l’instance de DesiredSeverity.

public RdlDowngradeEngine(int nBIDSErrorLevel)

public RdlDowngradeEngine(DesiredSeverity pDesiredSeverity, int nBIDSErrorLevel)

Puis il faut appeler la méthode DowngradeReport en lui passant le Xml du rapport:

public string DowngradeReport(string sReportXml, out List<R2Element> pListElementsOut)

La valeur de retour est le Xml du rapport en version 2008 R1. Aussi, tous les éléments problématiques qui ont été enlevés ou modifiés (ou qui ont causé l’échect) sont retournés dans une liste de R2Elements.

public class R2Element
{
public ErrorLevel Severity { get; set; }
public string ElementName { get; set; }
public string ElementType { get; set; }
public string ElementWithNameType { get; set; }
public string ElementXPath { get; set; }
public string LocalizedWarning { get; set; }
public string LocalizedError { get; set; }
}

La sévérité de l’erreur est présente et l’instance contient toujours le message d’erreur ET d’avertissement, ainsi l’application client peut décider d’afficher ce qu’elle veut.

Si le noeud problématique n’a pas de nom (ex. WritingMode), c’est le nom du TextBox contenant celui-ci qui sera retourné et ElementWithNameType contiendra “TextBox”.

En passant, BIDS R2 crée tous les nouveaux rapports en format SSRS R1. C’est uniquement lorsque l’on ajoute un contrôle spécifique à R2 qu’il effectue la conversion vers R2. Cependant, il ne se rend pas compte de l’utilisation des Globals, lookups ou aggrégation d’aggrégation et c’est pourquoi mon code détecte la version source mais traite quand même les Globals quand la version est R1.

Pour le reste, je travaille avec un XmlDocument, ayant le namespace 2008/01 (R1), avec du XPath. J’ai réduit le code à des appels à:

HandleElements(« dns:Body/dns:ReportItems//dns:Map », mpDesiredSeverity.SeverityForMap, RemoveNodeFromParent, null, Localization.ErrorMap, Localization.WarningMap);

Cette méthode accepte une action à effectuer lorsque le XPath trouve un élément. Il peut s’agir d’enlever le noeud, changer sa valeur ou faire un Find&Replace dans la valeur:

private static void RemoveNodeFromParent(XmlNode pNode, string[] asUnused)
{
if (pNode != null && pNode.ParentNode != null)
{
pNode.ParentNode.RemoveChild(pNode);
}
}

private static void ChangeNodeValue(XmlNode pNode, string[] asNewValue)
{
if (pNode != null)
{
pNode.InnerText = asNewValue != null && asNewValue.Length == 1 ? asNewValue[0] : String.Empty;
}
}

private static void ReplaceNodeValue(XmlNode pNode, string[] asNewValue)
{
if (pNode != null && asNewValue != null && asNewValue.Length == 2)
{
pNode.InnerText = Strings.Replace(pNode.InnerText, asNewValue[0], asNewValue[1], 1, -1, CompareMethod.Text);
}
}

Si vous avez des questions ou des suggestions, n’hésitez pas à laisser un commentaire.

Une réflexion sur “Code C# pour convertir un rapport SSRS 2008 R2 en format SSRS 2008 R1

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s