Создание редакторов источников табличных данных для PerformancePoint Services в SharePoint
Узнайте, как создать компонент редактора в расширении источника специальных табличных данных для PerformancePoint Services.
Что такое редакторы исходного пользовательские данные для Службы PerformancePoint Services ?
В Службы PerformancePoint Services редакторы исходного пользовательские данные позволяют пользователям задания свойств табличные источники данных. Дополнительные сведения о требованиях к редактора и функциональные возможности можно Редакторы нестандартных объектов PerformancePoint Services.
Следующие процедуры и примеры кода, зависят от класса SampleDataSourceEditor из настраиваемых объектов. Редактор тонкие веб-приложения, которое позволяет пользователям изменять имя и описание источника данных, введите символов акций и указать расположение файла адрес и кэш сервера прокси-сервера. Полный код для класса см. в разделе Пример кода. Получение и обновление настраиваемых табличных источников данных.
Мы рекомендуем использовать редактор образец как шаблон. В примере демонстрируется как вызов объектов в Службы PerformancePoint Services API, предоставляет вспомогательные объекты, которые упрощают вызывает для репозитория операций (например, создание и обновление объектов) и демонстрируются советы и рекомендации по разработке Службы PerformancePoint Services.
Создание редакторов для настраиваемых Службы PerformancePoint Services табличные источники данных
Установка Службы PerformancePoint Services или копирование библиотеки DLL, которые использует расширения (перечисленных в шаге 3) на своем компьютере. Дополнительные сведения см. в разделе Библиотеки DLL с библиотеками классов.
В Visual Studio создайте библиотеку классов C#. Если библиотека классов для расширения уже создана, добавьте новый класс C#.
DLL-библиотеку необходимо подписать строгим именем. Кроме того, убедитесь, что все сборки, на которые ссылается DLL-библиотека, имеют строгие имена. Сведения о том, как подписать сборку со строгим именем и как создать пару открытого и закрытого ключей, см. в разделе Практическое руководство. Создание пары открытого и закрытого ключей.
Добавьте в проект в качестве ссылок на сборки следующие библиотеки DLL:
- Microsoft.PerformancePoint.Scorecards.Client.dll
- Microsoft.SharePoint.dll (используется во вспомогательных классах).
Пример редактора в качестве ссылок на сборки также использует библиотеки System.Core.dll, System.Web.dll, System.Web.Services.dll и System.Xml.Linq.dll. В зависимости от функций создаваемого расширения в проект может потребоваться включить и другие ссылки.
Добавьте следующие классы из примера в проект. Редактора использует эти вспомогательные классы для взаимодействия с репозитория Службы PerformancePoint Services и файл кэша:
- ExtensionRepositoryHelper.cs
- DataSourceRepositoryHelper.cs
- SampleDSCacheHandler.cs
В классе создаваемого редактора добавьте директиву using для пространства имен Microsoft.PerformancePoint.Scorecards. В зависимости от функций создаваемого расширения могут понадобиться и другие директивы using.
Унаследуйте класс от базового класса, который поддерживает реализацию редактора. Так как редактор примера источника данных является веб-приложением, он наследуется от класса Page . Другие реализации могут быть производными от других базовых классов, таких как класс UserControl или WebPart .
Объявите переменные для элементов управления, предоставляющие свойства, которые должны видеть или изменять пользователи. В примере редактора источника данных сначала объявляются переменные для серверных веб-элементов управления, определенные в компоненте пользовательского интерфейса, являющемся ASPX-страницей. В примере редактора также определяется элемент управления ''Кнопка'', позволяющий пользователям передать изменения. Затем редактор вызывает метод CreateChildControls(), чтобы сделать элементы управления доступными на странице.
Примечание.
В редакторе программная логика определяется отдельно от пользовательского интерфейса. Инструкции по созданию компонента пользовательского интерфейса не входят в данную документации.
Редактор источника данных пример выполняет шаги с 8 по 11 в методе Page_Load. Page_Load также используется для инициализации и проверка переменными и элементами управления, заполнения элементов управления и сохранить сведения о состоянии для пользовательских данных источника и вспомогательные объекты.
Получите параметры из строки запроса и присвойте их значения локальным переменным, как показано в примере кода ниже.
// The URL of the site collection that contains the PerformancePoint Services repository. string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl]; // The location of the data source in the repository. string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation]; // The operation to perform: OpenItem or CreateItem. string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
Примечание.
Сведения о параметрах строки запроса см. в разделе Редакторы для пользовательских объектов PerformancePoint Services.
Извлеките объект DataSourceRepositoryHelper, используемый для вызовов в репозиторий, как показано в следующем примере кода.
DataSourceRepositoryHelper = new DataSourceRepositoryHelper();
Задайте расположение источника данных на основе параметра строки запроса:
RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);
Извлеките из строки запроса выполняемую операцию ( OpenItem или CreateItem) и извлечения или создайте пользовательский источник данных.
- Чтобы извлечь пользовательский источник данных, воспользуйтесь методом DataSourceRepositoryHelper.Get.
- Чтобы создать пользовательский источник данных, используйте конструктор DataSource(), а затем определите свойства Name и SubTypeId источника данных. SubTypeId уникальный идентификатор для источника данных, и он должен соответствовать атрибуту subType, указанная для источника пользовательских данных в файле web.config Службы PerformancePoint Services.
Примечание.
Этот пример редактора источника данных не содержит логику создания объекта источника данных. Примеры создания пользовательского объекта см. в разделах Практическое руководство. Создание редакторов отчетов для PerformancePoint Services в SharePoint или Практическое руководство. Создание редакторов фильтров для PerformancePoint Services в SharePoint.
if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase)) { // Use the repository-helper object to retrieve the data source. datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation); if (datasource == null) { displayError("Could not retrieve the data source for editing."); return; } } else { displayError("Invalid Action."); return; }
Примечание.
[!Примечание] По умолчанию пользователи могут создавать пользовательские объекты из Конструктор панели мониторинга PerformancePoint только. Чтобы разрешить пользователям создавать пользовательский объект за пределами конструктора панели мониторинга, необходимо добавить пункт меню, который отправляет запрос CreateItem в редактор из типа контента в репозитории. Для получения дополнительных сведений см Редакторы нестандартных объектов PerformancePoint Services.
Редактор источника данных образца необходимо выполнить действия 12 и 13 в методах buttonOK_Click и CreateCacheFile. buttonOK_Click также используется для вызова метода AreAllInputsValid для проверки содержимого элементов управления и получение сведений о состоянии для пользовательский источник данных и вспомогательных объектов.
Обновите источник данных, внеся определенные пользователями изменения. В этом примере редактора источника данных вызывается метод DataSourceRepositoryHelper.Update для обновления свойств Name , Description и CustomData объекта источника данных в репозитории. Свойство CustomData можно использовать для хранения сериализованного объекта или строки. В примере редактора используются пользовательские символы акций, расположение файла кэша, в котором хранятся значения котировок акций, и адрес прокси-сервера.
Примечание.
Пользователи могут изменять свойства Name, Description и Owner (Person Responsible) пользовательского объекта, а также удалять пользовательские объекты непосредственно из конструктора панели мониторинга и репозитория PerformancePoint Services.
Вызовите поставщик источника данных, чтобы определить сопоставления столбцов (если они еще не определены).
Пример кода. Получение и обновление настраиваемых PerformancePoint Services табличных источников данных в SharePoint
В следующем примере кода показано получение и обновляет табличные источники данных. Этот код от класса редактор кода, который содержит логику программирования для элементов управления, определенных на ASPX-странице.
Прежде чем скомпилировать этот пример кода, необходимо настроить среду разработки, как описано в разделе Создание и настройка класса редактора для редактора табличных источников данных в PerformancePoint Services.
using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using System.Xml.Linq;
namespace Microsoft.PerformancePoint.SDK.Samples.SampleDataSource
{
// Represents the class that defines the sample data source editor.
public class SampleDataSourceEditor : Page
{
#region Members
// Declare private variables for the ASP.NET controls defined in the user interface.
// The user interface is an ASPX page that defines the controls in HTML.
private TextBox textboxName;
private TextBox textboxDescription;
private TextBox textboxStockSymbols;
private TextBox textboxXMLLocation;
private TextBox textboxProxy;
private Label labelErrorMessage;
private Button buttonOK;
#endregion
#region Page methods and events
// Make the controls available to this class.
protected override void CreateChildControls()
{
base.CreateChildControls();
if (null == textboxProxy)
textboxProxy = FindControl("textboxProxy") as TextBox;
if (null == textboxName)
textboxName = FindControl("textboxName") as TextBox;
if (null == textboxDescription)
textboxDescription = FindControl("textboxDescription") as TextBox;
if (null == textboxStockSymbols)
textboxStockSymbols = FindControl("textboxStockSymbols") as TextBox;
if (null == textboxXMLLocation)
textboxXMLLocation = FindControl("textboxXMLLocation") as TextBox;
if (null == labelErrorMessage)
labelErrorMessage = FindControl("labelErrorMessage") as Label;
if (null == buttonOK)
buttonOK = FindControl("buttonOK") as Button;
}
// Handles the Load event of the Page control.
// Methods that use a control variable should call the Control.EnsureChildControls
// method before accessing the variable for the first time.
protected void Page_Load(object sender, EventArgs e)
{
// Initialize controls the first time the page loads only.
if (!IsPostBack)
{
EnsureChildControls();
DataSourceRepositoryHelper dataSourceRepositoryHelper = null;
try
{
// Get information from the query string parameters.
string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
// Validate the query string parameters.
if (string.IsNullOrEmpty(server) ||
string.IsNullOrEmpty(itemLocation) ||
string.IsNullOrEmpty(action))
{
displayError("Invalid URL.");
return;
}
// Retrieve the repository-helper object.
dataSourceRepositoryHelper =
new DataSourceRepositoryHelper();
// Set the data source location.
RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);
DataSource datasource;
// Retrieve the data source object by
// using the repository-helper object.
if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation);
if (datasource == null)
{
displayError("Could not retrieve the data source for editing.");
return;
}
}
else
{
displayError("Invalid Action.");
return;
}
// Save the original data source and helper objects across page postbacks.
ViewState["action"] = action;
ViewState["datasource"] = datasource;
ViewState["datasourcerepositoryhelper"] = dataSourceRepositoryHelper;
// Populate the child controls.
if (null != datasource.Name)
textboxName.Text = datasource.Name.ToString();
if (null != datasource.Description)
textboxDescription.Text = datasource.Description.ToString();
if (null != datasource.CustomData)
{
string[] splitCustomData = datasource.CustomData.Split('&');
if (splitCustomData.Length > 2)
{
textboxStockSymbols.Text = splitCustomData[0];
textboxXMLLocation.Text = splitCustomData[1].Replace(@"\\SampleStockQuotes.xml", string.Empty);
textboxProxy.Text = splitCustomData[2];
}
}
}
catch (Exception ex)
{
displayError("An error has occurred. Please contact your administrator for more information.");
if (dataSourceRepositoryHelper != null)
{
// Add the exception detail to the server
// event log.
dataSourceRepositoryHelper.HandleException(ex);
}
}
}
}
// Handles the Click event of the buttonOK control.
protected void buttonOK_Click(object sender, EventArgs e)
{
EnsureChildControls();
// Verify that the required fields contain values.
if (!AreAllInputsValid())
return;
// Clear any pre-existing error message.
labelErrorMessage.Text = string.Empty;
// Retrieve the data source and helper objects from view state.
string action = (string)ViewState["action"];
DataSource datasource = (DataSource)ViewState["datasource"];
DataSourceRepositoryHelper datasourcerepositoryhelper = (DataSourceRepositoryHelper)ViewState["datasourcerepositoryhelper"];
// Update the data source object with form changes.
datasource.Name.Text = textboxName.Text;
datasource.Description.Text = textboxDescription.Text;
// Define column mappings if they aren't already defined.
if (datasource.DataTableMapping.ColumnMappings.Count <= 0)
{
datasource.DataTableMapping = WSTabularDataSourceProvider.CreateDataColumnMappings();
}
// Save the data source to the repository
// by using the repository-helper object.
try
{
CreateCacheFile(datasource);
datasource.Validate();
if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
datasourcerepositoryhelper.Update(datasource);
}
else
{
displayError("Invalid Action.");
}
}
catch (Exception ex)
{
displayError("An error has occurred. Please contact your administrator for more information.");
if (datasourcerepositoryhelper != null)
{
// Add the exception detail to the server event log.
datasourcerepositoryhelper.HandleException(ex);
}
}
}
#endregion
#region Helper methods
// Display the error string in the labelErrorMessage label.
void displayError(string msg)
{
EnsureChildControls();
labelErrorMessage.Text = msg;
// Disable the OK button because the page is in an error state.
buttonOK.Enabled = false;
return;
}
// Validate the text box inputs.
bool AreAllInputsValid()
{
if (string.IsNullOrEmpty(textboxProxy.Text))
{
labelErrorMessage.Text = "The proxy server address is required.";
return false;
}
if (string.IsNullOrEmpty(textboxXMLLocation.Text))
{
labelErrorMessage.Text = "The location to save the cache file to is required.";
return false;
}
if (string.IsNullOrEmpty(textboxName.Text))
{
labelErrorMessage.Text = "A data source name is required.";
return false;
}
if (string.IsNullOrEmpty(textboxStockSymbols.Text))
{
labelErrorMessage.Text = "A stock symbol is required.";
return false;
}
return true;
}
// Create the XML cache file at the specified location and
// store it and the stock symbols in the CustomData
// property of the data source.
void CreateCacheFile(DataSource datasource)
{
string cacheFileLocation = string.Format("{0}\\\\{1}", textboxXMLLocation.Text.TrimEnd('\\\\'),
"SampleStockQuotes.xml");
datasource.CustomData = string.Format("{0}&{1}&{2}", textboxStockSymbols.Text, cacheFileLocation, textboxProxy.Text);
// Check if the cache file already exists.
if (!File.Exists(cacheFileLocation))
{
// Create the cache file if it does not exist.
XDocument doc = SampleDSCacheHandler.DefaultCacheFileContent;
doc.Save(cacheFileLocation);
}
}
#endregion
}
}
Дальнейшие действия
После создания редактора источника данных (включая его пользовательский интерфейс, если требуется) и поставщика источника данных разверните расширение, как описано в разделе Практическое руководство. Регистрация расширений PerformancePoint Services вручную.