octobre
2009
Ci-dessous un problème concernant le passage de paramètres d’un rapport à l’autre de manière user-friendly avec SSRS.
Voici comment procéder :
1 – Contexte :
Création d’un rapport sur des formulaires InfoPath stockés en xml dans une base de données SQL Serveur 2008. Les formulaires contenant des informations liées à la gestion de projet.
Le rapport à construire devait ressembler au formulaire InfoPath et pouvait contenir les informations d’un ou plusieurs rapports.
Dans le cas d’un rapport sur plusieurs formulaires, le rassemblement des données devait se faire section par section.
Représentons le problème de la manière suivante:
Sx – Section de rapport
Fx – Données de formulaire
Le rassemblement des données devant se pésenter comme ceci :
• S1
o F1
o F2
o …
o Fx
• S2
o F1
o F2
o …
o Fx
• …
• Sx
o F1
o F2
o …
o Fx
La granularité définissant un formulaire étant:
Un rapport de projet d’une division spécifique, d’une entité spécifique pour une période déterminée.
Ou d’une autre manière:
• Entité
o Division
Project
• Formulaire pour une période spécifique
2 – Première approche : les paramètres à valeurs multiples
Créer le layout du rapport, créer quelques sous rapports pour les différentes sections pour un formulaire, puis l’étendre à plusieurs, en choisissant de définir les paramètres projet et période comme paramètres à valeurs multiples, ce qui à priori devait permettre de sélectionner plusieurs projets et plusieurs périodes.
A utiliser, des paramètres en cascade ayant pour ordre la hiérarchie définie ci-dessus.
Les paramètres Projet et Période pouvant recevoir plusieurs valeurs alors qu’Entité et Division non.
Mais, nous rencontrons 2 problèmes:
• Impossibilité de comparer 2 projets de divisions/entités différentes.
• Impossibilité de rapporter sur un formulaire F1 pour une période P1 et un formulaire F2, pointant sur un autre projet, pour une période P2. Lors de ce choix dans les paramètres, il était retourné F1P1, F1P2, F2P1, F2P2.
3 – Deuxième approche : L’arborescence de paramètres
Malheureusement, il n’y a pas moyen de montrer un arbre de paramètres ou les feuilles de cet arbre pointerais sur l’ID d’un formulaire spécifique.
Il faut donc créer un rapport de paramètres.
Créer un parametre appelé ParameterList, défini comme string et autorisant les valeurs nulles et les chaines vides.
Ensuite créer un rapport sur les données, groupées comme ceci :
• Entité
o Division
Project
• Période
Au niveau des feuilles, ajouter une action pour construire dynamiquement la chaine de paramètres à passer au rapport suivant, basé sur l’ID d’un formulaire.
L’action rappelle le rapport lui-même en se passant comme paramètre ParameterList le retour de la fonction suivante :
'Keep the parameter list value in a template variable
Dim returnParameterList as String
returnParameterList = ParameterList
'Create a full parameter:
'The "_" prefix is used to keep strings unique
Dim parameterAlias as String
parameterAlias = "_" + SelectedParam + ","
If (Replace(returnParameterList, parameterAlias, "") = ParameterList) Then
Return returnParameterList + parameterAlias
Else
Return Replace(returnParameterList, parameterAlias, "")
End If
End Function
Cette fonction à 2 rôles:
• Ajouter un nouvel ID de formulaire à la liste de formulaires à afficher
• Retirer de la liste des formulaires à afficher un ID déjà existant
Lorsqu’un ID n’existe pas encore dans la liste, la fonction l’y place sous le format suivant : _ID,
La virgule sert de délimiteur de paramètres à même titre que l’underscore.
Voici pourquoi j’utilise ces artéfacts:
• Sans artéfact,
Soit la chaine suivante :
1, 2, 10, 15, 30, 31,
Imaginons que l’on veuille supprimer l’ID 1:
• Replace(ParameterList,”1”,””) retournerait , 2, 0, 5, 30, 3, Ca casse complètement notre liste d’ID
• Replace(ParameterList,”1,”,””) retournerait 2, 10, 15, 30, 3 Un peu mieux mais toujours pas correct
• Avec artéfact,
Soit la chaine suivante
_1, _2, _10, _15, _30, _31,
• Replace(ParameterList,”_1,”,””) retournerait _2, _10, _15, _30, _31, Ca y est !
Par principe d’être user-friendly, utilisons une fonction pour parser cette liste de paramètres et montrer des checkbox pour les formulaires sélectionnés. Voici le code:
'Create a full parameter:
'The "_" prefix is used to keep strings unique
Dim StatusReportIDAlias = "_" + StatusReportID + ","
If (Replace(ParameterList, StatusReportIDAlias, "") = ParameterList) Then
Return "checkboxempty"
Else
Return "checkboxselected"
End If
End Function
Nous obtenons un rapport, affichant la liste des formulaires en format « arbre », avec des boutons pour replier/deplier les différentes sections et des checkbox permettant la sélection des paramètres.
Finalement nous créons un bouton (textbox) pour passer les IDS de formulaires au rapport affichant les données desdits formulaires en utilisant le code suivant qui enlève la dernière virgule et les underscores et qui finalement éclate la chaine en un tableau de paramètres:
Et ca marche !!!
Merci à Ptit_Dje pour avoir partager ses astuces avec nous
Articles récents
- Qu’est-ce que la modélisation multidimensionnelle ?
- SQL Server Reporting Services : Paramètres dynamiques
- La FAQ Microsoft Business Intelligence est née
- Business Objects et SAP proposent une nouvelle offre intégrée de BI à destination des PME
- Jaspersoft et Talend offrent une solution d’intégration de données adaptée aux besoins spécifiques des entreprises
Commentaires récents
- Qu’est-ce que la modélisation multidimensionnelle ? dans
- Qu’est-ce que la modélisation multidimensionnelle ? dans
- Qu’est-ce que la modélisation multidimensionnelle ? dans
- Qu’est-ce que la modélisation multidimensionnelle ? dans
- Stimulsoft DevReports Studio. La modification de rapports Web est aussi facile qu’une tarte. dans