Dans cet article, mon ambition est de vous faire partager mon retour d’expérience dans la mise en place d’abonnement piloté par les données via un portail Sharepoint.
A noter que ce processus d’abonnement peut aussi être réalisé sur un serveur RS standalone. Cependant, pour l’exemple nous décrirons les étapes à partir d’un environnement serveur Windows 2012 Server avec le module Sharepoint 2013.
Pré-requis
- Serveur avec Sharepoint 2013 Enterprise
- Reporting Services Intégré à Sharepoint
- Table (SQL) de paramétrage
- Fonction pour décomposer les paramètres multi-valués
- Avoir un utilisateur de base de données ayant les droits suffisants pour requêter les bases disponibles
- Un compte utilisateur avec les droits d’administration du portail Sharepoint
- Créer une bibliothèque dans le contenu du site Sharepoint qui servira de répertoire cible pour les rapports générés
- Ne pas utiliser de fonctions systèmes directement en paramètre du dataset d’un rapport
- Exemple la variable système qui permet de récupérer l’identité de l’utilisateur connecté
- -> USER !USERID

Elle devra au préalable être instanciée et définie directement dans le corps du rapport en allant dans le menu:
Report > Code Function >

Si vous avez des rapports déja développés, il vous faudra les modifier à minima.
Prenons l’exemple suivant.
Considérons un rapport dans lequel un paramètre nommé PSelectentite permet à l’utilisateur de choisir une Business Unit pour laquelle il souhaiterait afficher les diagrammes et graphiques correspondants .
Dans un premier temps, il faut créer un dataset se basant sur la requête alimentant les valeurs par défaut du paramètre PSelectEntite (à l’image du dataset nommé DST_ParamEntite ci-dessous) :

A ceci près que nous y avons ajouté un select ‘’ surligné en jaune qui permettra de gérer le cas de figure où le rapport s’exécute en tache planifié (abonnement).
Ainsi la valeur de la table de paramétrage qui sera lié au paramètre PSelectEntite sera à vide ‘’.
Une fois ce dataset créé, il sera visible dans la liste des datasets (nommé Param_Abonnements dans le cas présent)

Une autre solution serait de modifier le dataset partagé DST_ParamEntite pour y adjoindre la partie surlignée en jaune dans l’exemple ci-desssus plutôt que d’en créer un nouveau.
Ainsi nous définissons le paramètre PSelectEntite comme suit :
Available Values >
- Dataset : Param_Abonnements
- Value Field : VAL_CIBLE
- Label Fields : VAL_CIBLE
Default Values >
- Specify value : valeur « »

Le deuxième paramètre essentiel au bon déroulement de l’exécution de l’abonnement est le paramètre Pentite.
A noter qu’il ne doit pas être multi-valué et demeure caché :

Ce paramètre est un paramètre dit « en cascade » car il s’alimente du paramètre précédent PSelectEntite.
En effet, Afin de contourner le problème de valeurs multiples, nous utilisons la fonction vba Join() :

Il est à noter que la catégorie valeurs disponibles (available values) pour ce paramètre est définie à « None » :

La dernière étape consiste en la modification de tous les datasets faisant appel au paramètre Pentite :
Dans notre exemple les datasets concernés sont les suivants DST_Details et DST_Graph_Synthese.
Nous faisons appel à une fonction fn_ParseText2Table qui permettra de décomposer le paramètre Pentite.

Objectifs
Une fois les pré-requis validés et implémentés, nous allons nous attaquer à la création de l’abonnement.
Ceci en plusieurs étapes :
- Gérer l’aspect pilotage par les données dans une table de paramétrage
- Créer un abonnement sur un rapport
- Planifier l’envoi du rapport
- Intégration et utilisation du portail Sharepoint avec reporting Services pour exécuter et planifier à intervalle régulier l’envoi du document dans une Bibliothèque Sharepoint
Gestion des sources de données
Dans le panneau de gauche du portail sharepoint, Cliquer sur le menu Connexions afin de définir la manière dont les rapports accèdent aux sources de données :

Il est important de préciser que Microsoft préconise l’utilisation d’informations stockées comme défini ci-après :

Créer une table de paramétrage avec les champs suivants, le nom de la planification, le nom du rapport, le libellé et la valeur du paramètre, le format de sortie et l’id de l’utilisateur connecté.
Pour un rapport X, il faut insérer autant de lignes qu’il y a de paramètres visibles demandant une saisie de l’utilisateur dans la table de paramétrage nommé pour l’exexmple dbo.T_PLANIFICATION dans l’exemple ci-dessous :

Par exemple le rapport Dette Nette – Details possède trois paramètres :
- Périmètre
- Entités
- Date des données
Ces informations seront pivotés dans la requête qui sera exécutée lors de l’abonnement au rapport afin d’obtenir une ligne unique pour un abonnement ( Sans quoi l’outil de création d’abonnement Sharepoint créera autant de document pdf en sortie qu’il y a de ligne dans la table – Attention donc à bien restreindre les données lors de la définition de l’abonnement) :
select
NOM_PLANIF ,NOM_RAPPORT,CIBLE,FORMAT_SORTIE,USERID,[DATEDONNEES] AS DATEDONNEES,[ENTITES] AS ENTITES,
» as IDSEL,
[PERIMETRE] AS PERIMETRE
into #PLANIF
from
(
select
NOM_PLANIF ,
NOM_RAPPORT,
CIBLE,
FORMAT_SORTIE,
USERID,
LIB_PARAM,
VALEUR_PARAM
from dbo.T_PLANIFICATION
)ps
pivot
(
MAX(VALEUR_PARAM)
FOR LIB_PARAM IN
(
[DATEDONNEES],[ENTITES],[PERIMETRE]
)
)as pvt
select *, NOM_RAPPORT+’ ‘+Cast((SELECT convert(DATE,
CASE DATEDONNEES
WHEN ‘VEILLE’ THEN convert(date,convert(varchar,getdate()-1,103),103)
WHEN ‘JOUR’ THEN convert(date,convert(varchar,getdate(),103),103)
WHEN ’31/M’ THEN DATEADD(d,-1,DATEADD(m, DATEDIFF(m,0, GETDATE() )+1,0) )
WHEN ’31/M-1′ THEN convert(date,convert(varchar,dateadd(dd, -day(getdate()), getdate()),103),103)
WHEN ’31/M-1 Ouvré’ THEN (CASE WHEN datename(weekday, (convert(DATETIME, convert(VARCHAR, dateadd(dd, – day(getdate()), getdate()), 103), 103))) = ‘Sunday’ THEN convert(DATETIME, convert(VARCHAR, (convert(DATETIME, convert(VARCHAR, dateadd(dd, – day(getdate()), getdate()), 103), 103)) – 2, 103), 103) ELSE CASE WHEN datename(weekday, (convert(DATETIME, convert(VARCHAR, dateadd(dd, – day(getdate()), getdate()), 103), 103))) = ‘Saturday’ THEN convert(DATETIME, convert(VARCHAR, (convert(DATETIME, convert(VARCHAR, dateadd(dd, – day(getdate()), getdate()), 103), 103)) – 1, 103), 103) ELSE (convert(DATETIME, convert(VARCHAR, dateadd(dd, – day(getdate()), getdate()), 103), 103)) END END)
ELSE convert(date,DATEDONNEES,103)
END
,102) ) as nvarchar(50)) as NomFichierGénéré
from #PLANIF
where NOM_RAPPORT=’Dette Nette – Details’
drop table #PLANIF
|
Ci-dessous un aperçu des valeurs obtenues dans la table de paramétrage après application du pivot :

NB : Le champ cible fait référence au lieu de dépôt des rapports générés (Bibliothèque sharepoint).
Il est à noter que les dossiers présents dans la bibliothèque doivent éviter de contenir des caractères spéciaux tels que les accents graves ou aigus.

Cette fonction sera utilisée dans les datasets faisant appel au paramètre Pentite.
- Définition de l’abonnement
Un abonnement se construit en plusieurs étapes.
Tout d’abord en cliquant sur le rapport pour lequel l’abonnement est souhaité.
Dans la partie Gérer > Gérer les abonnements, cliquer sur Créer un nouvel abonnement piloté par les données.
Une nouvelle page apparait nous permettant d’établir les premiers éléments de connexions :

La deuxième étape nous permet de créer la requête SQL d’abonnement (voir script) :

Cliquer sur le bouton valider, un message apparait pour vous avertir de sa bonne exécution

L’une des étapes les plus importantes est la suivante concernant le mapping des paramètres associés aux colonnes de la requête qui vient d’être généré :

En résumé le Mapping des paramètres devra prendre la forme suivante :
Nom du paramètre |
Colonne associée dans la table de paramétrage |
UserId |
USERID |
PEntiteSecu |
Valeur par défaut du paramètre |
Périmètre |
PERIMETRE |
Entités |
IDSEL |
Entités Validées |
ENTITES |
Date de Données |
DATEDONNEES |
|
|
Une fois la première partie effectuée nous accédons à une deuxième page qui permettra de spécifier le Chemin de dépôt du fichier généré, le format de sortie ainsi que son nom: (Tous les trois mappés consécutivement aux valeurs de la table de paramétrage : NomFichierGénéré, CIBLE et FORMAT de sortie. (Laisser par défaut les autres options )

Il est possible de créer plusieurs planifications et les associer aux abonnements créés pour chacun des rapports.
Dans notre exemple la planification partagé porte le nom de PlanifPartagéHebdoTest :

La partie planification se définit dans la partie paramètre du site > Gérer les planifications partagées

Plusieurs options s’offrent à nous, dont la fréquence d’émission, les jours, la répétition, la date de début et de fin d’exécution :

Une fois la planification validée, elle apparait sous la forme suivante :

En conclusion de cet article, nous pouvons affirmer que la mise en place de l’abonnement piloté par les données comporte pas mal d’avantages pour le client mais pourrait à l’avenir intégrer un véritable suivi précis des documents envoyés. Ce qui permettrait en cas d’échec d’avoir un monitoring et feedback précis des rapports en erreur.
D’autant plus que le déclenchement d’un abonnement ne peut se faire que sur un planning horaire .
Quid d’un déclenchement via une ligne de commande ou un évènement (par exemple la fin d’une autre tâche)?
Nous pouvons ajouter comme contrainte le fait que les versions Enterprise de Reporting Services set Sharepoint soient nécessaires à son implémentation.