Business Geek

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

Tag - Reporting Services

Fil des billets - Fil des commentaires

vendredi 28 mars 2008

Reporting Services SP2 sur Windows SP1: Erreur 401

Un post pour relayer un problème (et sa résolution) que j'ai rencontré chez un client récemment.

Pour résoudre quelques bugs que nous avions sur Reporting Services (rsInternalError sur un drill-through, mauvais raffraichissement des données et de la Document Map au changement de paramètres), je décide [enfin] de passer le Service Pack 2 de SQL Server 2005 sur la production.

Après l'installation, tout semble fonctionner correctement sauf une application qui attaque le Web Service de Reporting Services (reportservice2005.asmx). Chaque appelle se solde par une erreur d'authentification (HTTP 401). A noter que le site web qui attaque le Web Service est sur la même machine.

C'est là que je m'aperçois que le serveur est loin d'être mis à jour régulièrement puisque Windows est encore en Service Pack 1. Bien convaincu, d'après différentes discussions dans les newsgroups, que le problème vient du système obsolescent, j'allais planifier une coupure pour la mise à jour quand mon collègue Nicolas a trouvé LE patch de derrière les fagots :

dans la base de registre, ajouter la clé DisableLoopbackCheck (DWORD) avec une valeur de 1 dans HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

Bon, cela ne me dispense pas de passer les patchs sur Windows mais ça nous a permis de corriger rapidement (merci Nico).

Voici la KB correspondante :
http://support.microsoft.com/default.aspx/kb/896861/en-us

samedi 16 février 2008

Faire un cumul avec Reporting Services

Erratum :

J'étais fatigué (retour de TechDays ??) quand j'ai écrit cet article car il y a une solution beaucoup plus simple (que je connaissais en plus). Je n'ai pas voulu écouter la petite voix dans ma tête qui me disait "abruti, abruti" quand j'ai cité la fonction Previous. Bref, la solution est :

=RunningValue(Fields!SubTotal.Value, Sum, Nothing)

Mais je vous invite à lire la solution proposée ci-dessous car elle est utile pour de aggrégats un peu custom (et puis pour dire que je n'ai pas gratté pour rien).

Article Original

Dans cet article nous allons voir comment faire une somme cumulée dans un rapport. Le principe est simple, j'ai des ventes dans le temps et pour chaque date, je veux le cumul depuis la première date.

Reporting Services n'offre pas cette fonctionnalité en natif mais nous allons mettre en place les élements pour le suporter. Sans vouloir gâcher la surprise, je peux déjà vous annoncer que l'on va passer par du code .NET ajouté au rapport.

Pour commencer, voyons ce que nous offre Reporting Services comme fonction en rapport avec notre besoin. Il y a la fonction Previous qui permet de récupérer des données dans la ligne précédente. Cependant, cela ne marche plus à partir de la 3eme ligne car la fonction ne remonte pas plus haut.

L'idée pour résoudre cette problématique est d'utiliser une variable qui va tenir le cumul depuis la première ligne. A chaque ligne, on ajoute la valeur en cours. Pour garder une variable, on doit passer par le code .NET.

Pour ce faire on passe par la fenêtre de propriétés du rapport, dans l'onglet Code.

Oubliez le confort de l'Intellisense, vous n'êtes pas dans Visual Studio, l'éditeur ressemble plutôt à Notepad. En espérant que Reporting Services 2008 apporte des améliorations dans ce sens (comme pour Integration Services). En plus, vous êtes limité uniquement à VB.NET comme langage.

Quant au code en lui-même il est assez simple. On garde un variable Shared (static) et on fournit une petite fonction pour mettre à jour et retourner le cumul.  Ici j'ai choisi le type Decimal car je souhaite retourner une somme d'argent. Rien de plus simple :

Shared cumul As Decimal = 0.0
Public Shared Function GetCumulativeSum(ByVal currentValue As Decimal) As Decimal
  cumul += currentValue
  Return cumul
End Function

Reste à utiliser ce code dans le rapport. Pour cela, on utilise une Expression dans un élément de notre DataRegion :

=Code!GetCumulativeSum(Fields!SalesAmount.Value)

 

Un des problèmes est que l'on ne peut pas utiliser cette technique de cumul à différents endroits. En effet, on ne repart jamais à zéro. Plutôt que de tenter de réinitialiser le cumul dans la première ligne d'une DataRegion, on préfèrera l'utilisation d'un dictionnaire dans le Custom Code. Voici le code utilisant un dictionnaire :

Shared cumuls As System.Collections.Generic.Dictionary(Of String, Decimal) = _
     New System.Collections.Generic.Dictionary(Of String, Decimal)
Public Shared Function GetCumulativeSum(ByVal currentValue As Decimal, ByVal sumKey As String) As Decimal
  If Not cumuls.ContainsKey(sumKey) Then
    cumuls.Add(sumKey, 0.0)
  End If
  cumuls.Item(sumKey) += currentValue
  Return cumuls.Item(sumKey)
End Function

Dans le rapport, on utilisera l'expression suivante :

=Code!GetCumulativeSum(Fields!SalesAmount.Value, "salesInChart")
...
=Code!GetCumulativeSum(Fields!TaxAmount.Value, "taxInMatrix")

Note : pour faire du C#, il faudra coder la fonction dans une assembly et la référencer dans le rapport.

vendredi 13 juillet 2007

Reporting Services - Logon failure

Depuis quelques jours Reporting Services (SSRS pour les intimes) ne marche plus sur mon laptop. J'ai une erreur d'authentification à l'exécution des rapports :

Logon failure: unknown user name or bad password

Après avoir fait le tour des configurations et des logs, je ne comprenais toujours pas pourquoi j'avais cette erreur. Surtout que la preview du rapport se faisait correctement sous Visual Studio.

Donc j'ai cherché un peu et j'ai compris que la raison était mon récent changement de mot de passe (*$#@\ policy d'entreprise ;-))

Je suis donc allé faire un tour dans l'outil de configuration pour retaper mon mot de passe

Reporting Services Configuration -> Execution Account

Ce que j'en retiens :

  • Mettre un compte spécial pour ce genre de configuration
  • Bien lire le message d'erreur jusqu'au bout (...or bad password)

samedi 26 mai 2007

Bewise Developer Conference (BDC2007)

L'événement est passé depuis près d'un mois et je n'avais pas vraiment commencé mon blog mais je vais tout de même vous parler de la BDC 2007.

Les DevDays ne sont plus. Microsoft a remplacé cet événement par un unique show à Paris sur trois jours. Afin de ne pas délaisser la communauté toulousaine, Bewise, co-organisateur des DevDays à Toulouse, a décidé d'organiser son propre événement : la Bewise Developer Conference (plus connue sous son petit nom BDC).

http://www.bewise.fr/BDC2007/

L'événement a été un succès. Plus de 300 personnes sont venus voir les 19 experts de Bewise et Microsoft sur 15 espaces de démonstrations des dernières technologies MS.
Merci à vous.

Personnellement, j'animais un stand sur le Business Intelligence et plus particulièrement sur les problèmatiques de Reporting (avec SQL Server 2005 ;-)). J'ai webcasté ma démo visualisable en suivant le lien ci-dessous :

BDC 2007 - DGD2
BDC 2007 - DGD2

Les slides et autres codes source sont disponible sur le site de Bewise : http://www.bewise.fr/BDC2007/sessions.aspx (PS : la démo WCF est aussi consultable en webcast).

 

Enfin, pour le fun, une vidéo sur les coulisses de cette BDC où je dis n'importe quoi :

BDC 2007 - Les coulisses, épisode 4
BDC 2007 - Les coulisses, épisode 4