Erstellen von Berichts-Editoren für PerformancePoint-Dienste in SharePoint
In diesem Artikel erfahren Sie, wie die Editor-Komponente einer benutzerdefinierten Berichtserweiterung für PerformancePoint-Dienste erstellt wird.
Was sind benutzerdefinierte Bericht-Editoren für PerformancePoint-Dienste ?
Benutzerdefinierter Bericht-Editoren aktivieren PerformancePoint-Dienste Benutzer Eigenschaften für benutzerdefinierte Berichte fest. Bericht-Editoren initialisieren auch den berichtendpunkt, der Parameterwerte von Scorecard- und filteranbietern empfängt. Weitere Informationen zu Editor Anforderungen und Funktionen finden Sie unter Editoren für benutzerdefinierte PerformancePoint Services-Objekte.
Die folgenden Prozeduren und Beispielen basieren auf der SampleReportViewEditor -Klasse aus der benutzerdefinierten Objekte (Beispiel). Der Editor ist eine dünne Anwendung, die Benutzern ermöglicht, Namen und eine Beschreibung des Berichts zu ändern. Den vollständigen Code für die -Klasse finden Sie unter Codebeispiel: Erstellen, Abrufen und Aktualisieren von benutzerdefinierten PerformancePoint-Dienste Berichten in SharePoint.
Es wird empfohlen, dass Sie den Beispiel-Editor als Vorlage verwenden. Das Beispiel zeigt wie Objekte aufrufen PerformancePoint-Dienste-API bietet Hilfsobjekte, die vereinfachen von Anrufen für Repository-Vorgänge (wie erstellen und Aktualisieren der Objekte), und bewährte Methoden für die Entwicklung von PerformancePoint-Dienste veranschaulicht.
Erstellen von Editoren für benutzerdefinierte PerformancePoint-Dienste Berichte
Installieren Sie PerformancePoint-Dienste, oder kopieren Sie die DLLs, die die Erweiterung verwendet (siehe Schritt 3) auf Ihrem Computer. Weitere Informationen finden Sie unter DLLs mit Klassenbibliotheken.
Erstellen Sie in Visual Studio eine C#-Klassenbibliothek. Sollten Sie bereits eine Klassenbibliothek für die Erweiterung erstellt haben, fügen Sie eine neue C#-Klasse hinzu.
Sie müssen die DLL mit einem starken Namen signieren. Stellen Sie außerdem sicher, dass alle Assemblys, auf die von der DLL verwiesen wird, ebenfalls starke Namen haben. Informationen zum Signieren einer Assembly mit einem starken Namen und zum Erstellen eines öffentlichen/privaten Schlüsselpaars finden Sie unter Vorgehensweise: Erstellen eines öffentlichen/privaten Schlüsselpaars.
Fügen Sie dem Projekt die folgenden DLLs als Assemblyverweise hinzu:
- Microsoft.PerformancePoint.Scorecards.Client.dll
- Microsoft.PerformancePoint.Scorecards.ServerCommon.dll
- Microsoft.PerformancePoint.Scorecards.Store.dll (used by helper classes)
- Microsoft.SharePoint.dll (used by helper classes)
The sample editor also contains assembly references to System.Web.dll and System.Web.Services.dll. Depending on your extension's functionality, other project references may be required.
Fügen Sie dem Projekt die folgenden Klassen aus dem Beispiel. Im Editor wird für die Interaktion mit dem Repository PerformancePoint-Dienste Hilfsklassen verwendet:
- DataSourceConsumerHelper.cs
- ExtensionRepositoryHelper.cs
- ReportViewRepositoryHelper.cs
- IDataSourceConsumer.cs
Hinweis
Der Beispielbericht erhält Daten aus einem Filter, daher werden keine DataSourceConsumerHelper- oder IDataSourceConsumer-Objekte verwendet. Wenn Ihr Bericht jedoch Daten aus einer PerformancePoint-Dienste Datenquelle abruft, können Sie die Methoden verwenden, die von der DataSourceConsumerHelper-Klasse verfügbar gemacht werden, um Datenquellen abzurufen, wie unter Erstellen von Filter-Editoren für PerformancePoint-Dienste in SharePoint beschrieben.
Fügen Sie in der Editorklasse using Direktiven für die folgenden PerformancePoint-Dienste-Namespaces hinzu:
- Microsoft.PerformancePoint.Scorecards
- Microsoft.PerformancePoint.Scorecards.ServerCommon
Je nach Funktionalität der Erweiterung sind u. U. andere using-Direktiven erforderlich.
Übernehmen Sie von der Basisklasse, die die Implementierung Ihres Editors unterstützt. Da der Beispielberichts-Editor eine Webanwendung ist, erbt er von der Page-Klasse . Andere Implementierungen können von Basisklassen wie der UserControl -Klasse oder der WebPart -Klasse erben.
Deklarieren Sie Variablen für die Steuerelemente, die die Eigenschaften offenlegen, die Benutzer anzeigen oder ändern sollen. Vom Beispielbericht-Editor werden zunächst Variablen für die Webserversteuerelemente deklariert, die in der Benutzeroberflächenkomponente - einer ASPX-Seite - definiert sind. Vom Beispiel-Editor wird auch ein Schaltflächen-Steuerelement definiert, das es Benutzern ermöglicht, Änderungen zu übermitteln. Anschließend ruft der Editor die CreateChildControls() -Methode auf, um die Steuerelemente auf der Seite verfügbar zu machen.
Hinweis
Im Editor wird die Programmierlogik separat von der Benutzeroberfläche definiert. Anweisungen zum Erstellen der Benutzeroberflächenkomponenten würden den Rahmen dieser Dokumentation sprengen.
Beispiel-Bericht-Editors führt die Schritte 8 bis 12 in der Page_Load -Methode. Page_Load wird auch initialisieren und Variablen und Steuerelemente zu überprüfen, füllen Sie Steuerelemente und Statusinformationen für den benutzerdefinierten Bericht und Helper-Objekten zu speichern.
Legen Sie die AllowUnsafeUpdates-Eigenschaft auf true fest. Auf diese Weise können die Bericht-Editors zum Schreiben von Daten an das Repository ohne Verwendung des Formulars POST Vorgänge.
Rufen Sie die Parameter aus der Abfragezeichenfolge ab, und legen Sie sie als Werte für lokale Variablen fest, wie im folgenden Codebeispiel dargestellt.
// 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];
Hinweis
Informationen zu den Abfragezeichenfolgenparametern finden Sie unter Editoren für benutzerdefinierte PerformancePoint-Dienste Objects.
Rufen Sie das ReportViewRepositoryHelper-Objekt ab, das für Aufrufe an das Repository verwendet wird, wie im folgenden Codebeispiel veranschaulicht.
reportviewRepositoryHelper = new ReportViewRepositoryHelper();
Legen Sie den Speicherort für den Bericht basierend auf dem Abfragezeichenfolgenparameter fest, wie im folgenden Codebeispiel veranschaulicht.
RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
Vorgang ( OpenItem oder CreateItem) aus der Abfragezeichenfolge abzurufen und abzurufen oder einen benutzerdefinierten Bericht erstellen.
- Zum Abrufen des benutzerdefinierten Berichts verwenden Sie die ReportViewRepositoryHelper.Get-Methode.
- Zum Erstellen des benutzerdefinierten Berichts verwenden Sie den ReportView()-Konstruktor, und definieren Sie dann die Eigenschaften Name , RendererClassName und SubTypeId des Berichts.
SubTypeId ist der eindeutige Bezeichner für den Bericht, und es muss übereinstimmen, das subType -Attribut, das Sie für den benutzerdefinierten Bericht in der PerformancePoint-Dienste web.config-Datei angeben. RendererClassName ist den vollqualifizierten Namen der Klasse, die das Webserversteuerelement Renderer definiert. Wenn im Editor nicht definiert ist, ist die Standardeinstellung der Rendererklasse in der Datei web.config angegeben.
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; }
Hinweis
Standardmäßig können Benutzer benutzerdefinierte Objekte nur über PerformancePoint Dashboard Designer erstellen. Damit Benutzer ein benutzerdefiniertes Objekt außerhalb des Dashboard-Designers erstellen können, müssen Sie ein Menüelement hinzufügen, das eine CreateItem-Anforderung aus dem Inhaltstyp im Repository an Ihren Editor sendet. Weitere Informationen finden Sie unter Editoren für benutzerdefinierte PerformancePoint Services-Objekte.
Definieren Sie den Endpunkt des Berichts, damit der Bericht Daten von Filtern und Scorecards empfangen kann. Die erforderlichen Eigenschaften für den Endpunkt werden vom Beispielbericht-Editor definiert, wie im folgenden Codebeispiel veranschaulicht.
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); }
Der Endpunkt wird vom Beispiel-Editor in der VerifyReportView-Methode definiert. Darüber hinaus wird VerifyReportView definiert, um zu überprüfen, ob die erforderlichen Eigenschaften festgelegt wurden, und um die optionale CustomData -Eigenschaft zu definieren, die Sie zum Speichern von Informationen für Ihren Bericht verwenden können.
Aktualisieren Sie den Bericht durch benutzerdefinierte Änderungen. Die ReportViewRepositoryHelper.Update-Methode wird von der buttonOK_Click-Methode im Beispielbericht-Editor aufgerufen, um die Eigenschaften Name und Description des Berichts im Repository zu aktualisieren. buttonOK_Click wird ebenfalls zum Überprüfen der Inhalte der Steuerelemente und zum Abrufen von Statusinformationen für den benutzerdefinierten Bericht und das Hilfsobjekt verwendet.
Hinweis
Benutzer können die Eigenschaften Name, Beschreibung und Besitzer (Verantwortliche Person) eines benutzerdefinierten Objekts bearbeiten und benutzerdefinierte Objekte direkt im Dashboard-Designer und im PerformancePoint-Dienste-Repository löschen.
Codebeispiel: Erstellen, Abrufen und Aktualisieren von benutzerdefinierten PerformancePoint-Dienste-Berichten in SharePoint
Im folgenden Codebeispiel wird erstellt, abgerufen und aktualisiert die benutzerdefinierte Berichte. Dieser Code hat ihren Ursprung im Editor CodeBehind-Klasse, die die Programmierlogik für Steuerelemente bereitstellt, die in einer ASPX-Seite definiert sind.
Bevor Sie dieses Codebeispiel kompilieren können, müssen Sie Ihre Entwicklungsumgebung wie unter Erstellen von Editoren für benutzerdefinierte PerformancePoint-Dienste-Berichte beschrieben konfigurieren.
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.";
}
}
}
Nächste Schritte
Nachdem Sie einen Berichts-Editor (einschließlich seiner Benutzeroberfläche, falls erforderlich) und einen Berichtsrenderer erstellt haben, stellen Sie die Erweiterung wie unter How to: Manually Register PerformancePoint-Dienste Extensions beschrieben bereit.