Freigeben über


Gewusst wie: Erstellen von Datenanbietern für PerformancePoint Services-Filter

Letzte Änderung: Dienstag, 30. August 2011

In PerformancePoint Services in Microsoft SharePoint Server 2010 rufen Datenanbieter Daten aus der zugrunde liegenden Datenquelle eines Filters ab und definieren die Verwendungsweise der Daten. Datenanbieter geben aber vor allem an, welche Datenwerte im Filtersteuerelement verfügbar gemacht werden sollen und welche Daten als Ausgangspunkt des Filters verwendet werden können. Darüber hinaus speichert ein Datenanbieter den Wert, den ein Benutzer im Filtersteuerelement auswählt, der dann an Filterconsumer gesendet wird. Datenanbieter verwenden zwei DataTable-Objekte zum Organisieren und Speichern von Daten. Weitere Informationen finden Sie unter PerformancePoint Services-Filter.

Gilt für: SharePoint Server 2010

Die Prozeduren und Beispiele in diesem Thema basieren auf der SampleFilterDataProvider-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 Beispieldatenanbieter 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 Datenanbieters führen Sie die folgenden beiden grundlegenden Verfahren aus:

  • Erstellen und Konfigurieren der Anbieterklasse

  • Definieren der Anbieterfunktionalität

Zum Erzeugen eines benutzerdefinierten Anbieters erstellen Sie zunächst die Anbieterklasse.

So erstellen und konfigurieren Sie die Anbieterklasse

  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

    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 Services-Namespaces hinzu:

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

  5. Sie muss von der CustomParameterDataProvider-Basisklasse erben.

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

So definieren Sie die Anbieterfunktionalität

  1. Legen Sie den Textbezeichner für den Datenanbieternamen fest. Dieser muss mit dem Schlüssel übereinstimmen, den Sie beim Registrieren der Erweiterung dem Abschnitt CustomParameterDataProviders der Datei web.config hinzufügen. Weitere Informationen finden Sie unter Gewusst wie: Manuelles Registrieren von PerformancePoint-Dienste-Erweiterungen.

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

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

      TippTipp

      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:

    • Es wird auf einen benutzerdefinierten Datenquellentyp verwiesen, indem die SubTypeId-Eigenschaft der Datenquelle verwendet wird, wobei dieser Wert mit dem subType-Attribut identisch ist, das in der Datei web.config von PerformancePoint Services für die Datenquellenerweiterung registriert ist.

    • Es wird auf eine systemeigene Datenquelle verwiesen, indem die SourceName-Eigenschaft verwendet wird, mit der ein Feld aus der DataSourceNames-Klasse zurückgegeben wird.

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

    Nächster Schritt: Nachdem Sie einen Datenanbieter und einen Filter-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 Beispielfiltererweiterung 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

Im folgenden Codebeispiel wird veranschaulicht, wie ein Datenanbieter Werte von einem Webdienst oder einem Excel-Arbeitsblatt abruft und DataTable-Objekte für die Anzeige- und Meldungsdaten des Filters zurückgibt.

HinweisHinweis

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) && !dataTable.Columns.Contains(parameterDefinition.KeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.KeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.DisplayColumn) && !dataTable.Columns.Contains(parameterDefinition.DisplayColumn))
            {
                dataTable.Columns.Add(parameterDefinition.DisplayColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.ParentKeyColumn) && !dataTable.Columns.Contains(parameterDefinition.ParentKeyColumn))
            {
                dataTable.Columns.Add(parameterDefinition.ParentKeyColumn);
            }
            if (!string.IsNullOrEmpty(parameterDefinition.IsDefaultColumn) && !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;
        }
    }
}

Code wird kompiliert

Bevor Sie dieses Codebeispiel kompilieren können, müssen Sie die Entwicklungsumgebung wie unter So erstellen und konfigurieren Sie die Anbieterklasse 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-Filter

Konzepte

PerformancePoint Services-Filter

Weitere Ressourcen

Erstellen von benutzerdefinierten Objekten für PerformancePoint Services

Codebeispiele für PerformancePoint Services in SharePoint Server 2010