Partilhar via


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

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

Cite editores de relatório personalizado para PerformancePoint Services.

In PerformancePoint Services, custom report editors enable users to set properties on custom reports. Report editors also initialize the report endpoint, which receives parameter values from scorecard and filter providers. Para obter mais informações sobre requisitos de editor e a funcionalidade, consulte Editors for Custom PerformancePoint Services Objects.

Os procedimentos e os exemplos a seguir baseiam-se na classe SampleReportViewEditor 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, recuperar e atualizar relatórios personalizados Serviços PerformancePoint no SharePoint.

Recomendamos que você use o editor de amostra como um modelo. Mostra o exemplo como chamar objetos no PerformancePoint Services API, fornece objetos auxiliares que simplificam chama-se para operações de repositório (por exemplo, criando e atualizando objetos) e demonstra as práticas recomendadas para o desenvolvimento de PerformancePoint Services.

Criar editores 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 as seguintes DLLs como referências de assembly para o projeto:

    • Microsoft.PerformancePoint.Scorecards.Client.dll
    • Microsoft.PerformancePoint.Scorecards.ServerCommon.dll
    • Microsoft.PerformancePoint.Scorecards.Store.dll (usado pelo classes auxiliares)
    • Microsoft.SharePoint.dll (usado pelo classes auxiliares)

    O editor de amostra também contém referências de assembly System.Web.dll e System.Web.Services.dll. Dependendo da funcionalidade da sua extensão, outras referências de projeto podem ser necessárias.

  4. Adicione as seguintes classes da amostra ao projeto. O editor usa essas classes auxiliares para interagir com o repositório de PerformancePoint Services:

    • DataSourceConsumerHelper.cs
    • ExtensionRepositoryHelper.cs
    • ReportViewRepositoryHelper.cs
    • IDataSourceConsumer.cs

    Observação

    [!OBSERVAçãO] The sample report obtains data from a filter, so it does not use DataSourceConsumerHelper or IDataSourceConsumer objects. No entanto, se o relatório obter dados de uma fonte de dados Serviços PerformancePoint, você poderá usar os métodos expostos pela classe DataSourceConsumerHelper para recuperar fontes de dados, conforme descrito em Criar editores de filtro para Serviços PerformancePoint no SharePoint.

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

    • Microsoft.PerformancePoint.Scorecards
    • Microsoft.PerformancePoint.Scorecards.ServerCommon

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

  6. Herde a classe base que ofereça suporte a implementação do editor. Como o editor de relatório de exemplo é um aplicativo Web, ele herda da classe Page . Outras implementações podem derivar de classes base, como a classe UserControl ou WebPart .

  7. Declare variáveis para os controles que expõem as propriedades que você deseja que os usuários para exibir ou modificar. O editor de relatório de amostra primeiramente declara variáveis para a web controles de servidor que são definidos no componente de interface do usuário, que é uma página ASPX. O editor de amostra também define um controle de botão que permite aos usuários enviar alterações. Em seguida, o editor chama o método CreateChildControls() para disponibilizar os controles na página.

    Observação

    [!OBSERVAçãO] O editor define a lógica de programação separadamente da interface do usuário. Instruções para criar o componente de interface do usuário do editor estão além do escopo desta documentação.

    O editor de relatório de exemplo realiza as etapas 8 a 12 no método Page_Load. Page_Load também é usado para inicializar e validar variáveis e controles, preencher controles e salvar as informações de estado para os objetos de relatório e auxiliar personalizados.

  8. Defina a propriedade AllowUnsafeUpdates como true. Isso permite que o editor de relatório gravar dados ao repositório sem usar as operações de POST do formulário.

  9. Recuperar os parâmetros da cadeia de consulta e defini-las como valores de variáveis locais, conforme mostrado no exemplo de código a seguir.

    // The URL of the site collection that contains the PerformancePoint Services repository.
    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
    
    // The location of the report in the repository.
    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
    
    // The operation to perform: OpenItem or CreateItem.
    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];
    

    Observação

    Para obter informações sobre os parâmetros de cadeia de caracteres de consulta, consulte Editores para Objetos Serviços PerformancePoint Personalizados.

  10. Recupere o objeto ReportViewRepositoryHelper, que é usado para fazer chamadas para o repositório, conforme mostrado no exemplo de código a seguir.

    reportviewRepositoryHelper = new ReportViewRepositoryHelper();
    
  11. Defina o local de relatório com base no parâmetro de cadeia de caracteres de consulta, conforme mostrado no exemplo de código a seguir.

    RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
    
  12. Recuperar a operação para executar ( OpenItem ou CreateItem) da seqüência de consulta e, em seguida, recuperar ou criar o relatório personalizado.

    • Para recuperar o relatório personalizado, use o método ReportViewRepositoryHelper.Get.
    • Para criar um relatório personalizado, use o construtor de ReportView() e defina propriedades de Name , RendererClassName e SubTypeId do relatório.

    SubTypeId é o identificador exclusivo do relatório e deve corresponder ao atributo subType que você especifica para o relatório personalizado no arquivo Serviços PerformancePoint web.config. RendererClassName é o nome totalmente qualificado da classe que define o controle do servidor Web renderizador. Se não for definido no editor, esse valor será padrão para a classe renderizador especificada no arquivo web.config.

    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
      // Use the repository-helper object to retrieve the report.
      reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation);
      if (reportview == null)
      {
        displayError("Could not retrieve the report view for editing.");
        return;
      }
    }
    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
    {
      reportview = new ReportView
      {
        RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName,
        SubTypeId = "SampleReportView"
      };
    }
    else
    {
      displayError("Invalid Action.");
      return;
    }
    

    Observação

    [!OBSERVAçãO] Por padrão, os usuários podem criar objetos personalizados de PerformancePoint Dashboard Designer somente. Para permitir que os usuários criem um objeto personalizado fora do Dashboard Designer, você deve adicionar um item de menu que envia uma solicitação CreateItem ao seu editor do tipo de conteúdo no repositório. For more information, see Editors for Custom PerformancePoint Services Objects.

  13. Defina o ponto de extremidade do relatório, que permite o relatório para receber dados de scorecards e filtros. O editor de relatório de exemplo define as propriedades necessárias para o ponto de extremidade, conforme mostrado no exemplo de código a seguir.

    if (0 == reportview.EndPoints.Count)
    {
      EndPoint endpoint = new EndPoint
      {
        Category = EndPointCategory.None,
        UniqueName = "SampleReportView_EndPoint",
    
        // The display name is shown to users in Dashboard Designer.
        // It represents the endpoint that can be connected
        // to a filter or scorecard.
        DisplayName = "Sample Report View EndPoint"
      };
    
      reportview.EndPoints.Add(endpoint);
    }
    

    O editor de exemplo define o ponto de extremidade no método VerifyReportView. Ele também usa VerifyReportView para verificar se as propriedades necessárias estão definidas e definir a propriedade opcional CustomData , que pode ser usada para armazenar informações do relatório.

  14. Atualize o relatório com alterações definida pelo usuário. O método buttonOK_Click no editor de relatório de exemplo chama o método ReportViewRepositoryHelper.Update para atualizar as propriedades do relatório de Name e Description no repositório. buttonOK_Click também é usado para validar o conteúdo dos controles e recuperar informações de estado para o relatório personalizado e o objeto auxiliar.

    Observação

    Os usuários podem editar as propriedades Nome, Descrição e Proprietário de um objeto personalizado e Proprietário ( Pessoa Responsável) e excluir objetos personalizados diretamente do Designer de Painel e do repositório Serviços PerformancePoint.

Exemplo de código: criar, recuperar e atualizar relatórios de Serviços PerformancePoint personalizados no SharePoint

O exemplo de código a seguir cria, recupera e atualiza os relatórios personalizados. Este código é da classe code-behind do editor, que fornece a lógica de programação para controles que são definidos em uma página ASPX.

Antes de compilar este exemplo de código, você deve configurar seu ambiente de desenvolvimento, conforme descrito em Criar editores para relatórios personalizados de Serviços PerformancePoint.

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.PerformancePoint.Scorecards;
using Microsoft.PerformancePoint.Scorecards.ServerCommon;

namespace Microsoft.PerformancePoint.SDK.Samples.SampleReport
{

    // Represents the class that defines the sample report editor.
    public class SampleReportViewEditor : Page
    {

        // Declare private variables for the ASP.NET controls defined in the user interface.
        // The sample's user interface is an ASPX page that defines the controls in HTML.
        private TextBox textboxName;
        private TextBox textboxDescription;
        private Label labelErrorMessage;
        private Button buttonOK;

        // Make the controls available to this class.
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (null == textboxName)
                textboxName = FindControl("textboxName") as TextBox;
            if (null == textboxDescription)
                textboxDescription = FindControl("textboxDescription") as TextBox;
            if (null == labelErrorMessage)
                labelErrorMessage = FindControl("labelErrorMessage") as Label;
            if (null == buttonOK)
                buttonOK = FindControl("buttonOK") as Button;
        }

        // Handles the Load event of the Page control.
        // Methods that use a control variable should call the Control.EnsureChildControls
        // method before accessing the variable for the first time.
        protected void Page_Load(object sender, EventArgs e)
        {

            // Required to enable custom report and filter editors to
            // write data to the repository.
            ServerUtils.AllowUnsafeUpdates = true;

            // Initialize controls the first time the page loads only.
            if (!IsPostBack)
            {
                EnsureChildControls();
                ReportViewRepositoryHelper reportviewRepositoryHelper = null;
                try
                {

                    // Get information from the query string parameters.
                    string server = Request.QueryString[ClickOnceLaunchKeys.SiteCollectionUrl];
                    string itemLocation = Request.QueryString[ClickOnceLaunchKeys.ItemLocation];
                    string action = Request.QueryString[ClickOnceLaunchKeys.LaunchOperation];

                    // Validate the query string parameters.
                    if (string.IsNullOrEmpty(server) ||
                        string.IsNullOrEmpty(itemLocation) ||
                        string.IsNullOrEmpty(action))
                    {
                        displayError("Invalid URL.");
                        return;
                    }

                    // Retrieve the repository-helper object.
                    reportviewRepositoryHelper =
                        new ReportViewRepositoryHelper();

                    // Set the report location by using the location from the query string.
                    RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);

                    ReportView reportview;

                    // Retrieve or create the report object, depending on the operation
                    // passed in the query string (OpenItem or CreateItem).
                    if (ClickOnceLaunchValues.OpenItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Retrieve the report object by using the repository-helper object.
                        reportview = reportviewRepositoryHelper.Get(repositoryReportViewLocation);
                        if (reportview == null)
                        {
                            displayError("Could not retrieve the report view for editing.");
                            return;
                        }
                    }
                    else if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                    {

                        // Create a report view.
                        // CreateItem requests can be sent from a SharePoint list, but
                        // you must create a custom menu item to send the request.
                        // Dashboard Designer can send edit requests only.
                        reportview = new ReportView
                        {
                            RendererClassName = typeof(SampleReportRenderer).AssemblyQualifiedName,
                            SubTypeId = "SampleReportView"
                        };
                    }
                    else
                    {
                        displayError("Invalid Action.");
                        return;
                    }

                    VerifyReportView(reportview);

                    // Save the original report and helper objects across page postbacks.
                    ViewState["action"] = action;
                    ViewState["reportview"] = reportview;
                    ViewState["reportviewrepositoryhelper"] = reportviewRepositoryHelper;
                    ViewState["itemlocation"] = itemLocation;

                    // Populate the child controls.
                    textboxName.Text = reportview.Name.ToString();
                    textboxDescription.Text = reportview.Description.ToString();
                }
                catch (Exception ex)
                {
                    displayError("An error has occurred. Please contact your administrator for more information.");
                    if (reportviewRepositoryHelper != null)
                    {

                        // Add the exception detail to the server event log.
                        reportviewRepositoryHelper.HandleException(ex);
                    }
                }
            }
        }

        // Handles the Click event of the buttonOK control.
        protected void buttonOK_Click(object sender, EventArgs e)
        {
            EnsureChildControls();

            // Verify that the textboxName control contains a value.
            if (string.IsNullOrEmpty(textboxName.Text))
            {
                labelErrorMessage.Text = "A report view name is required.";
                return;
            }

            // Clear any pre-existing error message.
            labelErrorMessage.Text = string.Empty;

            // Retrieve the report and helper objects from view state.
            string action = (string)ViewState["action"];
            string itemLocation = (string) ViewState["itemlocation"];
            ReportView reportview = (ReportView)ViewState["reportview"];
            ReportViewRepositoryHelper reportviewRepositoryHelper = (ReportViewRepositoryHelper)ViewState["reportviewrepositoryhelper"];

            // Update the report object with form changes.
            reportview.Name.Text = textboxName.Text;
            reportview.Description.Text = textboxDescription.Text;

            // Save the report object to the PerformancePoint Services repository.
            try
            {
                reportview.Validate();
                if (ClickOnceLaunchValues.CreateItem.Equals(action, StringComparison.OrdinalIgnoreCase))
                {
                    reportview.CreatedDate = DateTime.Now;
                    ReportView newReportView = reportviewRepositoryHelper.Create(
                        string.IsNullOrEmpty(reportview.Location.ItemUrl) ? itemLocation : reportview.Location.ItemUrl,
                        reportview);
                    ViewState["reportview"] = newReportView;
                    ViewState["action"] = ClickOnceLaunchValues.OpenItem;
                }
                else
                {
                    reportviewRepositoryHelper.Update(reportview);
                }
            }
            catch (Exception ex)
            {
                displayError("An error has occurred. Please contact your administrator for more information.");
                if (reportviewRepositoryHelper != null)
                {
                    // Add the exception detail to the server event log.
                    reportviewRepositoryHelper.HandleException(ex);
                }
            }
        }

        // Displays the error string in the labelErrorMessage label.
        void displayError(string msg)
        {
            EnsureChildControls();

            labelErrorMessage.Text = msg;

            // Disable the OK button because the page is in an error state.
            buttonOK.Enabled = false;
            return;
        }

        // Verifies that the properties for the report object are set.
        static void VerifyReportView(ReportView reportview)
        {

            // Verify that all required properties are set.
            if (string.IsNullOrEmpty(reportview.SubTypeId))
            {

                // This value must match the subType attribute specified
                // in the web.config file.
                reportview.SubTypeId = "SampleReportView";
            }

            if (string.IsNullOrEmpty(reportview.RendererClassName))
            {
                reportview.RendererClassName = typeof (SampleReportRenderer).AssemblyQualifiedName;
            }

            // Reports are consumers and do not use provider endpoints.
           reportview.BeginPoints.Clear();

            // If there are no consumer endpoints, create one so we can connect a filter or a scorecard to the report.
            if (0 == reportview.EndPoints.Count)
            {
                EndPoint endpoint = new EndPoint
                {
                    Category = EndPointCategory.None,
                    UniqueName = "SampleReportView_EndPoint",

                    // The display name is shown to users in Dashboard
                    // Designer to represent the endpoint that can be
                    // connected to a filter or scorecard.
                    DisplayName = "Sample Report View EndPoint"
                };

                reportview.EndPoints.Add(endpoint);
            }

            // Set optional properties for reports.
            reportview.CustomData = "You can use this property to store custom information for this filter as a string or a serialized object.";
        }
    }
}

Próximas etapas

Depois de criar um editor de relatório (incluindo sua interface do usuário, se necessário) e um renderizador de relatório, implante a extensão conforme descrito em Como: Registrar manualmente Serviços PerformancePoint Extensões.

Confira também