PerformancePoint Services フィルターのデータ プロバイダーを作成する
最終更新日: 2011年8月30日
適用対象: SharePoint Server 2010
Microsoft SharePoint Server 2010 の PerformancePoint Services では、データ プロバイダーが、フィルターの基盤となっているデータ ソースからデータを取得し、そのデータの使用方法を定義します。最も重要なことは、フィルターの開始ポイントとして使用できるフィルター コントロールおよびデータに公開するためのデータ値をデータ プロバイダーが指定することです。また、データ プロバイダーには、ユーザーがフィルター コントロールから選択する値が格納されます。ユーザーが選択した値は、その後、フィルター コンシューマーに送信されます。データ プロバイダーは 2 つの DataTable オブジェクトを使用して、データの整理と格納を行います。詳細については、「PerformancePoint Services フィルター」を参照してください。
適用先: PerformancePoint Services for SharePoint Server (Enterprise バージョン)
このトピックの手順と例は、「カスタム オブジェクト サンプル」の SampleFilterDataProvider クラスに基づいています。エディターは、ユーザーがレポートの名前と詳細を変更できるシン Web アプリケーションです。クラスのための完全なコードは、このトピックの「使用例」セクションで提供されています。
注意
サンプルのデータ プロバイダーをテンプレートとして使用することをお勧めします。このサンプルは、PerformancePoint Services API のオブジェクトを呼び出す方法、および PerformancePoint Services 開発のベスト プラクティスを示しています。
データ プロバイダーを作成するには、以下の 2 つの基本手順を実行します。
プロバイダー クラスの作成と設定
プロバイダー機能の定義
カスタム プロバイダーを作成するには、プロバイダー クラスの作成から始めます。
プロバイダー クラスを作成して設定するには
PerformancePoint Services をインストールするか、拡張機能が使用する (手順 3. で示した) DLL をコンピューターにコピーします。詳細については、「開発シナリオで使用される PerformancePoint Services DLL」を参照してください。
Visual Studio で、C# クラス ライブラリを作成します。拡張機能のためのクラス ライブラリを既に作成している場合、新しい C# クラスを追加します。
プロジェクトに、アセンブリ参照として以下の PerformancePoint Services DLL を追加します。
Microsoft.PerformancePoint.Scorecards.Client.dll
Microsoft.PerformancePoint.Scorecards.Server.dll
拡張機能の機能によっては、その他のプロジェクト参照が必要になることがあります。
プロバイダー クラスで、以下の PerformancePoint Services 名前空間のために using ディレクティブを追加します。
拡張機能の機能によっては、その他の using ディレクティブが必要になることがあります。
CustomParameterDataProvider 基底クラスから継承します。
プロバイダー クラスを作成して設定した後で、プロバイダーの機能を定義する必要があります。
プロバイダーの機能を定義するには
データ プロバイダー名の文字列識別子を設定します。これは、拡張機能を登録するときに web.config ファイルの CustomParameterDataProviders セクションに追加するキーと一致する必要があります。詳細については、「[方法] PerformancePoint Services の拡張機能を手動で登録する」を参照してください。
GetId() メソッドを上書きして、使用するデータ プロバイダーの識別子を返すようにします。
GetDisplayDataInternal メソッドを上書きし、基盤となるデータ ソースからデータ値を格納するように DataTable オブジェクトを定義します。フィルターはこのメソッドを使用して、フィルター選択コントロールのデータを設定します。表示データ テーブルには、以下の列名を含める必要があります。
Key レコードの一意な識別子。この値を null に指定できません。パフォーマンスとセキュリティ上の目的で、コントロールではキーのみが作成されます。他の列からの値は作成されません。
Display フィルター コントロールに表示する値。
ParentKey この値は、ツリー コントロール内の階層データの配置に使用されます。
IsDefault この値は、フィルター永続化のために使用されます。
ヒント
列をさらに追加して、フィルターの機能を拡張できます。
GetDisplayDataInternal は、DataSourceRegistry.GetDataSource(DataSource) メソッドを呼び出して、次のように、名前によってデータ ソースの種類を確認します。
データ ソース拡張機能の PerformancePoint Services web.config ファイルに登録された subType 属性と同じ値のデータ ソースの SubTypeId プロパティを使用して、カスタム データ ソースの種類を参照します。
DataSourceNames クラスからフィールドを返す SourceName プロパティを使用して、ネイティブ データ ソースを参照します。
GetMessageData メソッドを上書きして、フィルター コントロールからユーザーの選択を格納するようにします。フィルターは、ユーザーの選択をコンシューマーに送信するときに、このメソッドを使用します。
次の手順: データ プロバイダーとフィルター エディター (必要な場合は、そのユーザー インターフェイスも含む) を作成した後、「[方法] PerformancePoint Services の拡張機能を手動で登録する」に説明されているとおりに拡張機能を展開します。フィルター拡張機能のサンプルをインストールおよび設定する方法の詳細については、「コード サンプル: カスタム レポート、フィルター、および表形式データ ソース オブジェクト」の「サンプルのレポート、フィルター、およびデータ ソース オブジェクトのインストール」セクションを参照してください。
例
次のコード例は、データ プロバイダーが Web サービスまたは Excel ワークシートから値を取得し、フィルターの表示データおよびメッセージ データ用の DataTable オブジェクトを返す方法を示しています。
注意
このコード例をコンパイルする前に、「プロバイダー クラスを作成して設定するには」で説明されているとおりに開発環境を設定する必要があります。
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;
}
}
}
コードのコンパイル
このコード例をコンパイルする前に、「プロバイダー クラスを作成して設定するには」で説明されているとおりに開発環境を設定する必要があります。
セキュリティ
DLL には厳密な名前で署名する必要があります。さらに、DLL によって参照されたすべてのアセンブリが厳密な名前を持つことを確認してください。厳密な名前を使用してアセンブリに署名する方法の詳細、および公開/秘密キーのペアを作成する方法の詳細については、「How to: Create a Public/Private Key Pair」を参照してください。
関連項目
タスク
[方法] PerformancePoint Services フィルターのエディターを作成する
概念
PerformancePoint Services フィルター