Partilhar via


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, os provedores de dados especificam os valores de dados a serem expostos no controle de filtro e os dados que podem ser usados 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 provedores de dados usam 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, consulte Exemplo de código: criar um provedor 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, 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 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. Herda da classe base CustomParameterDataProvider .

  6. Defina o identificador de cadeia de caracteres para o nome do provedor de dados. Isso deve corresponder à chave que você adiciona à seção CustomParameterDataProviders do arquivo web.config ao registrar a extensão. Para obter mais informações, consulte Como registrar manualmente Serviços PerformancePoint extensões.

  7. Substitua o método GetId() para retornar o identificador para seu provedor de dados.

  8. Substitua o método GetDisplayDataInternal para definir um objeto DataTable para armazenar os valores de dados da fonte 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:

    • Ele faz referência a um tipo de fonte de dados personalizado usando a propriedade SubTypeId da fonte de dados, que é o mesmo valor que o atributo subType registrado no arquivo Serviços PerformancePoint web.config para a extensão de fonte de dados.
    • Ele faz referência a uma fonte de dados nativa usando a propriedade SourceName , que retorna um campo da classe DataSourceNames .
  9. Substitua o método GetMessageData para armazenar a seleção do usuário do controle 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 provedor de dados para filtros de Serviços PerformancePoint personalizados no SharePoint

O exemplo de código a seguir mostra como um provedor de dados recupera valores de um serviço Web ou de uma planilha do Excel e retorna objetos DataTable para os dados de exibição e dados de mensagem do filtro.

Antes de compilar este exemplo de código, você deve configurar seu ambiente de desenvolvimento conforme descrito em Para criar e configurar a classe de provedor.

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 provedor de dados e um editor de filtro (incluindo sua interface do usuário, se necessário), implante a extensão conforme descrito em Como registrar manualmente Serviços PerformancePoint Extensões.

Confira também