Freigeben über


Gewusst wie: Erstellen von Editoren für PerformancePoint Services-Berichte

Letzte Änderung: Dienstag, 30. August 2011

In PerformancePoint Services in Microsoft SharePoint Server 2010 ist es Benutzern mithilfe von benutzerdefinierten Editoren möglich, Eigenschaften für benutzerdefinierte Objekte festzulegen. Sie stellen Steuerelemente für die Bearbeitung bereit und rufen benutzerdefinierte Objekte aus dem Repository ab und aktualisieren diese. Weitere Informationen zu den Anforderungen und zur Funktionalität von Editoren finden Sie unter Editoren für benutzerdefinierte PerformancePoint Services-Objekte.

Gilt für: SharePoint Server 2010

Bericht-Editoren müssen auch den Berichtendpunkt initialisieren, der Parameterwerte von Scorecard- und Filteranbietern empfängt.

Die Prozeduren und Beispiele in diesem Thema basieren auf der SampleReportViewEditor-Klasse im Beispiel für benutzerdefinierte Objekte. Der Editor ist eine reduzierte Webanwendung, mit der Benutzer den Namen und die Beschreibung des Berichts ändern können. Der vollständige Code für die Klasse befindet sich in diesem Thema im Abschnitt "Beispiel".

HinweisHinweis

Es wird empfohlen, den Beispiel-Editor als Vorlage zu verwenden. Im Beispiel sehen Sie, wie Sie Objekte in der PerformancePoint Services-API aufrufen, welche Hilfsobjekte Sie zur Vereinfachung von Aufrufen für Repositoryvorgänge (z. B. zum Erstellen und Aktualisieren von Objekten) verwenden können und welche bewährten Methoden bei der Entwicklung der PerformancePoint Services zu beachten sind.

Sie können einen Bericht-Editor mithilfe von zwei Standardverfahren wie folgt erstellen:

  • Erstellen und Konfigurieren der Editorklasse

  • Definieren der Bearbeitungsfunktionalität

Zum Erstellen eines benutzerdefinierten Editors erstellen Sie zunächst die Editorklasse.

So erstellen und konfigurieren Sie die Editorklasse

  1. Installieren Sie die PerformancePoint Services, oder kopieren Sie die von der Erweiterung verwendeten DLLs (siehe Schritt 3) auf den Computer. Weitere Informationen finden Sie unter PerformancePoint-Dienste-DLLs in Entwicklungsszenarios.

  2. 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.

  3. Fügen Sie dem Projekt die folgenden PerformancePoint Services- und SharePoint Server 2010-DLLs als Assemblyverweise hinzu:

    • Microsoft.PerformancePoint.Scorecards.Client.dll

    • Microsoft.PerformancePoint.Scorecards.ServerCommon.dll

    • Microsoft.PerformancePoint.Scorecards.Store.dll (von Hilfsklassen verwendet)

    • Microsoft.SharePoint.dll (von Hilfsklassen verwendet)

    Der Beispiel-Editor enthält ebenfalls Assemblyverweise auf System.Web.dll und System.Web.Services.dll. Je nach Funktionalität Ihrer Erweiterung sind u. U. weitere Projektverweise erforderlich.

  4. Fügen Sie dem Projekt die folgenden Klassen aus dem Beispiel hinzu. Der Editor verwendet diese Hilfsklassen für die Interaktion mit dem PerformancePoint Services-Repository:

    • DataSourceConsumerHelper.cs

    • ExtensionRepositoryHelper.cs

    • ReportViewRepositoryHelper.cs

    • IDataSourceConsumer.cs

    HinweisHinweis

    Der Beispielbericht erhält Daten von einem Filter; die Objekte DataSourceConsumerHelper oder IDataSourceConsumer werden somit nicht verwendet. Wenn Ihr Bericht jedoch Daten von einer Datenquelle der PerformancePoint Services erhält, können Sie die von der DataSourceConsumerHelper-Klasse offengelegten Methoden zum Abrufen von Datenquellen verwenden, wie unter Gewusst wie: Erstellen von Editoren für PerformancePoint Services-Filter beschrieben.

  5. Fügen Sie in der Editorklasse using-Direktiven für die folgenden Namespaces der PerformancePoint Services hinzu:

    • Microsoft.PerformancePoint.Scorecards

    • Microsoft.PerformancePoint.Scorecards.ServerCommon

    Je nach Funktionalität der Erweiterung sind u. U. andere using-Direktiven erforderlich.

  6. Übernehmen Sie von der Basisklasse, die die Implementierung Ihres Editors unterstützt. Da es sich bei dem Beispielbericht-Editor um eine Webanwendung handelt, erbt diese von der Page-Klasse. Andere Implementierungen können von Basisklassen wie der UserControl-Klasse oder der WebPart-Klasse erben.

Nachdem Sie die Editorklasse erstellt und konfiguriert haben, müssen Sie die Funktionalität des Editors definieren.

So definieren Sie die Bearbeitungsfunktionalität

  1. 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. Der Editor ruft dann die CreateChildControls()-Methode auf, um die Steuerelemente auf der Seite zur Verfügung zu stellen.

    HinweisHinweis

    Im Editor wird die Programmierlogik separat von der Benutzeroberfläche definiert. Anweisungen zum Erstellen der Benutzeroberflächenkomponenten würden den Rahmen dieser Dokumentation sprengen.

  2. Legen Sie die AllowUnsafeUpdates-Eigenschaft auf true fest. Dadurch kann der Bericht-Editor Daten in das Repository schreiben, ohne POST-Vorgänge für Formulare zu verwenden.

    Der Beispielbericht-Editor führt Schritte 2 bis 6 der Page_Load-Methode durch. Page_Load wird ebenfalls zum Initialisieren und Überprüfen von Variablen und Steuerelementen, Auffüllen von Steuerelementen und Speichern von Statusinformationen für den benutzerdefinierten Bericht und die Hilfsobjekte verwendet.

  3. 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];
    

    Informationen zu den Abfragezeichenfolgenparametern finden Sie unter Editoren für benutzerdefinierte PerformancePoint Services-Objekte.

  4. Rufen Sie das ReportViewRepositoryHelper-Objekt ab, das für Aufrufe an das Repository verwendet wird, wie im folgenden Codebeispiel veranschaulicht.

    reportviewRepositoryHelper = new ReportViewRepositoryHelper();
    
  5. Legen Sie den Speicherort für den Bericht basierend auf dem Abfragezeichenfolgenparameter fest, wie im folgenden Codebeispiel veranschaulicht.

    RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
  6. Rufen Sie den auszuführenden Vorgang (OpenItem oder CreateItem) aus der Abfragezeichenfolge ab, und rufen Sie dann den benutzerdefinierten Bericht ab oder erstellen Sie ihn, wie im folgenden Codebeispiel dargestellt.

    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;
        }
    
    • 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 des Berichts; dieser muss mit dem subType-Attribut übereinstimmen, das Sie in der Datei web.config der PerformancePoint Services für den benutzerdefinierten Bericht angeben. RendererClassName ist der vollqualifizierte Name der Klasse, die das Webserversteuerelement des Renderers definiert. Wenn der Wert nicht im Editor definiert ist, wird standardmäßig die in der Datei web.config definierte Rendererklasse für diesen Wert verwendet.

    HinweisHinweis

    Standardmäßig ist es den Benutzern nur möglich, benutzerdefinierte Objekte über den PerformancePoint Dashboard-Designer zu erstellen. Damit sie auch außerhalb von Dashboard-Designer benutzerdefinierte Objekte erstellen können, müssen Sie ein Menüelement hinzufügen, das vom Inhaltstyp im Repository eine CreateItem-Anforderung an den Editor sendet. Weitere Informationen finden Sie unter Editoren für benutzerdefinierte PerformancePoint Services-Objekte.

  7. 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.

  8. 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.

    HinweisHinweis

    Benutzer können die Eigenschaften Name, Description und Owner (Verantwortliche Person) eines benutzerdefinierten Objekts ändern und benutzerdefinierte Objekte direkt in Dashboard-Designer und im Repository der PerformancePoint Services löschen.

    Nächster Schritt: Nachdem Sie einen einen Berichts-Editor (einschließlich ggf. der zugehörigen Benutzeroberfläche) und einen Berichtsrenderer erstellt haben, stellen Sie die Erweiterung wie unter Gewusst wie: Manuelles Registrieren von PerformancePoint-Dienste-Erweiterungen beschrieben bereit. Anweisungen zum Installieren und Konfigurieren der Beispielberichtserweiterung finden Sie im Abschnitt "Installieren der Beispielobjekte für Berichte, Filter und Datenquellen" unter Codebeispiel: Benutzerdefinierte Objekte für Berichte, Filter und tabulierte Datenquellen.

Beispiel

Mithilfe des folgenden Codebeispiels können benutzerdefinierte Berichte im Repository erstellt, abgerufen und aktualisiert und die Programmierlogik für die in einer ASPX-Seite definierten Steuerelemente bereitgestellt werden.

HinweisHinweis

Vor dem Kompilieren dieses Codebeispiels müssen Sie die Entwicklungsumgebung wie unter So erstellen und konfigurieren Sie die Editorklasse 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.";
        }
    }
}

Code wird kompiliert

Vor dem Kompilieren dieses Codebeispiels müssen Sie die Entwicklungsumgebung wie unter So erstellen und konfigurieren Sie die Editorklasse beschrieben, konfigurieren.

Sicherheit

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 dazu, wie Sie eine Assembly mit einem starken Namen signieren und ein öffentliches/privates Schlüsselpaar erstellen, finden Sie unter How to: Create a Public/Private Key Pair.

Siehe auch

Aufgaben

Gewusst wie: Erstellen von Renderern für PerformancePoint Services-Berichte

Konzepte

Editoren für benutzerdefinierte PerformancePoint Services-Objekte

Weitere Ressourcen

Erstellen von benutzerdefinierten Objekten für PerformancePoint Services

Codebeispiele für PerformancePoint Services in SharePoint Server 2010