Partilhar via


Criar editores de fonte de dados tabulares para os Serviços PerformancePoint no SharePoint

Saiba como criar o componente de editor de uma extensão de fonte de dados tabular personalizada para os Serviços PerformancePoint.

Cite editores de fonte de dados personalizados para PerformancePoint Services.

Em PerformancePoint Services, editores de fonte de dados personalizados permitem que os usuários definir propriedades em fontes de dados tabulares personalizados. Para obter mais informações sobre requisitos de editor e a funcionalidade, consulte Editors for Custom PerformancePoint Services Objects.

Os seguintes procedimentos e exemplos de código com base na classe SampleDataSourceEditor da amostra de objetos personalizados. O editor é um aplicativo web fina que permite que os usuários para modificar o nome e a descrição da fonte de dados, digite símbolos de ações e para especificar um proxy server endereço e o cache local de arquivo. Para obter o código completo da classe, consulte Exemplo de código: recuperar e atualizar fontes de dados tabulares personalizadas.

Recomendamos que você use o editor de amostra como um modelo. Mostra o exemplo como chamar objetos no PerformancePoint Services API, fornece objetos auxiliares que simplificam chama-se para operações de repositório (por exemplo, criando e atualizando objetos) e demonstra as práticas recomendadas para o desenvolvimento de PerformancePoint Services.

Criar editores para personalizado PerformancePoint Services fontes de dados tabulares

  1. Install PerformancePoint Services, or copy the DLLs that your extension uses (listed in step 3) to your computer. Para obter mais informações, consulte DLLs com bibliotecas de classe.

  2. Em Visual Studio, crie uma biblioteca de classes c#. Se você já criou uma biblioteca de classes para sua extensão, adicione uma nova classe c#.

    You must sign your DLL with a strong name. In addition, ensure that all assemblies referenced by your DLL have strong names. Para obter informações sobre como assinar um assembly com um nome forte e como criar um par de chaves público/privado, consulte Como criar um par de chaves público/privado.

  3. Adicione as seguintes DLLs como referências de assembly para o projeto:

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.SharePoint.dll (usado pelo classes auxiliares)

    O editor de amostra também contém referências de assembly System.Core.dll, System.Web.dll, System.Web.Services.dll e System.Xml.Linq.dll. Dependendo da funcionalidade da sua extensão, outras referências de projeto podem ser necessárias.

  4. Adicione as seguintes classes da amostra ao projeto. Seu editor usa essas classes auxiliares para interagir com o repositório de PerformancePoint Services e o arquivo de cache:

    • ExtensionRepositoryHelper.cs
    • DataSourceRepositoryHelper.cs
    • SampleDSCacheHandler.cs
  5. Na sua classe editor, adicione uma diretiva de using para o namespace Microsoft.PerformancePoint.Scorecards. Dependendo da funcionalidade da sua extensão, outras diretivas using podem ser necessárias.

  6. Herde a classe base que ofereça suporte a implementação do editor. Como o editor de fonte de dados de exemplo é um aplicativo Web, ele herda da classe Page . Outras implementações podem derivar de classes base, como a classe UserControl ou WebPart .

  7. Declare variáveis para os controles que expõem as propriedades que você deseja que os usuários para exibir ou modificar. O editor de fonte de dados de amostra primeiramente declara variáveis para a web controles de servidor que são definidos no componente de interface do usuário, que é uma página ASPX. O editor de amostra também define um controle de botão que permite aos usuários enviar alterações. Em seguida, o editor chama o método CreateChildControls() para disponibilizar os controles na página.

    Observação

    [!OBSERVAçãO] O editor define a lógica de programação separadamente da interface do usuário. Instruções para criar o componente de interface do usuário do editor estão além do escopo desta documentação.

    O editor de fonte de dados de amostra executa as etapas 8 a 11 no método Page_Load. Page_Load também é usado para inicializar e validar variáveis e controles, preencher controles e salvar as informações de estado para os objetos de fonte e auxiliar de dados personalizados.

  8. Recuperar os parâmetros da cadeia de consulta e defini-las como valores de variáveis locais, conforme mostrado no exemplo de código a seguir.

    // 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];
    

    Observação

    Para obter informações sobre os parâmetros de cadeia de caracteres de consulta, consulte Editores para Objetos Serviços PerformancePoint Personalizados.

  9. Recupere o objeto de DataSourceRepositoryHelper que é usado para fazer chamadas para o repositório, conforme mostrado no exemplo de código a seguir.

    DataSourceRepositoryHelper = new DataSourceRepositoryHelper();
    
  10. Defina o local de fonte de dados com base no parâmetro de cadeia de caracteres de consulta, conforme mostrado no exemplo de código a seguir.

    RepositoryLocation repositoryDataSourceLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
  11. Recuperar a operação para executar ( OpenItem ou CreateItem) da seqüência de consulta e, em seguida, recuperar ou criar a fonte de dados personalizados.

    • Para recuperar a fonte de dados personalizado, use o método DataSourceRepositoryHelper.Get.
    • Para criar a fonte de dados personalizada, use o construtor DataSource() e defina as propriedades Nome e SubTypeId da fonte de dados. SubTypeId é o identificador exclusivo da fonte de dados e deve corresponder ao atributo subType que você especifica para sua fonte de dados personalizada no arquivo Serviços PerformancePoint web.config.

    Observação

    [!OBSERVAçãO] O editor de fonte de dados de exemplo não inclui a lógica para criar um objeto de fonte de dados. Para obter exemplos de criação de um objeto personalizado, consulte Como criar editores de relatório para Serviços PerformancePoint no SharePoint ou Como criar editores de filtro para Serviços PerformancePoint no SharePoint.

    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;
    }
    

    Observação

    [!OBSERVAçãO] Por padrão, os usuários podem criar objetos personalizados de PerformancePoint Dashboard Designer somente. Para permitir que os usuários criem um objeto personalizado fora do Dashboard Designer, você deve adicionar um item de menu que envia uma solicitação CreateItem ao seu editor do tipo de conteúdo no repositório. Para obter mais informações, consulte Editors for Custom PerformancePoint Services Objects.

    O editor de fonte de dados de amostra executa as etapas 12 e 13 nos métodos buttonOK_Click e CreateCacheFile. buttonOK_Click também é usado para chamar o método AreAllInputsValid para validar o conteúdo dos controles e recuperar informações de estado para a fonte de dados personalizados e o objeto auxiliar.

  12. Atualize a fonte de dados com alterações definida pelo usuário. O editor de fonte de dados de exemplo chama o método DataSourceRepositoryHelper.Update para atualizar o Name , Description , e CustomData propriedades dos dados de objeto no repositório de origem. Você pode usar CustomData para armazenar um objeto serializados ou uma cadeia de caracteres. O editor de amostra usa-lo para armazenar definidas pelo usuário símbolos de ações, o local do arquivo de cache que armazena os valores de cotações de ações e o endereço do servidor proxy.

    Observação

    Os usuários podem editar as propriedades Nome, Descrição e Proprietário de um objeto personalizado e Proprietário ( Pessoa Responsável) e excluir objetos personalizados diretamente do Designer de Painel e do repositório Serviços PerformancePoint.

  13. Chame o provedor de fonte de dados para definir os mapeamentos de coluna se já não forem definidas.

Exemplo de código: recuperar e atualizar fontes de dados tabulares Serviços PerformancePoint personalizadas no SharePoint

O exemplo de código a seguir recupera e atualiza a fontes de dados tabulares personalizados. Este código é da classe code-behind do editor, que fornece a lógica de programação para controles que são definidos em uma página ASPX.

Antes de compilar este exemplo de código, você deve configurar seu ambiente de desenvolvimento conforme descrito em Criar e configurar a classe de editor para um editor de fonte de dados tabular no Serviços PerformancePoint.

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('&');
                        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
    }
}

Próximas etapas

Depois de criar um editor de fonte de dados (incluindo sua interface do usuário, se necessário) e um provedor de fonte de dados, você implantará a extensão conforme descrito em Como: Registrar manualmente Serviços PerformancePoint Extensões.

Confira também