Freigeben über


Erstellen Filterdatenanbietern für PerformancePoint-Dienste in SharePoint

In diesem Artikel erfahren Sie, wie die Datenanbieterkomponente in einer benutzerdefinierten Filtererweiterung für PerformancePoint-Dienste erstellt wird.

Was sind benutzerdefinierte Datenanbieter für PerformancePoint-Dienste ?

In PerformancePoint-Dienste benutzerdefinierte Datenanbieter abrufen von Daten aus der zugrunde liegenden Datenquelle des Filters und definieren Sie, wie die Daten verwenden. Vor allem geben Datenanbieter die Datenwerte an, die im Filtersteuerelement verfügbar gemacht werden sollen, sowie die Daten, die als Ausgangspunkt des Filters verwendet werden können. Ein Datenanbieter speichert auch den Wert, den ein Benutzer aus dem Filtersteuerelement auswählt, die dann zur Consumer Filtern gesendet wird. Datenanbieter verwenden zwei DataTable-Objekte , um Daten zu organisieren und zu speichern. Weitere Informationen finden Sie unter PerformancePoint Services-Filter.

Die folgenden Verfahren und Beispiele, die Ihnen zeigen, wie das Erstellen, konfigurieren und definieren Sie einen Filter Datenanbieter basieren auf der SampleFilterDataProvider -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 eines Datenanbieters für benutzerdefinierte PerformancePoint-Dienste Filter in SharePoint.

Es wird empfohlen, dass Sie den beispieldatenanbieter als Vorlage verwenden. Das Beispiel zeigt, wie Objekte in der PerformancePoint-Dienste-API-aufrufen und bewährte Methoden für die Entwicklung von PerformancePoint-Dienste veranschaulicht.

Erstellen von Datenanbietern für benutzerdefinierte PerformancePoint-Dienste Filter

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

  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.

    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.

  3. Fügen Sie die folgenden PerformancePoint-Dienste DLLs als Assemblyverweise zum Projekt hinzu:

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.PerformancePoint.Scorecards.Server.dll

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

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

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

  5. Erben Sie von der CustomParameterDataProvider-Basisklasse .

  6. Set the string identifier for the data provider name. This must match the key that you add to the CustomParameterDataProviders section of the web.config file when you register the extension. For more information, see How to: Manually Register PerformancePoint Services Extensions.

  7. Überschreiben Sie die GetId() -Methode, um den Bezeichner für Ihren Datenanbieter zurückzugeben.

  8. Überschreiben Sie die GetDisplayDataInternal-Methode , um ein DataTable-Objekt zum Speichern der Datenwerte aus der zugrunde liegenden Datenquelle zu definieren. Diese Methode wird vom Filter zum Auffüllen des Filterauswahlsteuerelements verwendet. Die Anzeigedatentabelle muss die folgenden Spaltennamen enthalten:

    • Key Der eindeutige Bezeichner für den Datensatz. Dieser Wert darf nicht NULL sein. Aus Leistungs- und Sicherheitsgründen wird von Steuerelementen nur ein Schlüssel ausgegeben; aus den anderen Spalten werden keine Werte ausgegeben.

    • Display Der Wert, der im Filtersteuerelement angezeigt wird.

    • ParentKey Dieser Wert wird zum Anordnen hierarchischer Daten in einem Struktursteuerelement verwendet.

    • IsDefault Dieser Wert wird für die Filterpersistenz verwendet.

      Tipp

      Sie können weitere Spalten hinzufügen, um die Filterfunktionalität zu erweitern.

    Mit GetDisplayDataInternal wird die DataSourceRegistry.GetDataSource(DataSource) -Methode aufgerufen, um wie folgt den Datenquellentyp nach dem Namen zu überprüfen:

    • Sie verweist auf einen benutzerdefinierten Datenquellentyp mithilfe der SubTypeId-Eigenschaft der Datenquelle, die demselben Wert wie das subType-Attribut entspricht, das in der PerformancePoint-Dienste web.config-Datei für die Datenquellenerweiterung registriert ist.
    • Sie verweist mithilfe der SourceName-Eigenschaft auf eine native Datenquelle, die ein Feld aus der DataSourceNames-Klasse zurückgibt.
  9. Überschreiben Sie die GetMessageData-Methode , um die Auswahl des Benutzers aus dem Filtersteuerelement zu speichern. Diese Methode wird vom Filter verwendet, wenn die Auswahl des Benutzers an Consumer gesendet wird.

Codebeispiel: Erstellen eines Datenanbieters für benutzerdefinierte PerformancePoint-Dienste-Filter in SharePoint

Das folgende Codebeispiel zeigt, wie ein Datenanbieter Werte aus einem Webdienst oder einem Excel-Arbeitsblatt abruft und DataTable-Objekte für die Anzeigedaten und Nachrichtendaten des Filters zurückgibt.

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

using System.Data;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.Server.Extensions;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleFilter
{
    // Represents the sample filter's data provider.
    public class SampleFilterDataProvider : CustomParameterDataProvider
    {

        // This value must match the key that you register for this extension
        // in the CustomParameterDataProviders section in the web.config file.
        private const string dataProviderName = "SampleFilterDataProvider";

        // Returns a table of all possible values (rows) for the
        // filter's beginpoints. The filter's BeginPoint property returns
        // one ParameterDefinition object.
        protected override DataTable GetDisplayDataInternal(ParameterDefinition parameterDefinition, RepositoryLocation parameterSourceLocation, object custom)
        {
            DataTable retrievedData = null;

            // Get the data source.
            DataSource parameterDataSource = SafeGetDataSource(parameterSourceLocation);
            if (null != parameterDataSource)
            {

                // Verify that the data source is the sample data source
                // or an Excel workbook, which are the types that the
                // sample supports.
                // If you modify these types of data source, you must make
                // the corresponding change in the filter's editor.
                if (parameterDataSource.SourceName == "WSTabularDataSource" || parameterDataSource.SourceName == DataSourceNames.ExcelWorkbook)
                {
                    IDataSourceProvider parameterDataSourceProvider =
                        DataSourceRegistry.GetDataSource(parameterDataSource);
                    if (null != parameterDataSourceProvider)
                    {
                        var dataSourceMetadata = parameterDataSourceProvider as IDataSourceMetadata;
                        if (null != dataSourceMetadata)
                        {

                            // Get the data and store it in the retrievedDataSet
                            // variable. The -1 parameter returns all records
                            // from the data source.
                            DataSet retrievedDataSet = dataSourceMetadata.GetPreviewDataSet(-1);

                            // Verify that the dataset contains data.
                            if (retrievedDataSet != null &&
                                retrievedDataSet.Tables != null &&
                                retrievedDataSet.Tables.Count > 0 &&
                                retrievedDataSet.Tables[0] != null &&
                                retrievedDataSet.Tables[0].Columns != null &&
                                retrievedDataSet.Tables[0].Columns.Count > 0 &&
                                retrievedDataSet.Tables[0].Rows != null &&
                                retrievedDataSet.Tables[0].Rows.Count > 0 &&
                                retrievedDataSet.Tables[0].Columns.Contains(parameterDefinition.KeyColumn))
                            {
                                retrievedData = retrievedDataSet.Tables[0];
                            }
                        }
                    }
                }

                if (null != retrievedData)
                {
                    // Name the display data table.
                    retrievedData.TableName = "ParamData";

                    // Verify that the table has the correct structure.
                    EnsureDataColumns(retrievedData, parameterDefinition);

                    bool firstRowSeen = false;
                    foreach (DataRow row in retrievedData.Rows)
                    {
                        // Set the ParentKeyColumn to null because the data
                        // does not have a hierarchical structure.
                        row[parameterDefinition.ParentKeyColumn] = null;

                        // Set the IsDefaultColumn column in the first row to true.
                        row[parameterDefinition.IsDefaultColumn] = !firstRowSeen;
                        if (!firstRowSeen)
                        {
                            firstRowSeen = true;
                        }
                    }

                    // Set the column visibility.
                    SetColumnVisibility(retrievedData);
                }
            }

            return retrievedData;
        }

        // Adds the ShowColumn extended property to a column in the display data table
        // and sets it to true. This exposes the column in Dashboard Designer as
        // a source value for the beginpoint.
        private static void SetColumnVisibility(DataTable displayData)
        {
            for (int i = 0; i < displayData.Columns.Count; i++)
            {
                if (!displayData.Columns[i].ExtendedProperties.Contains("ShowColumn"))
                {
                    displayData.Columns[i].ExtendedProperties.Add("ShowColumn", true);
                }
            }
        }

        // Verify that all required columns are in the data table.
        // The data table returned by this method is expected to contain a
        // Key, ParentKey, IsDefault, Display, and an arbitrary number of
        // Value columns.
        // The specific column names (except for Value columns) are defined
        // in the filter's ParameterDefinition object, which is referenced by
        // the filter's BeginPoint property.
        private static void EnsureDataColumns(DataTable dataTable, ParameterDefinition parameterDefinition)
        {
            if (!string.IsNullOrEmpty(parameterDefinition.KeyColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.KeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.KeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.DisplayColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.DisplayColumn))
            {
                dataTable.Columns.Add(parameterDefinition.DisplayColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.ParentKeyColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.ParentKeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.ParentKeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.IsDefaultColumn) &amp;&amp; !dataTable.Columns.Contains(parameterDefinition.IsDefaultColumn))
            {
                dataTable.Columns.Add(parameterDefinition.IsDefaultColumn, typeof(bool));
            }
        }

        // Returns the unique string identifier of the data provider.
        // This value must match the key that you register for this extension
        // in the CustomParameterDataProviders section in the web.config file.
        public override string GetId()
        {
            return dataProviderName;
        }

        // Returns a table of rows that match the keys in the passed
        // ParameterMessage object.
        // This method is used by controls that accept parameters, such as
        // scorecard and reports. It can also apply a Post Formula.
        public override DataTable GetMessageData(RepositoryLocation providerLocation, ParameterMessage parameterMessage, RepositoryLocation parameterSourceLocation, ParameterMapping parameterMapping, object custom)
        {
            DataTable msgTable = null;

            // The ParameterMapping object contains information about
            // linked dashboard items.
            // The CustomData object is optionally used to store information
            // that is not stored in other properties.
            DataTable displayTable = GetDisplayDataInternal(parameterMessage, parameterSourceLocation, custom);

            if (null != displayTable)
            {
                msgTable = displayTable.Clone();
                for (int i = 0;i < parameterMessage.Values.Rows.Count; i++)
                {
                    for (int j = 0;j < displayTable.Rows.Count; j++)
                    {
                        if (!parameterMessage.Values.Rows[i][parameterMessage.KeyColumn].Equals(displayTable.Rows[j][parameterMessage.KeyColumn].ToString()))
                            continue;

                        msgTable.ImportRow(displayTable.Rows[j]);
                        break;
                    }
                }
            }

            return msgTable;
        }
    }
}

Nächste Schritte

Nachdem Sie einen Datenanbieter und einen Filter-Editor (einschließlich seiner Benutzeroberfläche, falls erforderlich) erstellt haben, stellen Sie die Erweiterung wie unter Vorgehensweise: Manuelles Registrieren von PerformancePoint-Dienste-Erweiterungen beschrieben bereit.

Siehe auch