Procedimiento para crear editores de informes de PerformancePoint Services
Última modificación: martes, 30 de agosto de 2011
Hace referencia a: SharePoint Server 2010
En PerformancePoint Services de Microsoft SharePoint Server 2010, los editores personalizados permiten a los usuarios establecer propiedades en los objetos personalizados. Proporcionan controles de edición y recuperan y actualizan objetos personalizados en el repositorio. Para obtener más información sobre la funcionalidad y los requisitos del editor, vea Editores para objetos personalizados de PerformancePoint Services.
Se aplica a: PerformancePoint Services para SharePoint Server, versión Enterprise
Los editores de informes también deben inicializar el extremo del informe, que recibe valores de parámetros de proveedores de filtro y cuadro de mandos.
Los procedimientos y ejemplos en este tema se basan en la clase SampleReportViewEditor del ejemplo de objetos personalizados. El editor es una aplicación web ligera que permite a los usuarios modificar el nombre y la descripción del informe. El código completo de la clase se proporciona en la sección "Ejemplo" de este tema.
Nota
Se recomienda usar el editor de ejemplo como plantilla. El ejemplo muestra cómo llamar a objetos en la API de PerformancePoint Services, proporciona objetos auxiliares que simplifican llamadas para operaciones de repositorio (como la creación y actualización de objetos) y demuestra los procedimientos recomendados para el desarrollo de PerformancePoint Services.
Para crear un editor de informes, lleve a cabo estos dos procedimientos básicos:
Creación y configuración de la clase del editor
Definición de la funcionalidad de edición
Para crear un editor personalizado, empiece creando la clase del editor.
Para crear y configurar la clase del editor
Instale PerformancePoint Services o copie los DLL que la extensión usa (enumerados en el paso 3) en el equipo. Para obtener más información, vea Archivos DLL de PerformancePoint Services usados en escenarios de desarrollo.
En Visual Studio, cree una biblioteca de clases C#. Si ya creó una biblioteca de clases para la extensión, agregue una nueva clase C#.
Agregue las siguientes DLL de PerformancePoint Services y SharePoint Server 2010 como referencias de ensamblado al proyecto:
Microsoft.PerformancePoint.Scorecards.Client.dll
Microsoft.PerformancePoint.Scorecards.ServerCommon.dll
Microsoft.PerformancePoint.Scorecards.Store.dll (usada por clases auxiliares)
Microsoft.SharePoint.dll (usada por las clases auxiliares)
El editor de ejemplos también contiene referencias de ensamblado a System.Web.dll y System.Web.Services.dll. Según la funcionalidad de la extensión, puede que se necesiten otras referencias de proyecto.
Agregue las siguientes clases del ejemplo al proyecto. El editor usa estas clases de aplicaciones auxiliares para interactuar con el repositorio de PerformancePoint Services:
DataSourceConsumerHelper.cs
ExtensionRepositoryHelper.cs
ReportViewRepositoryHelper.cs
IDataSourceConsumer.cs
Nota
El informe de ejemplo obtiene datos de un filtro, por lo que no usa objetos DataSourceConsumerHelper o IDataSourceConsumer. Sin embargo, si el informe obtiene datos de un origen de datos de PerformancePoint Services, puede usar los métodos expuestos por la clase DataSourceConsumerHelper para recuperar orígenes de datos, tal como se describe en Procedimiento para crear editores para filtros de PerformancePoint Services.
En la clase del editor, agregue directivas using para los siguientes espacios de nombres de PerformancePoint Services:
Microsoft.PerformancePoint.Scorecards
Microsoft.PerformancePoint.Scorecards.ServerCommon
Según la funcionalidad de la extensión, puede que sean necesarias otras directivas using.
Establezca la procedencia en la clase base que admite la implementación del editor. Como el editor de informes de ejemplo es una aplicación web, procede de la clase Page. Otras implementaciones pueden derivar de clases base como la clase UserControl o WebPart.
Tras crear y configurar la clase del editor, deberá definir su funcionalidad.
Para definir la funcionalidad de edición
Declare variables para los controles que exponen las propiedades que desea que los usuarios puedan ver o modificar. El editor de informes de ejemplo primero declara variables para los controles de servidor web que se definen en el componente de la interfaz de usuario, que es una página ASPX. El editor de ejemplo también define un control de botón que permite a los usuarios enviar cambios. A continuación, el editor llama al método CreateChildControls() para hacer que los controles estén disponibles en la página.
Nota
El editor define la lógica de programación independientemente de la interfaz de usuario. Las instrucciones para crear el componente de interfaz de usuario del editor están fuera del ámbito de esta documentación.
Establezca la propiedad AllowUnsafeUpdates en true. Esto permite que el editor de informes escriba datos en el repositorio sin usar operaciones POST de formulario.
El editor de informes de ejemplo realiza los pasos 2 a 6 en el método Page_Load. También se usa Page_Load para inicializar y validar variables y controles, rellenar controles y guardar información de estado relativa al informe personalizado y los objetos auxiliares.
Recupere los parámetros de la cadena de consulta y establézcalos como valores para las variables locales, como se muestra en el siguiente ejemplo de código.
// 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];
Para obtener información sobre los parámetros de cadena de consulta, vea Editores para objetos personalizados de PerformancePoint Services.
Recupere el objeto ReportViewRepositoryHelper, que se usa para realizar llamadas al repositorio, como se muestra en el siguiente ejemplo de código.
reportviewRepositoryHelper = new ReportViewRepositoryHelper();
Establezca la ubicación del informe en función del parámetro de cadena de consulta, tal como se muestra en el siguiente ejemplo de código.
RepositoryLocation repositoryReportViewLocation = RepositoryLocation.CreateFromUriString(itemLocation);
Recupere la operación que se va a llevar a cabo (OpenItem o CreateItem) de la cadena de consulta y, a continuación, recupere o cree el informe personalizado, tal como se muestra en el siguiente ejemplo de código.
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; }
Para recuperar el informe personalizado, use el método ReportViewRepositoryHelper.Get.
Para crear el informe personalizado, use el constructor ReportView() y, a continuación, defina las propiedades Name, RendererClassName y SubTypeId del informe.
SubTypeId es el identificador único del informe y debe coincidir con el atributo subType especificado para el informe personalizado en el archivo web.config de PerformancePoint Services. RendererClassName es el nombre completo de la clase que define el control del servidor web del representador. Si no se define en el editor, el valor predeterminado es la clase del representador especificada en el archivo web.config.
Nota
De forma predeterminada, los usuarios sólo pueden crear objetos personalizados desde el Diseñador de paneles de PerformancePoint. Para permitir que los usuarios creen un objeto personalizado fuera de Diseñador de paneles, debe agregar un elemento de menú que envíe una solicitud CreateItem al editor desde el tipo de contenido en el repositorio. Para obtener más información, vea Editores para objetos personalizados de PerformancePoint Services.
Defina el extremo del informe, que permite que el informe reciba datos de los filtros y cuadros de mandos. El editor de informes de ejemplo define las propiedades necesarias para el extremo, tal como se muestra en el siguiente ejemplo de código.
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); }
El editor de ejemplo define el extremo en el método VerifyReportView. También usa VerifyReportView para comprobar que las propiedades necesarias están establecidas y, asimismo, para definir la propiedad CustomData opcional, que se puede usar para almacenar información del informe.
Actualice el informe con cambios definidos por el usuario. El método buttonOK_Click en el editor de informes de ejemplo llama al método ReportViewRepositoryHelper.Update para actualizar las propiedades Name y Description del informe en el repositorio. buttonOK_Click también se usa para validar el contenido de los controles y recuperar información de estado relativa al informe personalizado y el objeto auxiliar.
Nota
Los usuarios pueden editar las propiedades Name, Description y Owner (Persona responsable) de un objeto personalizado y eliminar objetos personalizados directamente desde el Diseñador de paneles y el repositorio de PerformancePoint Services.
Siguiente paso: una vez creados un editor de informes (incluida su interfaz de usuario, si es necesario) y un representador de informes, implemente la extensión tal como se describe en Procedimiento para registrar manualmente las extensiones de PerformancePoint Services. Para obtener instrucciones acerca de cómo instalar y configurar la extensión de informe de ejemplo, vea la sección sobre la instalación de objetos de origen de datos, filtro e informe de ejemplo en Ejemplo de código: Objetos de origen de datos tabular, filtro e informe personalizados.
Ejemplo
En el ejemplo de código siguiente se crean, recuperan y actualizan los informes personalizados en el repositorio y se proporciona la lógica de programación para los controles que se definen en una página ASPX.
Nota
Antes de poder compilar este ejemplo de código, debe configurar el entorno de desarrollo tal como se describe en Para crear y configurar la clase del editor.
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.";
}
}
}
Compilación de código
Antes de poder compilar este ejemplo de código, debe configurar el entorno de desarrollo tal como se describe en Para crear y configurar la clase del editor.
Seguridad
Debe firmar el DLL con un nombre seguro. Además, asegúrese de que todos los ensamblados a los que hace referencia el DLL tengan nombres seguros. Para obtener información sobre cómo firmar un ensamblado con un nombre seguro y cómo crear un par de claves pública y privada, vea How to: Create a Public/Private Key Pair.
Vea también
Tareas
Procedimiento para crear representadores de informes de PerformancePoint Services
Conceptos
Editores para objetos personalizados de PerformancePoint Services
Otros recursos
Creación de objetos personalizados para PerformancePoint Services
Ejemplos de código para PerformancePoint Services en SharePoint Server 2010