miércoles, 7 de abril de 2010

Reporting sobre listas de Sharepoint 2007

En varios proyectos nos hemos encontrado con la problemática de generar informes que obtienen datos contenidos en listas de Sharepoint 2007. La opción que hemos seguido es la utilización de Reporting Services en modo local, ya que entre muchas otras funcionalidades, permite crear informes con listados y gráficos, además de proporcionar la opción de exportar a Excel y PDF.
Hay que tener en cuenta que Reporting Services no proporciona una forma directa de atacar los datos de Sharepoint, ya que no existe un tipo de origen de datos en base a listas de Sharepoint. Por eso, en la solución que planteamos debemos construir nuestro propio origen de datos de Sharepoint. La solución se divide en 3 componentes:


  1. Origen de datos de Sharepoint, una clase que contiene una colección de objetos y un método que se encarga de consultar las listas de Sharepoint, devolviendo una colección de objetos con los resultados de la consulta.


  2. Informe local de Reporting Services que realice la consulta sobre el origen de datos de Sharepoint.


  3. Webpart que contiene un control ReportViewer que muestra el informe de Reporting Services en modo local.
Vamos a realizar un informe de ejemplo, que muestra información de personas que colaboran en varios equipos de trabajo. Esta información está contenida en dos listas de Sharepoint: ‘Equipos’ y ‘Colaboradores’, relacionados a través de un campo lookup ‘Equipo’ en la lista ‘Colaboradores’.
Lista ‘Colaboradores’ enlazada con ‘Equipos’


Informe generado sobre listas de Sharepoint

Orígen de datos de Sharepoint

  1. Abrir Visual Studio y crear un nuevo Sitio Web.
  2. Crear un archivo de clase ‘Colaboradores.cs’ dentro de la carpeta ‘App_Code’ del sitio Web. De esta forma, Reporting Services reconoce las clases definidas en este archivo como origen de datos válido.
  3. Vamos a crear dos clases: ‘Colaborador’ y ‘Colaboradores’.
  • Colaborador: Contiene las propiedades ‘Persona’y ‘Equipo’.
  • Colaboradores: Encapsula una colección de objetos ‘Colaborador’. Por ejemplo ‘List<>’. En la clase ‘Colaboradores’, crear un método público ‘GetColaboradores’ que devuelva la colección de objetos con los datos obtenidos a través de consultas CAML sobre listas de Sharepoint.
using System;
using System.Collections.Generic;
using Microsoft.SharePoint;

public class Colaborador
{
private string persona;
private string equipo;

public Colaborador(string persona, string equipo)
{
this.persona = persona;
this.equipo = equipo;
}

public string Persona
{
get
{
return persona;
}
}

public string Equipo
{
get
{
return equipo;
}
}
}

public class Colaboradores
{
private SPList listaSharepoint;
private List listaColaborador;

public Colaboradores()
{
SPSite sitio = new SPSite("http://sareapoint.lks.es/equ");
SPWeb web = sitio.OpenWeb();
this.listaSharepoint = web.Lists["Colaboradores"];
this.listaColaborador = new List();
}

public List GetColaboradores()
{
foreach (SPListItem elemento in listaSharepoint.Items)
{
Colaborador obColaborador = new Colaborador(elemento["Colaborador"].ToString().Split('#')[1].ToString(), elemento.GetFormattedValue("Equipo").ToString());
this.listaColaborador.Add(obColaborador);
}
return listaColaborador;
}
}


Código de las clases que conforman el origen de datos de Sharepoint


Informe local de Reporting Services
  1. Agregar un nuevo informe local ‘ReportColaboradores.rdlc’ al sitio web.
  2. Visual Studio identifica nuestro origen de datos de Sharepoint automáticamente, y los muestra en el panel de orígenes de datos.
  3. Agregar una tabla al informe y configurarlo para mostrar los campos ‘Colaborador.Persona y ‘Colaborador.Equipo’. Pinchar y arrastrar los campos desde el panel de orígenes de datos al panel del informe.




Resumiendo, la solución planteada se basa en un Webpart que renderiza un control de usuario, que contiene un control ReportViewer, que muestra un informe local de Reporting Services, que realiza una consulta sobre un origen de datos de Sharepoint. Si esta última definición no os convence, a continuación se muestra el esquema básico de la solución: 


Para que el control ReportViewer funcione correctamente en un portal Sharepoint, es necesario configurar la siguiente línea en el archivo ‘web.config’, dentro de la sección ‘httpmodules’:


add name="Session" type="System.Web.SessionState.SessionStateModule"La solución está basada en el siguiente artículo de MSDN:

Visita guiada: Usar un origen de datos de objeto comercial con el control de servidor Web ReportViewer en el modo de procesamiento local. http://msdn.microsoft.com/es-es/library/ms251692(VS.80).aspx.

Panel de orígenes de datos, panel del informe y explorador de soluciones que muestra la estructura del sitio web


Webpart
  1. Agregar un control de usuario ‘ControlColaboradores.ascx’ al sitio web.
  2. Agregar el control ReportViewer al control de usuario y asociarlo con el informe ‘ReportColaboradores.rdlc’.
  3. Encapsular el control de usuario en un webpart. En nuestro caso utilizamos un SmartPart propio que contiene el control de usuario especificado en el panel de propiedades.

ReportViewer que contiene el informe

1 comentario:

  1. My dear friend, what good thread you have here.
    I've only one stage direction: in your class you use List class but you forgot give it the object, this should be List<Colaborador>.

    sya & tnks

    ResponderEliminar