Поделиться через


Создание отрисовщиков отчетов для PerformancePoint Services в SharePoint

Узнайте, как создать компонент отрисовщика в расширении специальных отчетов для PerformancePoint Services.

Что такое средств отображения настраиваемых отчетов для Службы PerformancePoint Services ?

В PerformancePoint Services пользовательские отрисовщики отчетов — это серверные веб-элементы управления, которые отрисовывают пользовательский отчет в веб-части. Обработчик записывает HTML-код для визуализации отчета (например, диаграммы или таблицы), предоставляет логику для обработки параметров отчетов и возвращает объект отчета из репозитория.

Следующие процедуры и примеры кода, зависят от класса SampleReportRenderer из настраиваемых объектов. Средство визуализации отображает таблицу и заполняется значения, полученные из связанного фильтра. Полный код для класса см. в разделе Пример кода. Создание отрисовщика для пользовательских отчетов PerformancePoint Services в SharePoint.

Мы рекомендуем использовать модуль подготовки отчетов образец как шаблон. В примере показано, как вызывать объекты в Службы PerformancePoint Services API и демонстрируется советы и рекомендации по разработке Службы PerformancePoint Services.

Создание средств отображения для настраиваемых Службы PerformancePoint Services отчетов

  1. Установка Службы PerformancePoint Services или копирование библиотеки DLL, которые использует расширения (перечисленных в шаге 3) на своем компьютере. Дополнительные сведения см. в разделе Библиотеки DLL с библиотеками классов.

  2. В Visual Studio создайте библиотеку классов C#. Если библиотека классов для расширения уже создана, добавьте новый класс C#.

    DLL-библиотеку необходимо подписать строгим именем. Кроме того, убедитесь, что все сборки, на которые ссылается DLL-библиотека, имеют строгие имена. Сведения о том, как подписать сборку со строгим именем и как создать пару открытого и закрытого ключей, см. в разделе Практическое руководство. Создание пары открытого и закрытого ключей.

  3. Добавьте следующие Службы PerformancePoint Services библиотеки DLL в качестве ссылок на сборки в проект:

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

    В зависимости от функциональности расширения могут потребоваться другие ссылки в проекте.

  4. В классе визуализации добавьте директивы using для следующих пространств имен Службы PerformancePoint Services.

    В зависимости от функциональности расширения могут потребоваться другие директивы using.

  5. Наследуется от базового класса ParameterizableControl .

  6. Переопределите метод GetElement , чтобы получить объект отчета из репозитория.

  7. Переопределите метод SetData , чтобы настроить набор данных отчета и получить входящие значения параметров.

  8. Переопределите метод Render , чтобы отобразить HTML-код для визуализации отчета.

Пример кода: создание отрисовщика для пользовательских отчетов PerformancePoint Services в SharePoint

Класс, определяемый в следующем примере кода, создает модуль подготовки отчетов, который отображает данные о запасах, передаваемые через образец фильтра.

Перед компиляцией этого примера кода требуется настроить среду разработки, как описано в разделе Создание и настройка класса визуализации.

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

Дальнейшие действия

После создания отрисовщика отчетов и редактора отчетов (включая его пользовательский интерфейс, если это необходимо), разверните расширение, как описано в разделе Практическое руководство. Регистрация расширений PerformancePoint Services вручную.

См. также