Exportando un informe desde Reporting Services
Hola,
Pues si, de eso se trata, de exportar, jejeje. Verás cuando vamos a crear un informe utilizamos tres formas diferentes de crearlo, desde código, desde el Visual Studio.NET y desde Report Builder, podéis ver más información aquí. Hasta aquí todo bien, lo subimos al servidor y listo, pero... ¿que pasa si queremos personalizar nuestra aplicación controlando lo que hace nuestro usuario y como se lo permitimos?.
Pues bien, MS SQL Server Reporting Services nos provee de unas API´s que se encargan de manejar toda las interfaces con las que nosotros interactuamos para hacer nuestros Informes.
Estas API`s son tres servicios web que se alojan en la máquina cuando se instala Reporting Services y son los siguientes: ReportExecution2005, ReportingServices, y ReportService2005. Con ellos podemos montar toda la interfaz para crear, implementar y manejar nuestros reportes. Aunque hacer todo esto es podría resultar pesado (según por donde se mire), tenemos la ventaja de que por otro lado podemos controlar como lo hace, seguridad, implementación y paso de parámetros a través de otros controles propios. Todo esto iré explicandolo en mi blog a medida que vaya viéndolo, por ahora vamos solo vamos a hacer este ejemplito simple.
Para crear exportar un informe desde código vamos a añadir un proyecto nuevo de tipo Windows Forms y a continuación vamos a añadirle el control ReportViewer, dos botones y un combobox para elegir el formato a guardar., uno para ver el informe y otro para guardar el informe. La pantalla quedaría una cosa así:

A continuación editamos las propiedades del control ReportViewer, le especificaremos que el tipo de informe es de servidor (Reporting Services), a continuación especificaremos la ruta a nuestro servidor de informes, por defecto es: http://localhost/reportserver en una máquina local y si tenemos el servidor de informes en otra máquina con la configuración del nombre por defecto sólo tendríamos que cambiar localhost por el nombre de la máquina o dirección IP de la misma [:D].
Nota: si la dirección de nuestro servidor de informes está en otra máquina tendríamos que configurar en esa máquina los permisos para un usuario en concreto. O darle permisos desde nuestro código para que entrase con una cuenta predefinida. Este tema lo podría ser un posterior post, quien sabe.
A continuación en “Ruta de acceso del Informe” colocaremos el informe que queremos visualizar. Si nuestro informe está dentro de subcarpetas los pondremos tal que así: Carpeta1/Carpeta2/…/NuestroInforme. No hace falta volver a indicar la ruta de nuestro servidor de informes con nuestro informe como podréis comprobar.
Para ejecutar el informe, dentro del evento Click del botón “ver informe” escribiremos la siguiente línea:
reportViewer1.RefreshReport();
Si queremos introducir la dirección de nuestro report y servidor desde código lo haremos de esta forma:
reportViewer1.ServerReport.ReportPath = "/MiCarpeta/MiInforme"; Uri url = new Uri("http://localhost/reportserver/"); this.reportViewer1.ServerReport.ReportServerUrl = url; this.reportViewer1.RefreshReport();
A continuación para guardar el informe en un formato de los que nos provee la API de Reporting Services vamos a agregar un nuevo control SaveFileDialog para guardar dichas extensiones. Vamos a comentarlas un poco cuales son y que hacen.
· XML. Crea una estructura de datos en XML que la forma las tablas, filas y conjuntos de los mismos.
· CSV. Genera un archivo con los datos de las columnas que intervienen en el informe y los datos que lleva separados por comas.
· Image. Guarda los datos que tal como están en pantalla en el momento de guardar en formato Tiff.
· PDF. Crea un archivo Tiff que luego guarda en formato PDF.
· EXCEL. Crea un archivo completo del informe mostrado y con los datos actuales. Este informe te permite modificar todos su datos y da igual que todos los nodos estén colapsados, este te permite abrirlos para una posterior edición.
· MHTML. Convierte un archivo para verlo en el web.
A este control le vamos a agregar a la propiedad filter los parámetros por los que queremos que nos guarde, que son las extensiones que anteriormente he explicado que serían las siguientes:
- PDF = "PDF file (*.pdf)|*.pdf".
- IMAGE = "Tiff file (*.tif)|*.tif".
- MHTML = "Página Web (*.mhtml)|*.mhtml".
- EXCEL = "Microsoft Excel Workbook (*.xls)|*.xls".
- CSV = "CSV (*.csv)|*.csv".
- XML = "XML (*.xml)|*.xml".
¿Cómo se lo agregamos?, pues lo haremos de la siguiente forma, cada vez que pulse en guardar informe, comprobaremos lo que hay en el combobox y llamaremos a un función que dependiendo del parámetro que le pasemos (que será el que haya en el combobox) nos pasará un string para asignar a la propiedad filter. Evidentemente a este combobox deberemos pasarles las extensiones que queramos que nos muestre como ítems del mismo y la función nos devolverá las que hemos explicado anteriormente.
Lo siguiente que haremos es importar el servicio Web que instala SQL Server Reporting Services 2005. Esto lo haremos haciendo botón derecho sobre el proyecto y pulsando sobre Agregar Referencia Web. De la pantalla que nos muestra seleccionaremos el link Servicios Web del Equipo Local y a continuación ReportExecution2005. Nos saldrá esta ventana:
Esta ventana nos muestra una serie de valores:
· Dirección URL. Indica la dirección donde está alojado nuestro servicio Web. En este caso es en nuestra máquina pero podría ser en otro servidor. Si fuese otro servidor tendríamos que estar como usuario del mismo y al conectarnos, este nos pedirá el nombre de usuario y contraseña.
· Nombre de referencia Web. Este es el nombre de la referencia Web que nosotros vamos a asignarle para llamarlo desde nuestro proyecto. Esto no indicia que haya que poner ahí el nombre del Servicio Web, sino uno con el que nosotros recordemos que es lo que hacía.
· Descripción del servicio. Este es el cuadro principal que sale al cargar la pantalla. Este muestra la Documentación donde incluye que hace el servicio Web. Por otro lado, muestra los métodos y parámetros que contiene el servicio Web
Una vez añadido el servicio Web, editaremos el evento click del botón “Guardar Informe”, al cual le añadiremos el siguiente código:
// Asignamos el filtrado.
this.saveFileDialog1.Filter = this.DameCadenaFilter();
if (this.saveFileDialog1.ShowDialog() == DialogResult.OK){
// Creo una variable que contendrá el nombre y ruta del archivo.
string archivo = this.saveFileDialog1.FileName;
// Creo una variable que contendrá el formato.
string formato = null;string history = null;
// Creo una instancia del Servicio web de ejcución.RSExecution2005.ReportExecutionService RSGuardar = new WApp_FormatoRS.RSExecution2005.ReportExecutionService();
// Asigno el formato. formato = this.comboBox1.Text;
// Asigno las credenciales.RSGuardar.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Cargo el report.
RSGuardar.LoadReport(this.reportViewer1.ServerReport.ReportPath, history);
// Si el formato trae algo(significa que seleccionó algo del combobox) lo guardo. if (formato != null)
{
string deviceInfo = String.Empty;
string Extension = formato;
Byte [] Resultados = null;
string Codificacion = String.Empty;
string mimeType = String.Empty;
RSExecution2005.Warning[] warnings = null;
string[] streamsIDs = null;
// Paso los resultados de renderizar a un conjunto de bytes.
Resultados = RSGuardar.Render(formato, deviceInfo, out Extension, out Codificacion,out mimeType, out warnings, out streamsIDs);
// Escribo el conjunto de bytes en un archivo con su extensión.
using (FileStream stream = File.OpenWrite(archivo))
{ stream.Write(Resultados, 0, Resultados.Length);}
}}
Este lo que hace básicamente es cargar un report a través de su path, lo que significa que no haría falta cargar primero el informe y luego guardarlo, sino que podemos pasarle el report, este lo carga y a continuación crea un array de bytes que serán almacenados como un archivo en disco.
La función que me traerá la extensión que agregaremos al filter y a la que le pasaremos el valor que hay en el combobox es la siguiente:
private string DameCadenaFilter()
{
switch (this.comboBox1.Text)
{
case "MHTML": return "Page, single file (*.mhtml)|*.mhtml";
case "PDF": return "PDF *.pdf|*.pdf";
case "IMAGE": return "Tiff file (*.tif)|*.tif";
case "EXCEL": return "Microsoft Excel Workbook (*.xls)|*.xls";
case "XML": return "XML (*.xml)|*.xml";
case "CSV": return "CSV (*.csv)|*.csv";
default: return null;
}
}
Bueno, espero que os haya sido de utilidad, otro día más, jejeje.
Un Saludo
Fran Díaz