Criar provedores de dados de filtro para os Serviços PerformancePoint no SharePoint

Saiba como criar o componente de provedor de dados em uma extensão de filtro personalizada para os Serviços PerformancePoint.

Quais são os provedores de dados personalizados para PerformancePoint Services ?

Em PerformancePoint Services, provedores de dados personalizados recuperam dados da fonte de dados subjacente de um filtro em definem como usar os dados. Mais importante ainda, os fornecedores de dados especificam os valores de dados a expor no controlo de filtro e os dados que podem ser utilizados como ponto de início do filtro. Um provedor de dados também armazena o valor que um usuário seleciona a partir do controle de filtro, que é enviado para filtrar os consumidores. Os fornecedores de dados utilizam dois objetos DataTable para organizar e armazenar dados. Para obter mais informações, consulte Filters Overview.

Os seguintes procedimentos e exemplos que mostram como criar, configurar e definir um provedor de dados de filtro são baseadas na classe SampleFilterDataProvider da amostra de objetos personalizados. O editor é um aplicativo web fina que permite aos usuários modificar o nome e a descrição do relatório. Para obter o código completo da classe, veja Exemplo de código: Criar um fornecedor de dados para filtros de Serviços PerformancePoint personalizados no SharePoint.

É recomendável que você usar o provedor de dados de amostra como um modelo. O exemplo mostra como chamar objetos em PerformancePoint Services API e demonstra as práticas recomendadas para o desenvolvimento de PerformancePoint Services.

Criar provedores de dados para filtros personalizados PerformancePoint Services

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

  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 uma assemblagem com um nome forte e como criar um par de chaves públicas/privadas, consulte Como: Criar um Par de Chaves Públicas/Privadas.

  3. Adicione a seguinte PerformancePoint Services DLLs como referências de assembly para o projeto:

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.PerformancePoint.Scorecards.Server.dll

    Dependendo da funcionalidade da sua extensão, outras referências de projeto podem ser necessárias.

  4. Na sua classe de provedor, adicione as diretivas de using para os seguintes namespaces PerformancePoint Services:

    Dependendo da funcionalidade da sua extensão, outras diretivas using podem ser necessárias.

  5. Herdar da classe base CustomParameterDataProvider .

  6. Defina o identificador de cadeia para o nome do fornecedor de dados. Isto tem de corresponder à chave que adicionar à secção CustomParameterDataProviders do ficheiro web.config quando registar a extensão. Para obter mais informações, veja How to: Manually Register Serviços PerformancePoint Extensions (Como: Registar Manualmente extensões Serviços PerformancePoint).

  7. Substitua o método GetId() para devolver o identificador do seu fornecedor de dados.

  8. Substitua o método GetDisplayDataInternal para definir um objeto DataTable para armazenar os valores de dados da origem de dados subjacente. O filtro usa esse método para preencher o controle de seleção de filtro. A tabela de dados de exibição deve conter os nomes de coluna a seguir:

    • Key O identificador exclusivo para o registro. Este valor não pode ser nulo. Para fins de segurança e de desempenho, controles emitem apenas uma chave; eles não emitir valores das outras colunas.

    • Display O valor exibido no controle de filtro.

    • ParentKey Esse valor é usado para organizar os dados hierárquicos em um controle de árvore.

    • IsDefault Esse valor é usado para persistência de filtro.

      Dica

      [!DICA] Você pode adicionar mais colunas para estender a funcionalidade do filtro.

    GetDisplayDataInternal chama o método DataSourceRegistry.GetDataSource(DataSource) para verificar o tipo de fonte de dados pelo nome, da seguinte maneira:

    • Faz referência a um tipo de origem de dados personalizado através da propriedade SubTypeId da origem de dados, que é o mesmo valor que o atributo subType registado no ficheiro Serviços PerformancePoint web.config da extensão da origem de dados.
    • Faz referência a uma origem de dados nativa com a propriedade SourceName , que devolve um campo da classe DataSourceNames .
  9. Substitua o método GetMessageData para armazenar a seleção do utilizador a partir do controlo de filtro. O filtro usa este método quando ele envia seleções do usuário para os consumidores.

Exemplo de código: Criar um fornecedor de dados para filtros de Serviços PerformancePoint personalizados no SharePoint

O seguinte exemplo de código mostra como um fornecedor de dados obtém valores de um serviço Web ou de uma folha de cálculo do Excel e devolve objetos DataTable para os dados de apresentação de dados e mensagens do filtro.

Antes de poder compilar este exemplo de código, tem de configurar o ambiente de desenvolvimento conforme descrito em Para criar e configurar a classe de fornecedor.

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

Próximas etapas

Depois de criar um fornecedor de dados e um editor de filtros (incluindo a respetiva interface de utilizador, se necessário), implemente a extensão conforme descrito em Como: Registar Manualmente Serviços PerformancePoint Extensões.

Confira também