Criar renderizadores de relatórios para Serviços PerformancePoint no SharePoint

Saiba como criar o componente de renderizador em uma extensão de relatório personalizada para os Serviços PerformancePoint.

O que são processadores de relatório personalizado para PerformancePoint Services ?

No Serviços PerformancePoint, os compositores de relatórios personalizados são controlos de servidor Web que compõem um relatório personalizado numa peça Web. Um processador grava o HTML para a visualização de relatório (por exemplo, uma tabela ou gráfico), fornece lógica para lidar com os parâmetros de relatório e recupera o objeto de relatório do repositório.

Os seguintes procedimentos e exemplos de código com base na classe SampleReportRenderer da amostra de objetos personalizados. O processador de renderiza a uma tabela e a preenche com valores recebidos de um filtro vinculado. Para obter o código completo da classe , veja Exemplo de código: Criar um compositor para relatórios de Serviços PerformancePoint personalizados no SharePoint.

Recomendamos que você use o processador de relatório de exemplo 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 processadores para relatórios 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
    • Microsoft.PerformancePoint.Scorecards.Store.dll

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

  4. Na sua classe do processador, adicione using diretivas 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 ParameterizableControl .

  6. Substitua o método GetElement para obter o objeto de relatório do repositório.

  7. Substitua o método SetData para configurar o conjunto de dados do relatório e obter os valores dos parâmetros de entrada.

  8. Substitua o método Render para compor o HTML para a visualização do relatório.

Exemplo de código: Criar um compositor para relatórios de Serviços PerformancePoint personalizados no SharePoint

A classe no exemplo de código a seguir cria um processador de relatório que exibe informações sobre ações passado do filtro de amostra.

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 compositor.

using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.Server.Extensions;
using Microsoft.PerformancePoint.Scorecards.Store;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleReport
{

    // The class that define the sample report's renderer.
    public class SampleReportRenderer : ParameterizableControl
    {
        private ReportView reportView;

        private ReportView ReportView
        {
            get
            {

                // The GetElement method is used internally by this property, which is used
                // in turn by the SetData method.
                reportView = GetElement(ElementLocation) as ReportView;
                return reportView;
            }
        }

        // Initializes the current instance according to a standard interface. This method
        // sets up the dataset.
        public override void SetData(RepositoryLocation elementLocation, string resourcePath, string targetControlId, BIDataContainer dataContainer, bool accessibilityMode)
        {

            // The renderer must call the base implementation of the SetData method
            // to set report properties.
            base.SetData(elementLocation, resourcePath, targetControlId, dataContainer, accessibilityMode);

            if (null != ReportView)
            {

                // If the report view's custom data represents a serialized object, deserialize
                // it, and then use it to access a data source or other object.
                string customData = ReportView.CustomData;
                if (!string.IsNullOrEmpty(customData))
                {
                    System.Diagnostics.Debug.WriteLine(string.Format("Report view '{0}' has the following custom data: {1}", ReportView.Name.Text, customData));
                }

                // Iterate through the user's selections sent by the filter.
                // The MultiSelectTreeControl filter control can send multiple
                // rows of data but other native controls send one message only.
                foreach (ParameterMessage message in BIDataContainer.ParameterMessages)
                {
                    // This line demonstrates how to do something with each incoming parameter message.
                    System.Diagnostics.Debug.WriteLine(string.Format("Parameter message: {0}", message.DisplayName));
                }
            }
        }

        // Render page content using the specified writer.
        protected override void Render(HtmlTextWriter output)
        {
            try
            {
                if (null != ReportView && !string.IsNullOrEmpty(ReportView.CustomData))
                {
                    output.RenderBeginTag(HtmlTextWriterTag.P);
                    output.RenderBeginTag(HtmlTextWriterTag.B);

                    // This line shows how to retrieve the content of the
                    // report's optional CustomData property. CustomData can store
                    // information that the report does not store elsewhere.
                    output.Write(string.Format("The ReportView "{0}" has CustomData information. The CustomData is "{1}"",
                        ReportView.Name.Text, ReportView.CustomData));
                    output.RenderEndTag(); // B
                    output.RenderEndTag(); // P
                }

                Dictionary<Guid, ParameterMessage> parametersIndex =
                    IndexParameterMessages(BIDataContainer.ParameterMessages.ToArray());

                // Each connection gets a unique identifier.
                foreach (Guid parameterMappingId in parametersIndex.Keys)
                {
                    ParameterMessage message = parametersIndex[parameterMappingId];

                    output.RenderBeginTag(HtmlTextWriterTag.Table);

                    output.AddAttribute(HtmlTextWriterAttribute.Style, "ms-partline");
                    output.RenderBeginTag(HtmlTextWriterTag.Tr);

                    output.AddAttribute(HtmlTextWriterAttribute.Colspan, "5");
                    output.RenderBeginTag(HtmlTextWriterTag.Td);

                    output.RenderBeginTag(HtmlTextWriterTag.B);
                    output.Write(string.Format("EndPoint name is: {0}", message.Values.TableName));

                    output.RenderEndTag();  // B
                    output.RenderEndTag();  // Td
                    output.RenderEndTag();  // Tr

                    output.AddAttribute(HtmlTextWriterAttribute.Style, "\\"border-bottom:solid 10px #ffdd00; background:PapayaWhip\\"");
                    output.RenderBeginTag(HtmlTextWriterTag.Tr);

                    // Read the message.Values data table and print the column names.
                    foreach (DataColumn col in message.Values.Columns)
                    {
                        output.RenderBeginTag(HtmlTextWriterTag.Td);
                        output.Write(string.IsNullOrEmpty(col.Caption) ? "&amp;nbsp;" : col.Caption);
                        output.RenderEndTag();
                    }
                    output.RenderEndTag();  // Tr

                    // Print the data from the Values property, which is a data table.
                    foreach (DataRow row in message.Values.Rows)
                    {
                        output.RenderBeginTag(HtmlTextWriterTag.Tr);
                        for (int i = 0; i < message.Values.Columns.Count; i++)
                        {
                            output.RenderBeginTag(HtmlTextWriterTag.Td);
                            output.Write(string.IsNullOrEmpty(row[i].ToString()) ? "&amp;nbsp;" : row[i].ToString());
                            output.RenderEndTag();
                        }
                        output.RenderEndTag();  // Tr
                    }
                    output.RenderEndTag(); // table
                }
            }
            catch (Exception e)
            {
                output.RenderBeginTag(HtmlTextWriterTag.H1);
                output.Write("Error! An exception has occurred!");
                output.RenderEndTag();

                output.RenderBeginTag(HtmlTextWriterTag.P);
                output.Write(e.Message);
                output.RenderEndTag();

                output.RenderBeginTag(HtmlTextWriterTag.P);
                output.Write(e.StackTrace);
                output.RenderEndTag();
            }
        }

        // Get the report object.
        protected override Element GetElement(RepositoryLocation elementLocation)
        {
            ReportView rv = null;
            if (!RepositoryLocation.IsNullOrEmpty(elementLocation))
            {
                rv = SPDataStore.GlobalDataStore.GetReportViewForExecution(elementLocation);
            }
            return (rv);
        }
    }
}

Próximas etapas

Depois de criar um compositor de relatórios e um editor de relatórios (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