Поделиться через


Создание поставщиков данных фильтров для PerformancePoint Services в SharePoint

Узнайте, как создать компонент поставщика данных в расширении специальных фильтров для PerformancePoint Services.

Что такое настраиваемые поставщики данных для Службы PerformancePoint Services ?

В Службы PerformancePoint Services настраиваемые поставщики данных извлечения данных из источника данных в фильтре и определяют, как использовать данные. Самое главное, поставщики данных указывают значения данных для предоставления в элементе управления фильтром и данные, которые можно использовать в качестве начальной точки фильтра. Поставщик данных также сохраняет значение, выбранной пользователем в элементе управления фильтра, который отправляется в фильтрации объекты-получатели. Поставщики данных используют два объекта DataTable для организации и хранения данных. Для получения дополнительных сведений см Фильтры служб PerformancePoint.

Следующие процедуры и примеры, показывающие, как создать, настроить и определите поставщика данных фильтра основаны на класс SampleFilterDataProvider из настраиваемых объектов. Редактор — тонкие веб-приложения, которое позволяет пользователям изменять имя и описание отчета. Полный код для класса см. в разделе Пример кода. Создание поставщика данных для пользовательских фильтров PerformancePoint Services в SharePoint.

Мы рекомендуем использовать примера поставщика данных в качестве шаблона. В примере показано, как вызывать объекты в Службы PerformancePoint Services API и демонстрируется советы и рекомендации по разработке Службы PerformancePoint Services.

Создание поставщика данных для настраиваемых Службы PerformancePoint Services фильтров

  1. Установка Службы PerformancePoint Services или копирование библиотеки DLL, которые использует расширения (перечисленных в шаге 3) на своем компьютере. Дополнительные сведения см. в разделе Библиотеки DLL с библиотеками классов.

  2. В Visual Studio создайте библиотеку классов C#. Если библиотека классов для расширения уже создана, добавьте новый класс C#.

    DLL-библиотеку необходимо подписать строгим именем. Кроме того, убедитесь, что все сборки, на которые ссылается DLL-библиотека, имеют строгие имена. Сведения о том, как подписать сборку со строгим именем и как создать пару открытого и закрытого ключей, см. в разделе Практическое руководство. Создание пары открытого и закрытого ключей.

  3. Добавьте следующие Службы PerformancePoint Services библиотеки DLL в качестве ссылок на сборки в проект:

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.PerformancePoint.Scorecards.Server.dll

    В зависимости от функциональности расширения могут потребоваться другие ссылки в проекте.

  4. В классе поставщика добавьте директивы using для следующих пространств имен Службы PerformancePoint Services.

    В зависимости от функциональности расширения могут потребоваться другие директивы using.

  5. Наследуется от базового класса CustomParameterDataProvider .

  6. Задайте строковый идентификатор для имени поставщика данных. Он должен совпадать с ключом, добавленным в раздел CustomParameterDataProviders файла web.config при регистрации расширения. Дополнительные сведения см. в разделе How to: Manually Register PerformancePoint Services Extensions.

  7. Переопределите метод GetId(), чтобы вернуть идентификатор поставщика данных.

  8. Переопределите метод GetDisplayDataInternal , чтобы определить объект DataTable для хранения значений данных из базового источника данных. Фильтр использует этот метод для заполнения элемента управления фильтра. Таблица с отображаемыми данными должна содержать следующие имена столбцов.

    • Key Уникальный идентификатор записи. Это значение не может быть равно NULL. В целях производительности и безопасности элементы управления выдают только ключ, но не значения из других столбцов.

    • Display Значение, которое отображается в элементе управления фильтра.

    • ParentKey Это значение используется для упорядочения иерархических данных в элементе управления дерева.

    • IsDefault Это значение используется для сохранения фильтра.

      Совет

      [!Совет] Можно добавить дополнительные столбцы для расширения функциональности фильтра.

    GetDisplayDataInternal вызывает метод DataSourceRegistry.GetDataSource(DataSource) для проверки типа источника данных по имени следующим образом.

    • Он ссылается на пользовательский тип источника данных с помощью свойства SubTypeId источника данных, которое является тем же значением, что и атрибут subType, зарегистрированный в файле PerformancePoint Services web.config расширения источника данных.
    • Он ссылается на собственный источник данных с помощью свойства SourceName , которое возвращает поле из класса DataSourceNames .
  9. Переопределите метод GetMessageData , чтобы сохранить выбор пользователя из элемента управления фильтра. Фильтр использует этот метод при передаче выбора пользователя потребителям.

Пример кода. Создание поставщика данных для пользовательских фильтров PerformancePoint Services в SharePoint

В следующем примере кода показано, как поставщик данных получает значения из веб-службы или листа Excel и возвращает объекты DataTable для отображаемых данных фильтра и данных сообщений.

Перед компиляцией этого примера кода требуется настроить среду разработки, как описано в разделе Создание и настройка класса поставщика.

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;
        }
    }
}

Дальнейшие действия

После создания поставщика данных и редактора фильтров (включая его пользовательский интерфейс, если это необходимо), разверните расширение, как описано в разделе Практическое руководство. Регистрация расширений PerformancePoint Services вручную.

См. также