SharePoint で PerformancePoint Services 用の表形式のデータ ソース プロバイダーを作成するCreate tabular data source providers for PerformancePoint Services in SharePoint

PerformancePoint サービス のユーザー設定の表形式データ ソース拡張機能のデータ ソース プロバイダー コンポーネントを作成する方法を確認します。Learn how to create the data source provider component in a custom tabular data source extension for PerformancePoint Services.

PerformancePoint サービス のユーザー設定のデータ ソース プロバイダーの概要What are custom data source providers for PerformancePoint Services?

データ ソース プロバイダーは、データ ソースに接続し、そのデータにアクセスして、クエリ結果を返します。PerformancePoint サービス は、表形式のデータ ソース プロバイダーを使用して、Excel および Excel Services ワークシート、SharePoint リスト、Microsoft SQL Server テーブルのデータにアクセスします。カスタム データ ソース プロバイダーを使用して、PerformancePoint サービス でサポートされていない表形式のデータ ソースのデータを使用できます。Data source providers connect to a data source, access its data, and then return query results. PerformancePoint Services uses tabular data source providers to access data from Excel and Excel Services worksheets, SharePoint lists, and Microsoft SQL Server tables. You can create a custom data source provider to use data from a tabular data source that is not supported by PerformancePoint Services.

表形式のデータ ソース プロバイダーの主な機能は、データ テーブルを作成して、それにデータ ソースのデータを入力することです。さらに列のマッピングを作成し、各列に含まれるデータの型 (ファクト、ディメンション、時間ディメンション) を定義します。これにより、基本的な多次元構造が表形式のデータに適用されます。The main function of a tabular data source provider is to create and populate a data table with data from the data source. It also creates column mappings to define the type of data that each column contains (fact, dimension, or time dimension). This applies a basic multidimensional structure to the tabular data.

このトピックの手順とコード例は、カスタム オブジェクト サンプルWSTabularDataSourceProvider クラスに基づいています。The procedures and code examples in this topic are based on the WSTabularDataSourceProvider class from the custom objects sample. プロバイダーは、指定された株式シンボル用の外部 Web サービスから株式を取得します。The provider retrieves stock quotes from an external web service for specified stock symbols. プロバイダーは株式の履歴データをキャッシュ ファイルに格納します。これによりデータは時間単位で分割できます。It stores historical stock quote data in a cache file, which enables the data to be sliced by time. クラスの完全なコードは、「コード例: SharePoint のユーザー設定の PerformancePoint サービス の表形式データ ソースのデータ ソース プロバイダーを作成する」を参照してください。For the complete code for the class, see Code example: Create a data source provider for custom PerformancePoint Services tabular data sources in SharePoint.

テンプレートとして、サンプルのデータ ソース プロバイダーを使用することをお勧めします。サンプルは、PerformancePoint サービス API のオブジェクトを呼び出す方法と、PerformancePoint サービス 開発のベスト プラクティスを示します。We recommend that you use the sample data source provider as a template. The sample shows how to call objects in the PerformancePoint Services API and demonstrates best practices for PerformancePoint Services development.

ユーザー設定の PerformancePoint サービス 表形式のデータ ソースのデータ ソース プロバイダーを作成するCreate data source providers for custom PerformancePoint Services tabular data sources

  1. PerformancePoint サービス をインストールするか、拡張機能が使用する (手順 3. で示した) DLL をコンピューターにコピーします。方法は、「 開発シナリオで使用される PerformancePoint Services DLL」を参照してください。Install PerformancePoint Services, or copy the DLLs that your extension uses (listed in step 3) to your computer. For instructions, see DLLs with Class Libraries.

  2. Visual Studio で、C# クラス ライブラリを作成します。拡張機能のためのクラス ライブラリを既に作成している場合、新しい C# クラスを追加します。In Visual Studio, create a C# class library. If you have already created a class library for your extension, add a new C# class.

    DLL には厳密な名前で署名する必要があります。 さらに、DLL によって参照されたすべてのアセンブリが厳密な名前を持つことを確認してください。厳密な名前を使用してアセンブリに署名する方法の詳細、および公開/秘密キーのペアを作成する方法の詳細については、「 How to: Create a Public/Private Key Pair」を参照してください。You must sign your DLL with a strong name. In addition, ensure that all assemblies referenced by your DLL have strong names. For information about how to sign an assembly with a strong name and how to create a public/private key pair, see How to: Create a Public/Private Key Pair.

  3. 以下の PerformancePoint サービス DLL をアセンブリ参照としてプロジェクトに追加します。Add the following PerformancePoint Services DLLs as assembly references to the project:

    • Microsoft.PerformancePoint.Scorecards.Client.dllMicrosoft.PerformancePoint.Scorecards.Client.dll
  • Microsoft.PerformancePoint.Scorecards.DataSourceProviders.Standard.dllMicrosoft.PerformancePoint.Scorecards.DataSourceProviders.Standard.dll
<span data-ttu-id="ce57d-p108">サンプル データ ソース プロバイダーには、System.Core.dll、System.ServiceModel.dll、System.Web.dll、System.Web.Services.dll、および System.Xml.Linq.dll へのアセンブリ参照も含まれます。拡張機能の機能によっては、その他のプロジェクト参照が必要になることがあります。</span><span class="sxs-lookup"><span data-stu-id="ce57d-p108">The sample data source provider also contains assembly references to System.Core.dll, System.ServiceModel.dll, System.Web.dll, System.Web.Services.dll, and System.Xml.Linq.dll. Depending on your extension's functionality, other project references may be required.</span></span>
  1. アドレス http://www.webservicex.net/stockquote.asmx にある Web サービスを参照する StockQuotes という名前のサービス参照を追加します。これは、サンプル データ ソース用の株価を提供する Web サービスです。Add a service reference named StockQuotes that references the Web service located at the address http://www.webservicex.net/stockquote.asmx. This is the Web service that provides stock quotes for the sample data source.

  2. サンプルの BasicTabularDataSourceProvider クラスおよび SampleDSCacheHandler クラスをプロジェクトに追加します。 BasicTabularDataSourceProvider は、表形式のデータ ソース プロバイダーの基本クラスである TabularDataSourceProvider クラスから継承します。Add the BasicTabularDataSourceProvider and SampleDSCacheHandler classes from the sample to your project. BasicTabularDataSourceProvider inherits from the TabularDataSourceProvider class, which is the base class for tabular data source providers.

    サンプル データ ソースは、 TabularDataSourceProvider が実装しない無効にされた抽象メソッド ( GetDatabaseNames()GetCubeNames()GetCubeNameInfos()GetCubeMetaData 、および Validate() ) のコンテナーとしてクラスを使用します。The sample data source also uses the class as a container for the overridden abstract methods that TabularDataSourceProvider does not implement ( GetDatabaseNames() , GetCubeNames() , GetCubeNameInfos() , GetCubeMetaData , and Validate() ).

  3. プロバイダー クラスで、以下の PerformancePoint サービス 名前空間のために using ディレクティブを追加します。In your provider class, add using directives for the following PerformancePoint Services namespaces:

<span data-ttu-id="ce57d-141">拡張機能の機能によっては、その他の **using** ディレクティブが必要になることがあります。</span><span class="sxs-lookup"><span data-stu-id="ce57d-141">Depending on your extension's functionality, other **using** directives may be required.</span></span>
  1. BasicTabularDataSourceProvider クラスから継承します。Inherit from the BasicTabularDataSourceProvider class.

  2. 変数を宣言し、株式シンボルの解析、格納、取得に使用するプロパティ、キャッシュ ファイルの場所、プロキシ サーバーの URI を定義します。Declare variables and define properties that are used for parsing, storing, and retrieving stock symbols, the cache file location, and the URI of the proxy server.

  3. IsConnectionStringSecure プロパティを上書きします。このプロパティは PerformancePoint サービス には使用されません。このプロパティは、セキュリティ リスクをもたらす情報を接続文字列が公開するかどうかを特定するために、カスタム アプリケーションが任意に使用します。Override the IsConnectionStringSecure property. This property is not used by PerformancePoint Services, but it is intended for custom applications to optionally use to identify whether a connection string exposes information that might pose a security risk.

    拡張機能によってユーザー名、パスワードなどの機密情報がデータ ソースの接続文字列に格納される場合は、 true を返します。機密情報が格納されないか、データ ソースで接続文字列が使用されない場合は、 false を返します。Return true if your extension stores sensitive information—such as a user name or password—in the connection string for your data source. Return false if it does not store sensitive information or if your data source does not use a connection string.

  4. GetId() メソッドを上書きして、プロバイダー用の一意の識別子を返します。 GetId() は、カスタム データ ソース プロバイダー用の PerformancePoint サービス web.config ファイルに登録されている key 属性と同じ文字列を返す必要があります。Override the GetId() method to return the unique identifier for your provider. GetId() must return the same string as the key attribute that is registered in the PerformancePoint Services web.config file for the custom data source provider.

  5. SetDataSource メソッドを上書きして、列のマッピングを定義します。 SetDataSource は、 CreateDataColumnMappings メソッドを呼び出し、 FactDimensionTimeDimension の型としてデータ ソース列を定義します。Override the SetDataSource method to define column mappings. SetDataSource calls the CreateDataColumnMappings method to define data source columns as Fact , Dimension , and TimeDimension types.

    SetDataSource はさらに、株式シンボル、キャッシュ ファイルの場所、およびプロキシ alsoサーバー アドレスを、ユーザー設定のデータ ソース オブジェクトの CustomData プロパティから取得します。これらの値は、サンプル データ ソース エディターのダッシュボード作成者によって定義されます。SetDataSource also retrieves the stock symbols, cache file location, and proxy server address from the CustomData property of the custom data source object. These values are defined by dashboard authors in the sample data source editor.

  6. GetDataSet() メソッドを上書きして、データ ソースのデータを格納する DataSet オブジェクトを作成します。サンプル データ ソース プロバイダーは FillResultsTable メソッドおよび GetLiveQuote メソッドを使用して、データ テーブルに Web サービスからのデータを入力します。Override the GetDataSet() method to create a DataSet object to store the data from the data source. The sample data source provider uses the FillResultsTable and GetLiveQuote methods to populate a data table with data from a Web service.

コード例: SharePoint のユーザー設定の PerformancePoint サービス の表形式データ ソースのデータ ソース プロバイダーを作成するCode example: Create a data source provider for custom PerformancePoint Services tabular data sources in SharePoint

以下のコード例のクラスでは、外部 Web サービスから株価を取得する表形式のデータ ソース プロバイダーを作成し、データを表形式に変換します。The class in the following code example creates a tabular data source provider that retrieves stock quotes from an external Web service and then transforms the data into a tabular format.

このコード例をコンパイルするには、「 ユーザー設定の PerformancePoint サービス 表形式のデータ ソースのデータ ソース プロバイダーを作成する」に示されているとおりに開発環境を構成する必要があります。Before you can compile this code example, you must configure your development environment as described in Create data source providers for custom PerformancePoint Services tabular data sources.


using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.ServerCommon;
using Microsoft.PerformancePoint.SDK.Samples.StockQuotes;
using System.ServiceModel;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleDataSource
{

    // Represents the class that defines the sample data source provider.
    // It inherits from the BasicTabularDataSourceProvider class, which
    // contains overridden abstract methods that are not implemented.
    public class WSTabularDataSourceProvider : BasicTabularDataSourceProvider
    {
        #region Constants
        private const int StockSymbolsIndex = 0;
        private const int CacheFileLocationIndex = 1;
        private const int ProxyAddressIndex = 2;
        #endregion

        #region Properties

        // This property stores the stock symbols that are used
        // to query the Web service.
        // Its value is obtained by parsing the CustomData property
        // of the data source object. 
        private string[] StockSymbols
        {
            get;
            set;
        }

        // The address of the proxy server.
        private Uri ProxyAddress
        {
            get;
            set;
        }

        // This property is not used by PerformancePoint Services.
        // Its intended use is for custom applications to indicate
        // whether a provider stores sensitive information in the
        // connection string, such as user name and password.
        // This sample does not, so it returns false. 
        public override bool IsConnectionStringSecure
        {
            get { return false; }
        }
        #endregion

        #region Overridden methods

        // The source name for your data source. This value must match the key
        // attribute that is registered in the web.config file.
        public override string GetId()
        {
            return "WSTabularDataSource";
        }

        // Add column mappings for the sample columns if they do not exist.
        // Column mappings may be missing if the custom data source has never
        // been edited or if the workspace was not refreshed, which saves
        // changes to the server.
        public override void SetDataSource(DataSource dataSource)
        {

            base.SetDataSource(dataSource);

            // Check for symbols stored in the CustomData
            // property of the data source.
            if (null == dataSource ||
                 string.IsNullOrEmpty(dataSource.CustomData))
            {

                // Create a symbol for testing purposes.
                StockSymbols = new[] { "MSFT" };
            }
            else
            {
                string[] splitCustomData = dataSource.CustomData.Split('&amp;');
                if (splitCustomData.Length > 2)
                {
                    StockSymbols = splitCustomData[StockSymbolsIndex].ToUpper().Split(',');
                    for (int iLoop = 0; iLoop < StockSymbols.Length; iLoop++)
                    {
                        StockSymbols[iLoop] = StockSymbols[iLoop].Trim();
                    }

                    SampleDSCacheHandler.CacheFileLocation = splitCustomData[CacheFileLocationIndex];
                    ProxyAddress = new Uri(splitCustomData[ProxyAddressIndex]);
                }
            }

            // Check whether column mappings exist. Do not overwrite them.
            if (dataSource.DataTableMapping.ColumnMappings.Count == 0)
            {
                dataSource.DataTableMapping = CreateDataColumnMappings();
            }
        }

        // Get the data from the data source.
        // GetDataSet contains the core logic for the provider.
        public override DataSet GetDataSet()
        {

            // Create a dataset and a data table to store the data.
            DataSet resultSet = new DataSet();
            DataTable resultTable = resultSet.Tables.Add();

            // Define column names and the type of data that they contain. 
            resultTable.Columns.Add("Symbol", typeof(string));
            resultTable.Columns.Add("Value", typeof(float));
            resultTable.Columns.Add("P-E Ratio", typeof(float));
            resultTable.Columns.Add("Percentage Change", typeof(float));
            resultTable.Columns.Add("Date", typeof(DateTime));

            FillResultTable(ref resultTable);

            return resultSet;
        }
        #endregion

        #region Internal methods

        // Fill the data table with the stock quote values from
        // the Web service and local cache file.
        protected void FillResultTable(ref DataTable resultsTable)
        {

            // Check the sematic validity of symbols (out of scope for this sample).
            if (null != StockSymbols &amp;&amp;
                StockSymbols.Length > 0 &amp;&amp;
                !string.IsNullOrEmpty(SampleDSCacheHandler.CacheFileLocation))
            {
                try
                {
                    if (!File.Exists(SampleDSCacheHandler.CacheFileLocation))
                    {

                        // Create the cache file.
                        XDocument doc = SampleDSCacheHandler.DefaultCacheFileContent;
                        doc.Save(@SampleDSCacheHandler.CacheFileLocation);
                    }

                    // Get real-time quotes and update cache file.
                    string wsResult = GetLiveQuote();

                    SampleDSCacheHandler.UpdateXMLCacheFile(wsResult);

                    // Check if a valid cache file location exists.
                    if (SampleDSCacheHandler.CacheFileContent != null)
                    {
                        var query = from c in SampleDSCacheHandler.CacheFileContent.Elements("StockQuotes").Elements("StockQuote")
                                    where StockSymbols.Contains(c.Attribute("Symbol").Value)
                                    select c;

                        foreach (var stockQuote in query)
                        {
                            DataRow row = resultsTable.NewRow();
                            row["Symbol"] = stockQuote.Attribute("Symbol").Value;
                            row["Value"] = stockQuote.Element("Value").Value;
                            row["Percentage Change"] = stockQuote.Element("PercentageChange").Value;
                            row["Date"] = stockQuote.Element("Date").Value;

                            decimal peRatio;

                            // Handle symbols that return 'N/A' for this field.
                            if (decimal.TryParse(stockQuote.Element("PERatio").Value, out peRatio))
                            {
                                row["P-E Ratio"] = peRatio;
                            }

                            resultsTable.Rows.Add(row);
                        }
                    }
                }
                catch (Exception ex)
                {
                    ServerUtils.HandleException(ex);
                }
            }
        }

        // Get real-time quotes from the Web service.
        protected string GetLiveQuote()
        {
            EndpointAddress endpoint = new EndpointAddress("http://www.webservicex.net/stockquote.asmx");
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.ReceiveTimeout = new TimeSpan(0, 0, 120);
            binding.ProxyAddress = ProxyAddress;
            binding.UseDefaultWebProxy = false;

            StockQuotes.StockQuoteSoapClient wsStockQuoteService = new StockQuoteSoapClient(binding, endpoint);

            // Check the sematic validity of symbols (out of scope for this sample).
            if (null != StockSymbols &amp;&amp;
                StockSymbols.Length > 0)
            {
                try
                {
                    string quoteRequest = StockSymbols[0];
                    for (int iLoop = 1; iLoop < StockSymbols.Length; iLoop++)
                    {
                        quoteRequest = string.Format("{0}, {1}", quoteRequest, StockSymbols[iLoop]);
                    }

                    string wsResult = wsStockQuoteService.GetQuote(quoteRequest);
                    return wsResult;
                }
                catch (Exception ex)
                {
                    ServerUtils.HandleException(ex);
                }
            }
            return string.Empty;
        }

        // Create the column mappings.
        internal static DataTableMapping CreateDataColumnMappings()
        {
            DataTableMapping dtTableMapping = new DataTableMapping();

            // Define the data in the Symbol column as dimension data.
            dtTableMapping.ColumnMappings.Add(new DataColumnMapping
            {
                SourceColumnName = "Symbol",
                FriendlyColumnName = "Symbol",
                UniqueName = "Symbol",
                ColumnType = MappedColumnTypes.Dimension,
                FactAggregation = FactAggregations.None,
                ColumnDataType = MappedColumnDataTypes.String
            });

            // Define the data in the Value column as fact data.
            dtTableMapping.ColumnMappings.Add(new DataColumnMapping
            {
                SourceColumnName = "Value",
                FriendlyColumnName = "Value",
                UniqueName = "Value",
                ColumnType = MappedColumnTypes.Fact,
                FactAggregation = FactAggregations.Average,
                ColumnDataType = MappedColumnDataTypes.Number
            });

            // Define the data in the P-E Ratio column as fact data.
            dtTableMapping.ColumnMappings.Add(new DataColumnMapping
            {
                SourceColumnName = "P-E Ratio",
                FriendlyColumnName = "P-E Ratio",
                UniqueName = "P-E Ratio",
                ColumnType = MappedColumnTypes.Fact,
                FactAggregation = FactAggregations.Average,
                ColumnDataType = MappedColumnDataTypes.Number
            });

            // Define the data in the Percentage Change column as fact data.
            dtTableMapping.ColumnMappings.Add(new DataColumnMapping
            {
                SourceColumnName = "Percentage Change",
                FriendlyColumnName = "Percentage Change",
                UniqueName = "Percentage Change",
                ColumnType = MappedColumnTypes.Fact,
                FactAggregation = FactAggregations.Average,
                ColumnDataType = MappedColumnDataTypes.Number
            });

            // Define the Date column as a time dimension.
            dtTableMapping.ColumnMappings.Add(new DataColumnMapping
            {
                SourceColumnName = "Date",
                FriendlyColumnName = "Date",
                UniqueName = "Date",
                ColumnType = MappedColumnTypes.TimeDimension,
                FactAggregation = FactAggregations.None,
                ColumnDataType = MappedColumnDataTypes.DateTime
            });

            // Increase the granularity of the time dimension.
            dtTableMapping.DateAggregationType |= DateAggregationTypes.Quarter;
            dtTableMapping.DateAggregationType |= DateAggregationTypes.Month;
            dtTableMapping.DateAggregationType |= DateAggregationTypes.Week;
            dtTableMapping.DateAggregationType |= DateAggregationTypes.Day;

            return dtTableMapping;
        }
        #endregion
    }
}

次の手順Next steps

次の手順: データ ソース プロバイダーとデータ ソース エディター (必要に応じて、ユーザー インターフェイスも) を作成したら、「 [方法] PerformancePoint Services の拡張機能を手動で登録する」で説明されているように、拡張機能を展開します。After you create a data source provider and a data source editor (including its user interface, if required), deploy the extension as described in How to: Manually Register PerformancePoint Services Extensions.

関連項目See also