Procédure : Créer des fournisseurs de données pour les filtres des services PerformancePoint Services
Dernière modification : mardi 30 août 2011
Dans Services PerformancePoint dans Microsoft SharePoint Server 2010, les fournisseurs de données extraient des données de la source de données sous-jacente d’un filtre et définissent comment utiliser les données. Par ailleurs, ils spécifient les valeurs de données à exposer dans le contrôle de filtre et les données qui peuvent être utilisées comme point de départ du filtre. Un fournisseur de données stocke également la valeur sélectionnée par un utilisateur à partir du contrôle de filtre, qui est ensuite envoyée aux consommateurs de filtre. Les fournisseurs de données utilisent deux objets DataTable pour organiser et stocker les données. Pour plus d’informations, voir Filtres de PerformancePoint Services.
S’applique à : SharePoint Server 2010
Les procédures et exemples de cette rubrique sont basés sur la classe SampleFilterDataProvider de l’exemple d’objets personnalisés. L’éditeur est une application Web légère qui permet aux utilisateurs de modifier le nom et la description du rapport. Le code complet de la classe est fourni dans la section « Exemple » de cette rubrique.
Notes
Nous vous recommandons d’utiliser l’exemple de fournisseur de données en guise de modèle. Cet exemple montre comment appeler des objets dans l’API PerformancePoint Services et illustre les meilleures pratiques pour le développement PerformancePoint Services.
La création d’un fournisseur de données nécessite d’effectuer les deux procédures de base suivantes :
Création et configuration de la classe de fournisseur
Définition de la fonctionnalité de fournisseur
Pour créer un fournisseur personnalisé, commencez par créer la classe de fournisseur.
Pour créer et configurer la classe de fournisseur
Installez PerformancePoint Services ou copiez les DLL utilisées par votre extension (répertoriées à l’étape 3) sur votre ordinateur. Pour plus d’informations, voir DLL PerformancePoint Services utilisées dans les scénarios de développement.
Dans Visual Studio, créez une bibliothèque de classes C#. Si vous avez déjà créé une bibliothèque de classes pour votre extension, ajoutez une nouvelle classe C#.
Ajoutez les DLL PerformancePoint Services suivantes en tant que références d’assemblys au projet :
Microsoft.PerformancePoint.Scorecards.Client.dll
Microsoft.PerformancePoint.Scorecards.Server.dll
Selon la fonctionnalité de votre extension, il se peut que d’autres références de projet soient requises.
Dans votre classe de fournisseur, ajoutez des directives using pour les espaces de noms PerformancePoint Services suivants :
Selon la fonctionnalité de votre extension, il se peut que d’autres directives using soient requises.
Héritez de la classe de base CustomParameterDataProvider.
Après avoir créé et configuré la classe de fournisseur, vous devez définir la fonctionnalité de votre fournisseur.
Pour définir la fonctionnalité du fournisseur
Définissez l’identificateur de chaîne pour le nom de fournisseur de données. Cet identificateur doit correspondre à la clé que vous ajoutez à la section CustomParameterDataProviders du fichier web.config lors de l’enregistrement de l’extension. Pour plus d’informations, voir Procédure : enregistrer manuellement des extensions PerformancePoint Services.
Substituez la méthode GetId() pour renvoyer l’identificateur de votre fournisseur de données.
Substituez la méthode GetDisplayDataInternal afin de définir un objet DataTable pour le stockage des valeurs de données provenant de la source de données sous-jacente. Le filtre utilise cette méthode pour remplir le contrôle de sélection de filtre. La table de données d’affichage doit contenir les noms de colonnes suivants :
Key L’identificateur unique de l’enregistrement. Cette valeur ne peut pas être Null. Pour des raisons de performances et de sécurité, les contrôles émettent uniquement une clé, mais n’émettent pas de valeurs des autres colonnes.
Display La valeur affichée dans le contrôle de filtre.
ParentKey Cette valeur sert à organiser les données hiérarchiques dans un contrôle d’arborescence.
IsDefault Cette valeur est utilisée à des fins de persistance de filtre.
Conseil Vous pouvez ajouter d’autres colonnes afin d’étendre la fonctionnalité du filtre.
GetDisplayDataInternal appelle la méthode DataSourceRegistry.GetDataSource(DataSource) pour vérifier le type de source de données par nom, de la manière suivante :
Elle fait référence à un type de source de données personnalisé au moyen de la propriété SubTypeId de la source de données, qui est une valeur identique à l’attribut subType enregistré dans le fichier web.config PerformancePoint Services de l’extension de source de données.
Elle fait référence à une source de données native au moyen de la propriété SourceName, qui renvoie un champ à partir de la classe DataSourceNames.
Substituez la méthode GetMessageData pour stocker la sélection de l’utilisateur à partir du contrôle de filtre. Le filtre utilise cette méthode lorsqu’il envoie les sélections de l’utilisateur aux consommateurs.
Étape suivante : après avoir créé un fournisseur de données et un éditeur de filtre (notamment son interface utilisateur, le cas échéant), déployez l’extension comme décrit dans Procédure : enregistrer manuellement des extensions PerformancePoint Services. Pour obtenir des instructions sur la façon d’installer et de configurer l’exemple d’extension de filtre, voir la section « Installation des objets de rapport, de filtre et de source de données de l’exemple » dans Exemple de code : objets personnalisés de rapport, de filtre et de source de données tabulaires.
Exemple
L’exemple de code suivant montre comment un fournisseur de données extrait des valeurs à partir d’un service Web ou d’une feuille de calcul Excel et renvoie des objets DataTable pour les données de message et les données d’affichage du filtre.
Notes
Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe de fournisseur.
using System.Data;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.Server.Extensions;
namespace Microsoft.PerformancePoint.SDK.Samples.SampleFilter
{
// Represents the sample filter's data provider.
public class SampleFilterDataProvider : CustomParameterDataProvider
{
// This value must match the key that you register for this extension
// in the CustomParameterDataProviders section in the web.config file.
private const string dataProviderName = "SampleFilterDataProvider";
// Returns a table of all possible values (rows) for the
// filter’s beginpoints. The filter's BeginPoint property returns
// one ParameterDefinition object.
protected override DataTable GetDisplayDataInternal(ParameterDefinition parameterDefinition, RepositoryLocation parameterSourceLocation, object custom)
{
DataTable retrievedData = null;
// Get the data source.
DataSource parameterDataSource = SafeGetDataSource(parameterSourceLocation);
if (null != parameterDataSource)
{
// Verify that the data source is the sample data source
// or an Excel workbook, which are the types that the
// sample supports.
// If you modify these types of data source, you must make
// the corresponding change in the filter's editor.
if (parameterDataSource.SourceName == "WSTabularDataSource" || parameterDataSource.SourceName == DataSourceNames.ExcelWorkbook)
{
IDataSourceProvider parameterDataSourceProvider =
DataSourceRegistry.GetDataSource(parameterDataSource);
if (null != parameterDataSourceProvider)
{
var dataSourceMetadata = parameterDataSourceProvider as IDataSourceMetadata;
if (null != dataSourceMetadata)
{
// Get the data and store it in the retrievedDataSet
// variable. The -1 parameter returns all records
// from the data source.
DataSet retrievedDataSet = dataSourceMetadata.GetPreviewDataSet(-1);
// Verify that the dataset contains data.
if (retrievedDataSet != null &&
retrievedDataSet.Tables != null &&
retrievedDataSet.Tables.Count > 0 &&
retrievedDataSet.Tables[0] != null &&
retrievedDataSet.Tables[0].Columns != null &&
retrievedDataSet.Tables[0].Columns.Count > 0 &&
retrievedDataSet.Tables[0].Rows != null &&
retrievedDataSet.Tables[0].Rows.Count > 0 &&
retrievedDataSet.Tables[0].Columns.Contains(parameterDefinition.KeyColumn))
{
retrievedData = retrievedDataSet.Tables[0];
}
}
}
}
if (null != retrievedData)
{
// Name the display data table.
retrievedData.TableName = "ParamData";
// Verify that the table has the correct structure.
EnsureDataColumns(retrievedData, parameterDefinition);
bool firstRowSeen = false;
foreach (DataRow row in retrievedData.Rows)
{
// Set the ParentKeyColumn to null because the data
// does not have a hierarchical structure.
row[parameterDefinition.ParentKeyColumn] = null;
// Set the IsDefaultColumn column in the first row to true.
row[parameterDefinition.IsDefaultColumn] = !firstRowSeen;
if (!firstRowSeen)
{
firstRowSeen = true;
}
}
// Set the column visibility.
SetColumnVisibility(retrievedData);
}
}
return retrievedData;
}
// Adds the ShowColumn extended property to a column in the display data table
// and sets it to true. This exposes the column in Dashboard Designer as
// a source value for the beginpoint.
private static void SetColumnVisibility(DataTable displayData)
{
for (int i = 0; i < displayData.Columns.Count; i++)
{
if (!displayData.Columns[i].ExtendedProperties.Contains("ShowColumn"))
{
displayData.Columns[i].ExtendedProperties.Add("ShowColumn", true);
}
}
}
// Verify that all required columns are in the data table.
// The data table returned by this method is expected to contain a
// Key, ParentKey, IsDefault, Display, and an arbitrary number of
// Value columns.
// The specific column names (except for Value columns) are defined
// in the filter's ParameterDefinition object, which is referenced by
// the filter's BeginPoint property.
private static void EnsureDataColumns(DataTable dataTable, ParameterDefinition parameterDefinition)
{
if (!string.IsNullOrEmpty(parameterDefinition.KeyColumn) && !dataTable.Columns.Contains(parameterDefinition.KeyColumn))
{
dataTable.Columns.Add(parameterDefinition.KeyColumn);
}
if (!string.IsNullOrEmpty(parameterDefinition.DisplayColumn) && !dataTable.Columns.Contains(parameterDefinition.DisplayColumn))
{
dataTable.Columns.Add(parameterDefinition.DisplayColumn);
}
if (!string.IsNullOrEmpty(parameterDefinition.ParentKeyColumn) && !dataTable.Columns.Contains(parameterDefinition.ParentKeyColumn))
{
dataTable.Columns.Add(parameterDefinition.ParentKeyColumn);
}
if (!string.IsNullOrEmpty(parameterDefinition.IsDefaultColumn) && !dataTable.Columns.Contains(parameterDefinition.IsDefaultColumn))
{
dataTable.Columns.Add(parameterDefinition.IsDefaultColumn, typeof(bool));
}
}
// Returns the unique string identifier of the data provider.
// This value must match the key that you register for this extension
// in the CustomParameterDataProviders section in the web.config file.
public override string GetId()
{
return dataProviderName;
}
// Returns a table of rows that match the keys in the passed
// ParameterMessage object.
// This method is used by controls that accept parameters, such as
// scorecard and reports. It can also apply a Post Formula.
public override DataTable GetMessageData(RepositoryLocation providerLocation, ParameterMessage parameterMessage, RepositoryLocation parameterSourceLocation, ParameterMapping parameterMapping, object custom)
{
DataTable msgTable = null;
// The ParameterMapping object contains information about
// linked dashboard items.
// The CustomData object is optionally used to store information
// that is not stored in other properties.
DataTable displayTable = GetDisplayDataInternal(parameterMessage, parameterSourceLocation, custom);
if (null != displayTable)
{
msgTable = displayTable.Clone();
for (int i = 0;i < parameterMessage.Values.Rows.Count; i++)
{
for (int j = 0;j < displayTable.Rows.Count; j++)
{
if (!parameterMessage.Values.Rows[i][parameterMessage.KeyColumn].Equals(displayTable.Rows[j][parameterMessage.KeyColumn].ToString()))
continue;
msgTable.ImportRow(displayTable.Rows[j]);
break;
}
}
}
return msgTable;
}
}
}
Compilation du code
Pour pouvoir compiler cet exemple de code, vous devez configurer votre environnement de développement comme décrit dans Pour créer et configurer la classe de fournisseur.
Sécurité
Vous devez signer votre DLL avec un nom fort. De plus, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la façon de signer un assembly avec un nom fort et sur la façon de créer une paire de clés publique/privée, voir How to: Create a Public/Private Key Pair.
Voir aussi
Tâches
Procédure : Créer des éditeurs pour les filtres des services PerformancePoint Services
Concepts
Filtres de PerformancePoint Services
Autres ressources
Créer des objets personnalisés pour les services PerformancePoint Services
Exemples de code pour les pour les services PerformancePoint Services dans SharePoint Server 2010