Partager via


Créer des fournisseurs de données de filtrage pour PerformancePoint Services dans SharePoint

Découvrez comment créer le composant fournisseur de données dans une extension de filtre personnalisée pour PerformancePoint Services.

Quels sont les fournisseurs de données personnalisés pour PerformancePoint Services ?

Dans PerformancePoint Services, les fournisseurs de données personnalisées récupérer des données à partir de la source de données sous-jacente d'un filtre et définissent la manière d'utiliser les données. Plus important encore, les fournisseurs de données 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 des données. Pour plus d'informations, voir Filtres de PerformancePoint Services.

Les procédures suivantes et les exemples qui montrent comment créer, configurer et définir un fournisseur de données de filtre sont basées sur la classe SampleFilterDataProvider à partir de l' exemple d'objets personnalisés. L'éditeur est une application web léger qui permet aux utilisateurs de modifier le nom et la description de l'état. Pour obtenir le code complet de la classe , voir Exemple de code : Créer un fournisseur de données pour les filtres de PerformancePoint Services personnalisés dans SharePoint.

Nous vous recommandons d’utiliser l’exemple de fournisseur de données en guise de modèle. L'exemple montre comment appeler des objets dans l'API PerformancePoint Services et illustre les meilleures pratiques pour le développement de PerformancePoint Services.

Créer des fournisseurs de données pour les filtres personnalisés PerformancePoint Services

  1. Install PerformancePoint Services, or copy the DLLs that your extension uses (listed in step 3) to your computer. Pour plus d’informations, consultez DLL avec bibliothèques de classes.

  2. 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#.

    Vous devez signer votre DLL en utilisant un nom fort. Par ailleurs, assurez-vous que tous les assemblys référencés par votre DLL ont des noms forts. Pour plus d’informations sur la signature d’un assembly avec un nom fort et sur la création d’une paire de clés publique/privée, consultez Guide pratique pour créer une paire de clés publique/privée.

  3. Ajoutez la suivante PerformancePoint Services DLL en tant que références d'assembly 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.

  4. Dans votre classe de fournisseur, ajoutez des directives using pour les espaces de noms PerformancePoint Services suivantes :

    Selon la fonctionnalité de votre extension, il se peut que d'autres directives using soient requises.

  5. Héritez de la classe de base CustomParameterDataProvider .

  6. 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.

  7. Remplacez la méthode GetId() pour retourner l’identificateur de votre fournisseur de données.

  8. Remplacez la méthode GetDisplayDataInternal pour définir un objet DataTable afin de stocker les valeurs de données 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

      [!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 :

    • Il fait référence à un type de source de données personnalisé à l’aide de la propriété SubTypeId de la source de données, qui est la même valeur que l’attribut subType inscrit dans le fichier PerformancePoint Services web.config pour l’extension de source de données.
    • Il fait référence à une source de données native à l’aide de la propriété SourceName , qui retourne un champ de la classe DataSourceNames .
  9. Remplacez 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.

Exemple de code : Créer un fournisseur de données pour les filtres de PerformancePoint Services personnalisés dans SharePoint

L’exemple de code suivant montre comment un fournisseur de données récupère des valeurs à partir d’un service web ou d’une feuille de calcul Excel et retourne des objets DataTable pour les données d’affichage et les données de message du filtre.

Avant de 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) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.KeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.KeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.DisplayColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.DisplayColumn))
            {
                dataTable.Columns.Add(parameterDefinition.DisplayColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.ParentKeyColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.ParentKeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.ParentKeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.IsDefaultColumn) &amp;&amp; !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;
        }
    }
}

Étapes suivantes

Après avoir créé un fournisseur de données et un éditeur de filtre (y compris son interface utilisateur, si nécessaire), déployez l’extension comme décrit dans Guide pratique pour inscrire manuellement PerformancePoint Services extensions.

Voir aussi