SharePoint の PerformancePoint Services 用に表形式のデータ ソース エディターを作成するHow to: Create tabular data source editors for PerformancePoint Services in SharePoint

PerformancePoint サービス のカスタムの表形式データ ソース拡張機能のエディター コンポーネントを作成する方法について説明します。Learn how to create the editor component of a custom tabular data source extension for PerformancePoint Services.

PerformancePoint サービス のカスタムのデータ ソース エディターについてWhat are custom data source editors for PerformancePoint Services?

PerformancePoint サービス では、カスタムのデータ ソース エディターを使用して、カスタムの表形式データ ソースにプロパティをセットすることができます。 エディターの要件と機能の詳細については、「 カスタム PerformancePoint Services オブジェクトのエディター」を参照してください。In PerformancePoint Services, custom data source editors enable users to set properties on custom tabular data sources. For more information about editor requirements and functionality, see Editors for Custom PerformancePoint Services Objects.

以下の手順とコード例は、 カスタム オブジェクト サンプルSampleDataSourceEditor クラスに基づいています。エディターはシン Web アプリケーションで、エディターを使用して、データ ソースの名前と説明の変更、株式シンボルの入力、プロキシ サーバー アドレスとキャッシュ ファイルの場所の指定を行うことができます。クラスの完全なコードは、「 コード例: カスタムの表形式データ ソースの取得と更新」を参照してください。The following procedures and code examples are based on the SampleDataSourceEditor class from the custom objects sample. The editor is a thin web application that enables users to modify the name and description of the data source, enter stock symbols, and to specify a proxy server address and cache file location. For the complete code for the class, see Code example: Retrieve and update custom tabular data sources.

サンプル エディターをテンプレートとして使用することをお勧めします。サンプルは PerformancePoint サービス API のオブジェクトを呼び出す方法を示し、リポジトリ操作 (オブジェクトの作成、更新など) の呼び出しを容易にするヘルパー オブジェクトを提供し、PerformancePoint サービス 開発のためのベスト プラクティスを示します。We recommend that you use the sample editor as a template. The sample shows how to call objects in the PerformancePoint Services API, provides helper objects that simplify calls for repository operations (such as creating and updating objects), and demonstrates best practices for PerformancePoint Services development.

カスタムの PerformancePoint サービス 表形式データ ソース用エディターを作成するCreate editors 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 more information, 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. プロジェクトに、アセンブリ参照として以下の DLL を追加します。Add the following DLLs as assembly references to the project:

    • Microsoft.PerformancePoint.Scorecards.Client.dllMicrosoft.PerformancePoint.Scorecards.Client.dll
  • Microsoft.SharePoint.dll (ヘルパー クラスが使用)Microsoft.SharePoint.dll (used by helper classes)
<span data-ttu-id="557e5-p107">サンプル エディターには、System.Core.dll、System.Web.dll、System.Web.Services.dll、および System.Xml.Linq.dll へのアセンブリ参照も含まれます。拡張機能によっては、その他のプロジェクト参照が必要になることがあります。</span><span class="sxs-lookup"><span data-stu-id="557e5-p107">The sample editor also contains assembly references to System.Core.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. サンプルから以下のクラスをプロジェクトに追加します。エディターはこれらのヘルパー クラスを使用して PerformancePoint サービス リポジトリとキャッシュ ファイルを操作します。Add the following classes from the sample to the project. Your editor uses these helper classes to interact with the PerformancePoint Services repository and the cache file:

    • ExtensionRepositoryHelper.csExtensionRepositoryHelper.cs
  • DataSourceRepositoryHelper.csDataSourceRepositoryHelper.cs

  • SampleDSCacheHandler.csSampleDSCacheHandler.cs

  1. エディター クラスで、 Microsoft.PerformancePoint.Scorecards 名前空間の using ディレクティブを追加します。拡張機能によっては、その他の using ディレクディブが必要になることがあります。In your editor class, add a using directive for the Microsoft.PerformancePoint.Scorecards namespace. Depending on your extension's functionality, other using directives may be required.

  2. エディターの実装をサポートする基本クラスから継承します。サンプルのデータ ソース エディターは Web アプリケーションのため、 Page クラスから派生できます。他の実装では、 UserControl クラス、 WebPart クラスなどの基本クラスから派生できます。Inherit from the base class that supports your editor implementation. Because the sample data source editor is a web application, it inherits from the Page class. Other implementations can derive from base classes such as the UserControl or WebPart class.

  3. ユーザーが表示または変更できるプロパティを表示するコントロールの変数を宣言します。サンプル データ ソース エディターでは、最初にユーザー インターフェイス コンポーネント (ASPX ページ) で定義されている Web サーバー コントロールの変数を宣言します。サンプル エディターでは、ユーザーが変更を送信できるボタン コントロールも定義します。 CreateChildControls() メソッドを呼び出して、これらのコントロールをページで使用できるようにします。Declare variables for the controls that expose the properties that you want users to view or modify. The sample data source editor first declares variables for the web server controls that are defined in the user interface component, which is an ASPX page. The sample editor also defines a button control that enables users to submit changes. Then, the editor calls the CreateChildControls() method to make the controls available on the page.

    注意

    エディターは、ユーザー インターフェイスとは別のプログラミング ロジックを定義します。エディターのユーザー インターフェイス コンポーネントを作成するための説明は、この文書の範囲外となります。The editor defines programming logic separately from the user interface. Instructions for creating the user interface component of the editor are beyond the scope of this documentation.

    サンプルのデータ ソース エディターでは、手順 8. ~ 11. が Page_Load メソッドで実行されます。変数とコントロールの初期化と検証、コントロールへのデータの挿入、カスタム データ ソースとヘルパー オブジェクトの状態情報の保存にも、 Page_Load が使用されます。The sample data source editor performs steps 8 through 11 in the Page_Load method. Page_Load is also used to initialize and validate variables and controls, populate controls, and save state information for the custom data source and helper objects.

  4. クエリ文字列からパラメーターを取得し、それらを以下のコード例で示すローカル変数のための値として設定します。Retrieve the parameters from the query string and set them as values for local variables, as shown in the following code example.


// The URL of the site collection that contains the PerformancePoint Services repository.
string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];

// The location of the data source in the repository.
string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];

// The operation to perform: OpenItem or CreateItem.
string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
For information about the query string parameters, see  [Editors for Custom PerformancePoint Services Objects](http://msdn.microsoft.com/library/7c5924f1-91f3-436a-9d94-2e0dc454c8cc%28Office.15%29.aspx).
  1. 以下のコード例で示すように、リポジトリへの呼び出しを行うための DataSourceRepositoryHelper オブジェクトを取得します。Retrieve the DataSourceRepositoryHelper object that is used to make calls to the repository, as shown in the following code example.

DataSourceRepositoryHelper = new DataSourceRepositoryHelper();
  1. 以下のコード例で示すように、クエリ文字列パラメーターに基づいてデータ ソースの場所を設定します。Set the data source location based on the query string parameter, as shown in the following code example.
  RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);
  1. クエリ文字列から実行する操作 ( OpenItem または CreateItem) を取得し、カスタム データ ソースを取得または作成します。Retrieve the operation to perform ( OpenItem or CreateItem) from the query string, and then retrieve or create the custom data source.

    • カスタム データ ソースを取得するには、 DataSourceRepositoryHelper.Get メソッドを使用します。To retrieve the custom data source, use the DataSourceRepositoryHelper.Get method.
  if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
{
    // Use the repository-helper object to retrieve the data source.
    datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation);
    if (datasource == null)
    {
        displayError("Could not retrieve the data source for editing.");
        return;
    }
}
else
{
    displayError("Invalid Action.");
    return;
}
> [!NOTE]
> By default, users can create custom objects from PerformancePoint Dashboard Designer only. To enable users to create a custom object outside of Dashboard Designer, you must add a menu item that sends a  _CreateItem_ request to your editor from the content type in the repository. For more information, see [Editors for Custom PerformancePoint Services Objects](http://msdn.microsoft.com/library/7c5924f1-91f3-436a-9d94-2e0dc454c8cc%28Office.15%29.aspx). 

The sample data source editor performs steps 12 and 13 in the **buttonOK_Click** and **CreateCacheFile** methods. **buttonOK_Click** is also used to call the **AreAllInputsValid** method to validate the contents of the controls and to retrieve state information for the custom data source and the helper object.
  1. データ ソースをユーザー定義の変更で更新します。サンプル データ ソース エディターは DataSourceRepositoryHelper.Update メソッドを呼び出して、リポジトリのデータ ソース オブジェクトの NameDescriptionCustomData プロパティを更新します。 CustomData を使用し、シリアル化されたオブジェクトまたは文字列を格納できます。サンプル エディターは、これを使用して、ユーザー定義の株式シンボル、株の時価を格納するキャッシュ ファイルの場所、プロキシ サーバーの場所を格納します。Update the data source with user-defined changes. The sample data source editor calls the DataSourceRepositoryHelper.Update method to update the Name , Description , and CustomData properties of the data source object in the repository. You can use CustomData to store a serialized object or string. The sample editor uses it to store user-defined stock symbols, the location of the cache file that stores stock quote values, and the address of the proxy server.

    注意

    ユーザーは、カスタム オブジェクトの NameDescription、および Owner (責任者) プロパティを設定して、ダッシュボード デザイナーと PerformancePoint サービス リポジトリからカスタム オブジェクトを直接削除することができます。Note: Users can edit a custom object's Name , Description , and Owner ( Person Responsible) properties and delete custom objects directly from Dashboard Designer and the PerformancePoint Services repository.

  2. データ ソース プロバイダーを呼び出して、列マッピングを定義します (このマッピングが定義されていない場合)。Call the data source provider to define column mappings if they are not already defined.

コード例: SharePoint のカスタムの PerformancePoint サービス表形式データソースの取得と更新Code example: Retrieve and update custom PerformancePoint Services tabular data sources in SharePoint

次のコード例で、カスタムの表形式データ ソースの取得と更新を行います。このコードはエディターの分離コード クラスのもので、[ASPX] ページに定義されたコントロールのプログラミング ロジックを提供します。The following code example retrieves and updates custom tabular data sources. This code is from the editor's code-behind class, which provides the programming logic for controls that are defined in an ASPX page.

このコード例をコンパイルできるようにするには、「 PerformancePoint Services で表形式データ ソースのエディター クラスを作成して設定する」で説明しているように開発環境を設定する必要があります。Before you can compile this code example, you must configure your development environment as described in Create and configure the editor class for a tabular data source editor in PerformancePoint Services.


using System;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using System.Xml.Linq;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleDataSource
{
    // Represents the class that defines the sample data source editor.
    public class SampleDataSourceEditor : Page
    {

        #region Members
        // Declare private variables for the ASP.NET controls defined in the user interface.
        // The user interface is an ASPX page that defines the controls in HTML.
        private TextBox textboxName;
        private TextBox textboxDescription;
        private TextBox textboxStockSymbols;
        private TextBox textboxXMLLocation;
        private TextBox textboxProxy;
        private Label labelErrorMessage;
        private Button buttonOK;
        #endregion

        #region Page methods and events
        // Make the controls available to this class.
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (null == textboxProxy)
                textboxProxy = FindControl("textboxProxy") as TextBox;
            if (null == textboxName)
                textboxName = FindControl("textboxName") as TextBox;
            if (null == textboxDescription)
                textboxDescription = FindControl("textboxDescription") as TextBox;
            if (null == textboxStockSymbols)
                textboxStockSymbols = FindControl("textboxStockSymbols") as TextBox;
            if (null == textboxXMLLocation)
                textboxXMLLocation = FindControl("textboxXMLLocation") as TextBox;
            if (null == labelErrorMessage)
                labelErrorMessage = FindControl("labelErrorMessage") as Label;
            if (null == buttonOK)
                buttonOK = FindControl("buttonOK") as Button;
        }

        // Handles the Load event of the Page control.
        // Methods that use a control variable should call the Control.EnsureChildControls
        // method before accessing the variable for the first time.
        protected void Page_Load(object sender, EventArgs e)
        {
            // Initialize controls the first time the page loads only.
            if (!IsPostBack)
            {
                EnsureChildControls();

                DataSourceRepositoryHelper dataSourceRepositoryHelper = null;
                try
                {
                    // Get information from the query string parameters.
                    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
                    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
                    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];

                    // Validate the query string parameters.
                    if (string.IsNullOrEmpty(server) ||
                        string.IsNullOrEmpty(itemLocation) ||
                        string.IsNullOrEmpty(action))
                    {
                        displayError("Invalid URL.");
                        return;
                    }

                    // Retrieve the repository-helper object.
                    dataSourceRepositoryHelper =
                        new DataSourceRepositoryHelper();

                    // Set the data source location.
                    RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);

                    DataSource datasource;

                    // Retrieve the data source object by
                    // using the repository-helper object.
                    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {
                        datasource = dataSourceRepositoryHelper.Get(repositoryDataSourceLocation);
                        if (datasource == null)
                        {
                            displayError("Could not retrieve the data source for editing.");
                            return;
                        }
                    }
                    else
                    {
                        displayError("Invalid Action.");
                        return;

                    }

                    // Save the original data source and helper objects across page postbacks.
                    ViewState["action"] = action;
                    ViewState["datasource"] = datasource;
                    ViewState["datasourcerepositoryhelper"] = dataSourceRepositoryHelper;

                    // Populate the child controls.
                    if (null != datasource.Name)
                        textboxName.Text = datasource.Name.ToString();

                    if (null != datasource.Description)
                        textboxDescription.Text = datasource.Description.ToString();

                    if (null != datasource.CustomData)
                    {
                        string[] splitCustomData = datasource.CustomData.Split('&amp;');
                        if (splitCustomData.Length > 2)
                        {
                            textboxStockSymbols.Text = splitCustomData[0];
                            textboxXMLLocation.Text = splitCustomData[1].Replace(@"\\SampleStockQuotes.xml", string.Empty);
                            textboxProxy.Text = splitCustomData[2];
                        }
                    }
                }
                catch (Exception ex)
                {
                    displayError("An error has occurred. Please contact your administrator for more information.");
                    if (dataSourceRepositoryHelper != null)
                    {
                        // Add the exception detail to the server
                        // event log.
                        dataSourceRepositoryHelper.HandleException(ex);
                    }
                }
            }
        }

        // Handles the Click event of the buttonOK control.
        protected void buttonOK_Click(object sender, EventArgs e)
        {
            EnsureChildControls();

            // Verify that the required fields contain values.
            if (!AreAllInputsValid())
                return;

            // Clear any pre-existing error message.
            labelErrorMessage.Text = string.Empty;

            // Retrieve the data source and helper objects from view state.
            string action = (string)ViewState["action"];
            DataSource datasource = (DataSource)ViewState["datasource"];
            DataSourceRepositoryHelper datasourcerepositoryhelper = (DataSourceRepositoryHelper)ViewState["datasourcerepositoryhelper"];

            // Update the data source object with form changes.
            datasource.Name.Text = textboxName.Text;
            datasource.Description.Text = textboxDescription.Text;

            // Define column mappings if they aren't already defined.
            if (datasource.DataTableMapping.ColumnMappings.Count <= 0)
            {
                datasource.DataTableMapping = WSTabularDataSourceProvider.CreateDataColumnMappings();
            }

            // Save the data source to the repository
            // by using the repository-helper object.
            try
            {
                CreateCacheFile(datasource);

                datasource.Validate();

                if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                {
                    datasourcerepositoryhelper.Update(datasource);
                }
                else
                {
                    displayError("Invalid Action.");
                }
            }
            catch (Exception ex)
            {
                displayError("An error has occurred. Please contact your administrator for more information.");
                if (datasourcerepositoryhelper != null)
                {
                    // Add the exception detail to the server event log.
                    datasourcerepositoryhelper.HandleException(ex);
                }
            }
        }
        #endregion

        #region Helper methods
        // Display the error string in the labelErrorMessage label.
        void displayError(string msg)
        {
            EnsureChildControls();

            labelErrorMessage.Text = msg;

            // Disable the OK button because the page is in an error state.
            buttonOK.Enabled = false;
            return;
        }

        // Validate the text box inputs.
        bool AreAllInputsValid()
        {
            if (string.IsNullOrEmpty(textboxProxy.Text))
            {
                labelErrorMessage.Text = "The proxy server address is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxXMLLocation.Text))
            {
                labelErrorMessage.Text = "The location to save the cache file to is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxName.Text))
            {
                labelErrorMessage.Text = "A data source name is required.";
                return false;
            }

            if (string.IsNullOrEmpty(textboxStockSymbols.Text))
            {
                labelErrorMessage.Text = "A stock symbol is required.";
                return false;
            }

            return true;
        }

        // Create the XML cache file at the specified location and
        // store it and the stock symbols in the CustomData
        // property of the data source.
        void CreateCacheFile(DataSource datasource)
        {
            string cacheFileLocation = string.Format("{0}\\\\{1}", textboxXMLLocation.Text.TrimEnd('\\\\'),
                                                     "SampleStockQuotes.xml");

            datasource.CustomData = string.Format("{0}&amp;{1}&amp;{2}", textboxStockSymbols.Text, cacheFileLocation, textboxProxy.Text);

            // Check if the cache file already exists.
            if (!File.Exists(cacheFileLocation))
            {
                // Create the cache file if it does not exist.
                XDocument doc = SampleDSCacheHandler.DefaultCacheFileContent;
                doc.Save(cacheFileLocation);
            }
        }
        #endregion
    }
}

次の手順Next steps

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

関連項目See also