Создание поставщиков данных фильтров для PerformancePoint Services в SharePoint
Узнайте, как создать компонент поставщика данных в расширении специальных фильтров для PerformancePoint Services.
Что такое настраиваемые поставщики данных для Службы PerformancePoint Services ?
В Службы PerformancePoint Services настраиваемые поставщики данных извлечения данных из источника данных в фильтре и определяют, как использовать данные. Самое главное, поставщики данных указывают значения данных для предоставления в элементе управления фильтром и данные, которые можно использовать в качестве начальной точки фильтра. Поставщик данных также сохраняет значение, выбранной пользователем в элементе управления фильтра, который отправляется в фильтрации объекты-получатели. Поставщики данных используют два объекта DataTable для организации и хранения данных. Для получения дополнительных сведений см Фильтры служб PerformancePoint.
Следующие процедуры и примеры, показывающие, как создать, настроить и определите поставщика данных фильтра основаны на класс SampleFilterDataProvider из настраиваемых объектов. Редактор тонкие веб-приложения, которое позволяет пользователям изменять имя и описание отчета. Полный код для класса см. в разделе Пример кода. Создание поставщика данных для пользовательских фильтров PerformancePoint Services в SharePoint.
Мы рекомендуем использовать примера поставщика данных в качестве шаблона. В примере показано, как вызывать объекты в Службы PerformancePoint Services API и демонстрируется советы и рекомендации по разработке Службы PerformancePoint Services.
Создание поставщика данных для настраиваемых Службы PerformancePoint Services фильтров
Установка Службы PerformancePoint Services или копирование библиотеки DLL, которые использует расширения (перечисленных в шаге 3) на своем компьютере. Дополнительные сведения см. в разделе Библиотеки DLL с библиотеками классов.
В Visual Studio создайте библиотеку классов C#. Если библиотека классов для расширения уже создана, добавьте новый класс C#.
DLL-библиотеку необходимо подписать строгим именем. Кроме того, убедитесь, что все сборки, на которые ссылается DLL-библиотека, имеют строгие имена. Сведения о том, как подписать сборку со строгим именем и как создать пару открытого и закрытого ключей, см. в разделе Практическое руководство. Создание пары открытого и закрытого ключей.
Добавьте следующие Службы PerformancePoint Services библиотеки DLL в качестве ссылок на сборки в проект:
- Microsoft.PerformancePoint.Scorecards.Client.dll
- Microsoft.PerformancePoint.Scorecards.Server.dll
В зависимости от функциональности расширения могут потребоваться другие ссылки в проекте.
В классе поставщика добавьте директивы using для следующих пространств имен Службы PerformancePoint Services.
В зависимости от функциональности расширения могут потребоваться другие директивы using.
Наследуется от базового класса CustomParameterDataProvider .
Задайте строковый идентификатор для имени поставщика данных. Он должен совпадать с ключом, добавленным в раздел CustomParameterDataProviders файла web.config при регистрации расширения. Дополнительные сведения см. в разделе How to: Manually Register PerformancePoint Services Extensions.
Переопределите метод GetId(), чтобы вернуть идентификатор поставщика данных.
Переопределите метод GetDisplayDataInternal , чтобы определить объект DataTable для хранения значений данных из базового источника данных. Фильтр использует этот метод для заполнения элемента управления фильтра. Таблица с отображаемыми данными должна содержать следующие имена столбцов.
Key Уникальный идентификатор записи. Это значение не может быть равно NULL. В целях производительности и безопасности элементы управления выдают только ключ, но не значения из других столбцов.
Display Значение, которое отображается в элементе управления фильтра.
ParentKey Это значение используется для упорядочения иерархических данных в элементе управления дерева.
IsDefault Это значение используется для сохранения фильтра.
Совет
[!Совет] Можно добавить дополнительные столбцы для расширения функциональности фильтра.
GetDisplayDataInternal вызывает метод DataSourceRegistry.GetDataSource(DataSource) для проверки типа источника данных по имени следующим образом.
- Он ссылается на пользовательский тип источника данных с помощью свойства SubTypeId источника данных, которое является тем же значением, что и атрибут subType, зарегистрированный в файле PerformancePoint Services web.config расширения источника данных.
- Он ссылается на собственный источник данных с помощью свойства SourceName , которое возвращает поле из класса DataSourceNames .
Переопределите метод 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) && !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;
}
}
}
Дальнейшие действия
После создания поставщика данных и редактора фильтров (включая его пользовательский интерфейс, если это необходимо), разверните расширение, как описано в разделе Практическое руководство. Регистрация расширений PerformancePoint Services вручную.