Создание редакторов отчетов для PerformancePoint Services в SharePoint
Узнайте, как создать компонент редактора расширения специальных отчетов для PerformancePoint Services.
Что такое редакторы настраиваемых отчетов по Службы PerformancePoint Services ?
В Службы PerformancePoint Services редакторы настраиваемых отчетов позволяют пользователям задания свойств настраиваемых отчетов. Редакторы отчетов также инициализировать конечную точку отчета, который получает значения параметров от системы показателей и поставщиков фильтров. Дополнительные сведения о требованиях к редактора и функциональные возможности можно Редакторы нестандартных объектов PerformancePoint Services.
Следующие процедуры и примеры основаны на класс SampleReportViewEditor из настраиваемых объектов. Редактор тонкие веб-приложения, которое позволяет пользователям изменять имя и описание отчета. Полный код для класса см. в разделе Пример кода: Создание, получение и обновление пользовательских отчетов PerformancePoint Services в SharePoint.
Мы рекомендуем использовать редактор образец как шаблон. В примере демонстрируется как вызов объектов в Службы 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.PerformancePoint.Scorecards.ServerCommon.dll
- Microsoft.PerformancePoint.Scorecards.Store.dll (используется в вспомогательных классах)
- Microsoft.SharePoint.dll (используется в вспомогательных классах)
Образец редактора также содержит ссылки на сборки System.Web.dll и System.Web.Services.dll. В зависимости от функциональности расширения могут потребоваться другие ссылки в проекте.
Добавьте следующие классы из примера в проект. Редактор использует эти вспомогательные классы для взаимодействия с репозитория Службы PerformancePoint Services:
- DataSourceConsumerHelper.cs
- ExtensionRepositoryHelper.cs
- ReportViewRepositoryHelper.cs
- IDataSourceConsumer.cs
Примечание.
[!Примечание] Пример отчета получает данные из фильтра, поэтому он не использует DataSourceConsumerHelper или IDataSourceConsumer объектов. Однако если отчет получает данные из PerformancePoint Services источника данных, можно использовать методы, предоставляемые классом DataSourceConsumerHelper, для получения источников данных, как описано в разделе Создание редакторов фильтров для PerformancePoint Services в SharePoint.
В классе редактора добавьте директивы using для следующих пространств имен Службы PerformancePoint Services.
- Microsoft.PerformancePoint.Scorecards
- Microsoft.PerformancePoint.Scorecards.ServerCommon
В зависимости от функциональности расширения могут потребоваться другие директивы using.
Унаследуйте класс от базового класса, который поддерживает реализацию редактора. Так как редактор примера отчетов является веб-приложением, он наследуется от класса Page . Другие реализации могут быть производными от других базовых классов, таких как класс UserControl или WebPart .
Объявите переменные для элементов управления, предоставляющих свойства, которые пользователи должны просматривать или редактировать. Образец редактора отчетов сначала объявляет переменные для элементов управления веб-сервера, заданных в компоненте пользовательского интерфейса, который является ASPX-страницей. В образце редактора также определяется элемент управления кнопки, который позволяет пользователям передавать изменения. Затем редактор вызывает метод CreateChildControls(), чтобы сделать элементы управления доступными на странице.
Примечание.
В редакторе программная логика определяется отдельно от пользовательского интерфейса. Инструкции по созданию компонента пользовательского интерфейса не входят в данную документации.
Редактор отчетов пример выполняет шаги с 8 по 12 в методе Page_Load. Page_Load также используется для инициализации и проверка переменными и элементами управления, заполнения элементов управления и сохранить сведения о состоянии для настраиваемых отчетов и вспомогательные объекты.
Задайте для свойства AllowUnsafeUpdatesзначение true. Это позволяет редактор отчетов для записи данных в репозитории без использования операций POST формы.
Получите параметры из строки запроса и присвойте их значения локальным переменным, как показано в примере кода ниже.
// The URL of the site collection that contains the PerformancePoint Services repository. string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl]; // The location of the report in the repository. string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation]; // The operation to perform: OpenItem or CreateItem. string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
Примечание.
Сведения о параметрах строки запроса см. в разделе Редакторы для пользовательских объектов PerformancePoint Services.
Извлеките объект ReportViewRepositoryHelper, который используется для направления вызовов к репозиторию, как показано в следующем примере кода.
reportviewRepositoryHelper = new ReportViewRepositoryHelper();
Задайте расположение отчета на основе параметра строки запроса, как показано в следующем примере кода.
RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
Извлеките из строки запроса выполняемую операцию ( OpenItem или CreateItem) и извлечения или создайте настраиваемый отчет.
- Чтобы извлечь настраиваемый отчет, воспользуйтесь методом ReportViewRepositoryHelper.Get.
- Чтобы создать настраиваемый отчет, воспользуйтесь конструктором ReportView() и затем определите свойства Name , RendererClassName и SubTypeId объекта.
SubTypeId уникальный идентификатор для отчета, и его должен соответствовать атрибуту subType, указанная для настраиваемого отчета в файле web.config Службы PerformancePoint Services. RendererClassName это полное имя класса, который определяет веб-сервер визуализации элемента управления. Если не определен в редакторе, это значение по умолчанию класса визуализации, указанное в файле web.config.
if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase)) { // Use the repository-helper object to retrieve the report. reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation); if (reportview == null) { displayError("Could not retrieve the report view for editing."); return; } } else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase)) { reportview = new ReportView { RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName, SubTypeId = "SampleReportView" }; } else { displayError("Invalid Action."); return; }
Примечание.
[!Примечание] По умолчанию пользователи могут создавать пользовательские объекты из Конструктор панели мониторинга PerformancePoint только. Чтобы разрешить пользователям создавать пользовательский объект за пределами конструктора панели мониторинга, необходимо добавить пункт меню, который отправляет запрос CreateItem в редактор из типа контента в репозитории. Для получения дополнительных сведений см Редакторы нестандартных объектов PerformancePoint Services.
Определите конечную точку отчета, которая позволяет отчету получать данные из фильтров и систем показателей. В образце редактора отчетов определяются обязательные свойства конечной точки, как показано в следующем примере кода.
if (0 == reportview.EndPoints.Count) { EndPoint endpoint = new EndPoint { Category = EndPointCategory.None, UniqueName = "SampleReportView_EndPoint", // The display name is shown to users in Dashboard Designer. // It represents the endpoint that can be connected // to a filter or scorecard. DisplayName = "Sample Report View EndPoint" }; reportview.EndPoints.Add(endpoint); }
В образце редактора конечная точка определяется в методе VerifyReportView. Редактор также использует VerifyReportView для проверки того, что обязательные свойства заданы, и для установки необязательного свойства CustomData , которое можно использовать для хранения данных для отчета.
Обновите отчет в соответствии с изменениями, внесенными пользователем. Метод buttonOK_Click в образце редактора отчетов вызывает метод ReportViewRepositoryHelper.Update для обновления свойств Name и Description отчета в репозитории. buttonOK_Click также используется для проверки содержимого элементов управления и извлечения сведений о состоянии для настраиваемого отчета и вспомогательного объекта.
Примечание.
Пользователи могут изменять свойства Name, Description и Owner (Person Responsible) пользовательского объекта, а также удалять пользовательские объекты непосредственно из конструктора панели мониторинга и репозитория PerformancePoint Services.
Пример кода: создание, получение и обновление пользовательских отчетов PerformancePoint Services в SharePoint
В следующем примере кода создается, извлекаются и обновляются настраиваемые отчеты. Этот код от класса редактор кода, который содержит логику программирования для элементов управления, определенных на ASPX-странице.
Прежде чем скомпилировать этот пример кода, необходимо настроить среду разработки, как описано в разделе Создание редакторов для пользовательских PerformancePoint Services отчетов.
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.ServerCommon;
namespace Microsoft.PerformancePoint.SDK.Samples.SampleReport
{
// Represents the class that defines the sample report editor.
public class SampleReportViewEditor : Page
{
// Declare private variables for the ASP.NET controls defined in the user interface.
// The sample's user interface is an ASPX page that defines the controls in HTML.
private TextBox textboxName;
private TextBox textboxDescription;
private Label labelErrorMessage;
private Button buttonOK;
// Make the controls available to this class.
protected override void CreateChildControls()
{
base.CreateChildControls();
if (null == textboxName)
textboxName = FindControl("textboxName") as TextBox;
if (null == textboxDescription)
textboxDescription = FindControl("textboxDescription") 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)
{
// Required to enable custom report and filter editors to
// write data to the repository.
ServerUtils.AllowUnsafeUpdates = true;
// Initialize controls the first time the page loads only.
if (!IsPostBack)
{
EnsureChildControls();
ReportViewRepositoryHelper reportviewRepositoryHelper = 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.
reportviewRepositoryHelper =
new ReportViewRepositoryHelper();
// Set the report location by using the location from the query string.
RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
ReportView reportview;
// Retrieve or create the report object, depending on the operation
// passed in the query string (OpenItem or CreateItem).
if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
// Retrieve the report object by using the repository-helper object.
reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation);
if (reportview == null)
{
displayError("Could not retrieve the report view for editing.");
return;
}
}
else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
// Create a report view.
// CreateItem requests can be sent from a SharePoint list, but
// you must create a custom menu item to send the request.
// Dashboard Designer can send edit requests only.
reportview = new ReportView
{
RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName,
SubTypeId = "SampleReportView"
};
}
else
{
displayError("Invalid Action.");
return;
}
VerifyReportView(reportview);
// Save the original report and helper objects across page postbacks.
ViewState["action"] = action;
ViewState["reportview"] = reportview;
ViewState["reportviewrepositoryhelper"] = reportviewRepositoryHelper;
ViewState["itemlocation"] = itemLocation;
// Populate the child controls.
textboxName.Text = reportview.Name.ToString();
textboxDescription.Text = reportview.Description.ToString();
}
catch (Exception ex)
{
displayError("An error has occurred. Please contact your administrator for more information.");
if (reportviewRepositoryHelper != null)
{
// Add the exception detail to the server event log.
reportviewRepositoryHelper.HandleException(ex);
}
}
}
}
// Handles the Click event of the buttonOK control.
protected void buttonOK_Click(object sender, EventArgs e)
{
EnsureChildControls();
// Verify that the textboxName control contains a value.
if (string.IsNullOrEmpty(textboxName.Text))
{
labelErrorMessage.Text = "A report view name is required.";
return;
}
// Clear any pre-existing error message.
labelErrorMessage.Text = string.Empty;
// Retrieve the report and helper objects from view state.
string action = (string)ViewState["action"];
string itemLocation = (string) ViewState["itemlocation"];
ReportView reportview = (ReportView)ViewState["reportview"];
ReportViewRepositoryHelper reportviewRepositoryHelper = (ReportViewRepositoryHelper)ViewState["reportviewrepositoryhelper"];
// Update the report object with form changes.
reportview.Name.Text = textboxName.Text;
reportview.Description.Text = textboxDescription.Text;
// Save the report object to the PerformancePoint Services repository.
try
{
reportview.Validate();
if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
reportview.CreatedDate = DateTime.Now;
ReportView newReportView = reportviewRepositoryHelper.Create(
string.IsNullOrEmpty(reportview.Location.ItemUrl) ? itemLocation : reportview.Location.ItemUrl,
reportview);
ViewState["reportview"] = newReportView;
ViewState["action"] = ClickOnceLaunchValues.OpenItem;
}
else
{
reportviewRepositoryHelper.Update(reportview);
}
}
catch (Exception ex)
{
displayError("An error has occurred. Please contact your administrator for more information.");
if (reportviewRepositoryHelper != null)
{
// Add the exception detail to the server event log.
reportviewRepositoryHelper.HandleException(ex);
}
}
}
// Displays 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;
}
// Verifies that the properties for the report object are set.
static void VerifyReportView(ReportView reportview)
{
// Verify that all required properties are set.
if (string.IsNullOrEmpty(reportview.SubTypeId))
{
// This value must match the subType attribute specified
// in the web.config file.
reportview.SubTypeId = "SampleReportView";
}
if (string.IsNullOrEmpty(reportview.RendererClassName))
{
reportview.RendererClassName = typeof (SampleReportRenderer).AssemblyQualifiedName;
}
// Reports are consumers and do not use provider endpoints.
reportview.BeginPoints.Clear();
// If there are no consumer endpoints, create one so we can connect a filter or a scorecard to the report.
if (0 == reportview.EndPoints.Count)
{
EndPoint endpoint = new EndPoint
{
Category = EndPointCategory.None,
UniqueName = "SampleReportView_EndPoint",
// The display name is shown to users in Dashboard
// Designer to represent the endpoint that can be
// connected to a filter or scorecard.
DisplayName = "Sample Report View EndPoint"
};
reportview.EndPoints.Add(endpoint);
}
// Set optional properties for reports.
reportview.CustomData = "You can use this property to store custom information for this filter as a string or a serialized object.";
}
}
}
Дальнейшие действия
После создания редактора отчетов (включая его пользовательский интерфейс, если требуется) и отрисовщика отчетов разверните расширение, как описано в разделе Практическое руководство. Регистрация расширений PerformancePoint Services вручную.