Partilhar via


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 ?

Em Serviços PerformancePoint, renderizadores de relatório personalizados são controles de servidor Web que renderizam um relatório personalizado em uma Web Part. 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, consulte Exemplo de código: criar um renderizador 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, 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
    • 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. Herde da classe base ParameterableControl .

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

  7. Substitua o método SetData para configurar o conjunto de dados do relatório e recuperar valores de parâmetro de entrada.

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

Exemplo de código: criar um renderizador 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 compilar este exemplo de código, você deve configurar seu ambiente de desenvolvimento conforme descrito em Para criar e configurar a classe renderizador.

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 renderizador de relatório e um editor de relatório (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