Freigeben über


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

Letzte Änderung: Dienstag, 30. August 2011

In PerformancePoint Services in Microsoft SharePoint Server 2010 handelt es sich bei Berichtsrenderern um Webserversteuerelemente, mit denen ein Bericht in einem Webpart gerendert wird. Ein Renderer schreibt den HTML-Code für die Berichtvisualisierung (z. B. eine Tabelle oder ein Diagramm), stellt die Logik für die Behandlung von Berichtsparametern bereit und ruft das Berichtsobjekt aus dem Repository ab.

Gilt für: SharePoint Server 2010

Die Prozeduren und Codebeispiele in diesem Thema basieren auf der SampleReportRenderer-Klasse im Beispiel für benutzerdefinierte Objekte. Der Renderer rendert eine Tabelle und füllt sie mit über einen verknüpften Filter empfangenen Werten auf. Der vollständige Code für die Klasse befindet sich in diesem Thema im Abschnitt "Beispiel".

HinweisHinweis

Es wird empfohlen, den Beispielberichtsrenderer als Vorlage zu verwenden. In diesem Beispiel wird erläutert, wie Sie Objekte in der PerformancePoint Services-API aufrufen, und außerdem werden bewährte Methoden für die PerformancePoint Services-Entwicklung beschrieben.

Zum Erstellen eines Berichtsrenderers führen Sie die folgenden beiden grundlegenden Verfahren aus:

  • Erstellen und Konfigurieren der Rendererklasse

  • Definieren der Rendererfunktionalität

Zum Erstellen eines benutzerdefinierten Renderers erstellen Sie zunächst die Rendererklasse.

So erstellen und konfigurieren Sie die Rendererklasse

  1. Installieren Sie 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-DLLs als Assemblyverweise hinzu:

    • Microsoft.PerformancePoint.Scorecards.Client.dll

    • Microsoft.PerformancePoint.Scorecards.Server.dll

    • Microsoft.PerformancePoint.Scorecards.Store.dll

    Je nach Funktionalität der Erweiterung sind u. U. andere Projektverweise erforderlich.

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

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

  5. Sie muss von der ParameterizableControl-Basisklasse erben.

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

So definieren Sie die Rendererfunktionalität

  1. Überschreiben Sie die GetElement-Methode, um das Berichtsobjekt aus dem Repository abzurufen.

  2. Überschreiben Sie die SetData-Methode, um das Berichtsdataset einzurichten und eingehende Parameterwerte abzurufen.

  3. Überschreiben Sie die Render-Methode, um den HTML-Code für die Berichtvisualisierung zu rendern.

    Nächster Schritt: Nachdem Sie einen Berichtsrenderer und einen Berichts-Editor erstellt haben (einschließlich ggf. der zugehörigen Benutzeroberfläche), 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

Mit der Klasse im folgenden Codebeispiel wird ein Berichtsrenderer erstellt, mit dem über den Beispielfilter übergebene Aktieninformationen angezeigt werden.

HinweisHinweis

Bevor Sie dieses Codebeispiel kompilieren können, müssen Sie die Entwicklungsumgebung wie unter So erstellen und konfigurieren Sie die Rendererklasse beschrieben konfigurieren.

using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.Server.Extensions;
using Microsoft.PerformancePoint.Scorecards.Store;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleReport
{

    // The class that define the sample report's renderer.
    public class SampleReportRenderer : ParameterizableControl 
    {
        private ReportView reportView;

        private ReportView ReportView
        {
            get
            {

                // The GetElement method is used internally by this property, which is used
                // in turn by the SetData method.
                reportView = GetElement(ElementLocation) as ReportView;
                return reportView;
            }
        }

        // Initializes the current instance according to a standard interface. This method
        // sets up the dataset.
        public override void SetData(RepositoryLocation elementLocation, string resourcePath, string targetControlId, BIDataContainer dataContainer, bool accessibilityMode)
        {

            // The renderer must call the base implementation of the SetData method
            // to set report properties.
            base.SetData(elementLocation, resourcePath, targetControlId, dataContainer, accessibilityMode);
        
            if (null != ReportView)
            {

                // If the report view's custom data represents a serialized object, deserialize
                // it, and then use it to access a data source or other object.
                string customData = ReportView.CustomData;
                if (!string.IsNullOrEmpty(customData))
                {
                    System.Diagnostics.Debug.WriteLine(string.Format("Report view '{0}' has the following custom data: {1}", ReportView.Name.Text, customData));
                }
                
                // Iterate through the user's selections sent by the filter. 
                // The MultiSelectTreeControl filter control can send multiple
                // rows of data but other native controls send one message only.
                foreach (ParameterMessage message in BIDataContainer.ParameterMessages)
                {
                    // This line demonstrates how to do something with each incoming parameter message.
                    System.Diagnostics.Debug.WriteLine(string.Format("Parameter message: {0}", message.DisplayName));
                }
            }
        }
        
        // Render page content using the specified writer.
        protected override void Render(HtmlTextWriter output)
        {
            try
            {
                if (null != ReportView && !string.IsNullOrEmpty(ReportView.CustomData))
                {
                    output.RenderBeginTag(HtmlTextWriterTag.P);
                    output.RenderBeginTag(HtmlTextWriterTag.B);

                    // This line shows how to retrieve the content of the
                    // report's optional CustomData property. CustomData can store
                    // information that the report does not store elsewhere.
                    output.Write(string.Format("The ReportView "{0}" has CustomData information. The CustomData is "{1}"", 
                        ReportView.Name.Text, ReportView.CustomData));
                    output.RenderEndTag(); // B
                    output.RenderEndTag(); // P
                }

                Dictionary<Guid, ParameterMessage> parametersIndex =
                    IndexParameterMessages(BIDataContainer.ParameterMessages.ToArray());

                // Each connection gets a unique identifier.
                foreach (Guid parameterMappingId in parametersIndex.Keys)
                {
                    ParameterMessage message = parametersIndex[parameterMappingId];

                    output.RenderBeginTag(HtmlTextWriterTag.Table);
                    
                    output.AddAttribute(HtmlTextWriterAttribute.Style, "ms-partline");
                    output.RenderBeginTag(HtmlTextWriterTag.Tr);

                    output.AddAttribute(HtmlTextWriterAttribute.Colspan, "5");
                    output.RenderBeginTag(HtmlTextWriterTag.Td);
                    
                    output.RenderBeginTag(HtmlTextWriterTag.B);
                    output.Write(string.Format("EndPoint name is: {0}", message.Values.TableName));

                    output.RenderEndTag();  // B
                    output.RenderEndTag();  // Td
                    output.RenderEndTag();  // Tr

                    output.AddAttribute(HtmlTextWriterAttribute.Style, "\"border-bottom:solid 10px #ffdd00; background:PapayaWhip\"");
                    output.RenderBeginTag(HtmlTextWriterTag.Tr);

                    // Read the message.Values data table and print the column names.
                    foreach (DataColumn col in message.Values.Columns)
                    {
                        output.RenderBeginTag(HtmlTextWriterTag.Td);
                        output.Write(string.IsNullOrEmpty(col.Caption) ? "&nbsp;" : col.Caption);
                        output.RenderEndTag();
                    }
                    output.RenderEndTag();  // Tr

                    // Print the data from the Values property, which is a data table.
                    foreach (DataRow row in message.Values.Rows)
                    {
                        output.RenderBeginTag(HtmlTextWriterTag.Tr);
                        for (int i = 0; i < message.Values.Columns.Count; i++)
                        {
                            output.RenderBeginTag(HtmlTextWriterTag.Td);
                            output.Write(string.IsNullOrEmpty(row[i].ToString()) ? "&nbsp;" : row[i].ToString());
                            output.RenderEndTag();
                        }
                        output.RenderEndTag();  // Tr
                    }
                    output.RenderEndTag(); // table
                }
            }
            catch (Exception e)
            {
                output.RenderBeginTag(HtmlTextWriterTag.H1);
                output.Write("Error! An exception has occurred!");
                output.RenderEndTag();
                
                output.RenderBeginTag(HtmlTextWriterTag.P);
                output.Write(e.Message);
                output.RenderEndTag();

                output.RenderBeginTag(HtmlTextWriterTag.P); 
                output.Write(e.StackTrace);
                output.RenderEndTag();
            }
        }

        // Get the report object.
        protected override Element GetElement(RepositoryLocation elementLocation)
        {
            ReportView rv = null;
            if (!RepositoryLocation.IsNullOrEmpty(elementLocation))
            {
                rv = SPDataStore.GlobalDataStore.GetReportViewForExecution(elementLocation);
            }
            return (rv);
        }
    }
}

Code wird kompiliert

Bevor Sie dieses Codebeispiel kompilieren können, müssen Sie die Entwicklungsumgebung wie unter So erstellen und konfigurieren Sie die Rendererklasse 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 Editoren für PerformancePoint Services-Berichte

Weitere Ressourcen

Erstellen von benutzerdefinierten Objekten für PerformancePoint Services

Codebeispiele für PerformancePoint Services in SharePoint Server 2010