Crear editores de informes para PerformancePoint Services en SharePoint
Aprenda a crear el componente de edición de una extensión de informe personalizada para PerformancePoint Services.
¿Qué son los editores de informes personalizados para PerformancePoint Services?
En PerformancePoint Services, los editores de informes personalizados permiten a los usuarios establecer propiedades en los informes personalizados. Los editores de informes también inicializan el extremo del informe, que recibe valores de parámetros de proveedores de filtro y cuadro de mandos. Para más información sobre los requisitos y las funciones de los editores, vea Editores para objetos personalizados de PerformancePoint Services.
Los procedimientos y ejemplos siguientes 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. Para obtener el código completo de la clase, vea Ejemplo de código: Crear, recuperar y actualizar informes de PerformancePoint Services personalizados en SharePoint.
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 muestra los procedimientos recomendados para el desarrollo de PerformancePoint Services.
Creación de editores para informes PerformancePoint Services personalizados
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 con bibliotecas de clases.
En Visual Studio, cree una biblioteca de clases de C#. Si ya ha creado una biblioteca de clases para su extensión, agregue una nueva clase de C#.
Debe firmar su DLL con un nombre seguro. Además, asegúrese de que todos los ensamblados a los que su DLL hace referencia 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.
Agregue las siguientes DLL 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 clases auxiliares)
El editor de ejemplo también contiene referencias de ensamblado a System.Web.dll y System.Web.Services.dll. De acuerdo con la función de la extensión, es posible 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:
[!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 que expone la clase DataSourceConsumerHelper para recuperar orígenes de datos, como se describe en Creación de editores de filtros para PerformancePoint Services en SharePoint.
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 su extensión, podrían ser necesarias otras directivas de using.
Herede de la clase base que admite la implementación del editor. Dado que el editor de informes de ejemplo es una aplicación web, hereda de la clase Page . Pueden derivar otras implementaciones de las clases base, como la clase UserControl o WebPart .
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 que los controles estén disponibles en la página.
Nota:
[!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.
El editor de informes de ejemplo realiza los pasos 8 a 12 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.
Establezca la propiedad AllowUnsafeUpdates en true. Esto permite que el editor de informes escriba datos en el repositorio sin usar operaciones POST de formulario.
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];
Nota:
Para obtener información sobre los parámetros de cadena de consulta, vea Editores para objetos de PerformancePoint Services personalizados.
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.
- Para recuperar el informe personalizado, use el método ReportViewRepositoryHelper.Get.
- Para crear el informe personalizado, use el constructor ReportView() y luego 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.
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; }
Nota:
[!NOTA] De forma predeterminada, los usuarios solo pueden crear objetos personalizados desde el Diseñador de paneles de PerformancePoint. Para permitir que los usuarios creen un objeto personalizado fuera del Diseñador de paneles, debe agregar un elemento de menú que envíe una solicitud CreateItem al editor desde el tipo de contenido del repositorio. Para más información, consulte 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 (Person Responsible) de un objeto personalizado y eliminar objetos personalizados directamente desde el Diseñador de paneles y el repositorio de PerformancePoint Services.
Ejemplo de código: Creación, recuperación y actualización de informes de PerformancePoint Services personalizados en SharePoint
En el ejemplo de código siguiente se crean, recuperan y actualizan los informes personalizados. Este código es de la clase subyacente de código del editor, que proporciona la lógica de programación para controles que definidos en una página .ASPX.
Para poder compilar este ejemplo de código, debe configurar el entorno de desarrollo como se describe en Creación de editores para informes de PerformancePoint Services personalizados.
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.";
}
}
}
Pasos siguientes
Después de crear un editor de informes (incluida su interfaz de usuario, si es necesario) y un representador de informes, implemente la extensión como se describe en How to: Manually Register PerformancePoint Services Extensions.