El conocimiento es un bien, que crece a medida que se comparte. Y aquí estoy para compartir todo lo que pueda.
¡Bienvenid@ a La bloguera.net! Iniciar sesión | ÚNETE a la web | Ayuda

Fran Díaz

.NET 2.0/3.0, C#, VB ,Reporting Services y más

Noticias

Llamando a nuestro informe desde el ReportViewer.

Normalmente creamos nuestro informe con alguna herramienta y lo previsualizamos para ver que todo anda correctamente, retocamos, vemos que va como queremos y lo preparamos para que se pueda ver desde alguna aplicación.

Tenemos dos formas de tener nuestro informe. Una es de forma local y otra de forma remota.
La local es cuando los informes los tenemos localizado en algún lugar, es decir, en alguna carpeta de nuestro equipo por ejemplo.

Cuando decimos que nuestro informe está en el servidor, significa que este está alojado en algún servidor de informes del servidor de base de datos sql server(en mi caso 2005). Esto lo hacemos desde un proyecto de tipo servidor de informes desde el ide de visual studio, pero bueno, eso es otro tema. El caso es que, cuando tenemos este informe listo, no solo basta con tenerlo, sino que hay que subirlo al servidor. Para hacer esto, tan solo tendremos que asignarle la ubicación del servidor de informes(normalmente: http://[localhost]ó[unaIP]ó[nombreDelServidor]/[reportserver]ó[reportserver$NombreInstancia])  y la carpeta donde almacenaremos nuestro informe, si este no va en el raíz del sitio. Una vez hecho esto, implementamos y el informe estará subido.

Ahora queda llamarlo. Podemos llamarlo desde el browser o desde un control nuevo llamado ReportViewer.

Yo prefiero llamarlo desde el ReportViewer, y tenerlo todo controlado, desde el browser podemos llamarlo con parámetros incluso desde la url, pero la verdad no lo utilizé mucho. Esto no significa que desde un browser no se pueda controlar ni mucho menos.

Ahora voy a explicar como configurar algunas propiedades del ReportViewer cuando estamos tratando con un informe desde un servidor de informes.

Para llamar un informe de forma remota, como ya dije antes, tan solo tenemos que especificar el servidor de informes, la carpeta(esta es opcional) y el informe.

Visual Basic:

' Le indicamos la carpeta y el informe si la extensión de este.
 Me.ReportViewer1.ServerReport.ReportPath =  "CarpetaDondeEsteMiInforme/MiInforme(sin la extensión)"
 ' Y el servidor donde está alojado el informe.
 Me.ReportViewer1.ServerReport.ReportServerUrl = _
            New System.Uri("http://[localhost] ó [mi servidor] ó [UnaIP]/" & _
                                      "[reportserver] ó [reportserver$MiInstancia]/")

C#:

// Le indicamos la carpeta y el informe sin la extensión de este.
this.reportViewer1.ServerReport.ReportPath = "CarpetaDondeEsteMiInforme/MiInforme(sin la extensión)";
// Y el servidor donde está alojado el informe.
this.reportViewer1.ServerReport.ReportServerUrl =
                new System.Uri("http://[localhost] ó [mi servidor] ó [UnaIP]/" +
                                          "[reportserver] ó [reportserver$MiInstancia]/");

Si además nuestro informe tiene parámetros, no hace falta mostrar los controles que pone el reportviewer para cada parámetro, que están muy bien para introducirlos nosotros mismos al probar nuestro informe. ¿Pero y si queremos controlar que es lo que mete el usuario?, para ello podemos crear nosotros nuestros controles personalizados, métodos de comprobación y otros métodos. Luego una vez hecho estas comprobaciones podremos introducir nuestros parámetros también desde código. 

En este caso para meter uno o varios parámetros deberemos de crear un array de la clase ReportParameter o una colección de estos. Cada parámetro deberá de llevar el nombre del parámetro al que se le va a pasar un valor o conjunto de valores y opcionalmente un valor booleano que nos indicará si el parámetro se muestra en la interfaz de usuario o no.

Ejemplo con dos formas diferentes de meter los parámetros.-

Visual Basic:

'  Creo una colección de parámetros de tipo ReportParameter
' para añadirlos al control ReportViewer.
Dim parametros As New List(Of ReportParameter)
' Añado los parámetros necesarios.
parametros.Add(New ReportParameter("NombreDelParámetro", "Valor o Array de valores"))
' Añado el/los parámetro/s al ReportViewer.
Me.ReportViewer1.ServerReport.SetParameters(parametros)

' Creo uno o varios parámetros de tipo ReportParameter con sus valores.
Dim parametro As New ReportParameter("NombreDelParámetro", "Valor o Array de valores")
' Añado uno o varios parámetros(En este caso solo uno al ReportViewer
Me.ReportViewer1.ServerReport.SetParameters(parametro)

C#:

// Creo una colección de parámetros de tipo ReportParameter 
// para añadirlos al control ReportViewer.
List<ReportParameter> parametros = new List<ReportParameter>();
// Añado los parámetros necesarios.
parametros.Add(new ReportParameter("NombreDelParámetro","Valor o Array de valores"));
// Añado el/los parámetro/s al ReportViewer.
this.reportViewer1.ServerReport.SetParameters(parametros);

// Creo uno o varios parámetros de tipo ReportParameter con sus valores.
ReportParameter parametro = new ReportParameter("NombreDelParámetro", "Valor o Array de valores");
// Añado uno o varios parámetros(En este caso solo uno al ReportViewer
this.reportViewer1.ServerReport.SetParameters(new ReportParameter [] {parametro});

Por otro lado, si además queremos obtener los parámetros que tiene nuestro informe, podemos obtenerlo desde el ReportViewer. Esta sentencia sirve tanto para informes locales como remotos.

Visual Basic:

' Creo una colección de parámetros y meto los parámetros.
Dim parametros As ReportParameterInfoCollection = Me.ReportViewer1.ServerReport.GetParameters()
'Dim parametros As ReportParameterInfoCollection = Me.ReportViewer1.LocalReport.GetParameters()

C#:

// Creo una colección de parámetros y meto los parámetros.
ReportParameterInfoCollection parametros = this.reportViewer1.ServerReport.GetParameters();
//ReportParameterInfoCollection parametros = this.reportViewer1.LocalReport.GetParameters();

 Credenciales. Nuestras fuentes de datos pueden o no pedir credenciales a la hora de ejecutar el informe. Para ver que fuentes de datos tenemos en nuestro informe y asignarle los permisos necesarios a cada una, podemos hacerlo de la siguiente forma:

Visual Basic:

Dim total As Integer = Me.ReportViewer1.ServerReport.GetDataSources().Count
' Creo un array de DataSourceCredentials con el total 
' de DataSources que tiene el informe.
Dim permisos(total) As DataSourceCredentials
' Obtengo los datasources del informe.
Dim datasources As ReportDataSourceInfoCollection = Me.ReportViewer1.ServerReport.GetDataSources()
' Ahora por cada fuente de datos, le asignaremos al array de credenciales
' el nombre, userid y password.
For i As Integer = 0 To total - 1
       permisos(i).Name = datasources(i).Name
       permisos(i).UserId = "UsuarioDeNuestraBBDD"
       permisos(i).Password = "PasswordDelUserId"
Next

C#:

int total = this.reportViewer1.ServerReport.GetDataSources().Count;
// Creo un array de DataSourceCredentials con el total 
// de DataSources que tiene el informe.
DataSourceCredentials [] permisos = new DataSourceCredentials[total];
// Obtengo los datasources del informe.
ReportDataSourceInfoCollection datasources = this.reportViewer1.ServerReport.GetDataSources();
// Ahora por cada fuente de datos, le asignaremos al array de credenciales
// el nombre, userid y password.
for (int j = 0; j < total; i++)
{
        permisos[j].Name = datasources[j].Name;
        permisos[j].UserId = "UsuarioDeNuestraBBDD";
        permisos[j].Password = "PasswordDelUserId";
 }
 // Asigno los permisos.
 this.reportViewer1.ServerReport.SetDataSourceCredentials(permisos);

Bueno se me queda en el tintero para otro posible post, como conectarse de forma local a un informe. Ya que la mayoría de estas opciones sirven tanto para informes locales(LocalReport) como para los que están en el servidor(ServerReport).

Espero que les sirva.

Un Saludo

[cross-posting desde Geeks.ms]
Posted: lunes, 20 de agosto de 2007 16:01 por FranDiaz

Comentarios

Saul ha opinado:

Que tal Frank, por ahi tengo un problema cuando quiero asignarle las credenciales al reporte en la línea donde dice:

permisos(i).Name = datasources(i).Name

me dice que utilice la palabra clave "new" para crear una instancia del objeto, si me pudieras decir que me falta

# octubre 29, 2007 23:46

FranDiaz ha opinado:

Hola Saul,

¿Creastes el objeto datasources?

Un Saludo

# noviembre 14, 2007 17:04

Alex ha opinado:

HOLA!

Tengo una duda, cómo hago lo mismo, indicarle los parámetros, pero al reportviewer que se inserta en un aspx??

Se puede indicarle los parámetros manualmente, pero precisamente mi problema es que no debo de mostrar los parámetros al usuario, sino que debe de estar automatizado dicho envio de parámetros.

# enero 8, 2008 23:52

FranDiaz ha opinado:

Hola Alex,

Tal como se explica ahí, pero utilizando el control ReportViewer que está disponible para el web Wink.

Un Saludo

# enero 22, 2008 9:08

Carlos A ha opinado:

hola

tengo que mostrar dos reportes pero solo me muestra uno el otro no sale en el local hay un metodo que se llama clear para eso pero como seria en el server?

# enero 22, 2008 23:26

FranDiaz ha opinado:

Hola Carlos A,

¿Puedes explicarte un poco más extendido?. No entiendo exactamente lo que te pasa Sad.

Un Saludo

# enero 23, 2008 15:30

andres ha opinado:

Muy bien, pero cuando lo corro en modo remoto me saca error de acceso 401 unhautorized acces..como podria solucionar eso?? llevo como una semana con ese problema y la verdad me tiene loco..

# enero 29, 2008 17:26

FranDiaz ha opinado:

Hola Andrés,

El problema tiene que ser de los permisos. Entra en el portal de administración y dale permisos a la máquina con la que quieres entrar.

Un Saludo

# enero 31, 2008 15:53

Alejandro ha opinado:

Ola buenas, estos dias he visitado mucho esta pagina, tiene cosas interesantes, y ahora estoy metido en el mundo de los informes para una aplcacion q tenemos q hacer. Me gustaria saber como en un mismo Report Viewer, se pueden meter varios informes creados. Como lo tengo hecho ahora es en cada report viewer meter un informe y luego eligiendolos en un combo box. Queda bastante cutre. Entonces lo q quiero hacer es al pinchar sobre un informe en el combobox, q en el mismo report viewer cargue el informe deseado. Me gustaria que si supieran me lo comunicaran. MUchas gracias. Un saludo

# febrero 4, 2008 12:30

FranDiaz ha opinado:

Hola Alejandro,

Gracias por las visitas Wink.

Puedes cargar todos los informes que quieras en el control. Eso sí, de uno en uno. Para meter más de un informe, pudes hacer informes con subinformes dentro.

Espero que te haya aclarado la duda.

Un Saludo

# febrero 5, 2008 13:18

Alejandro ha opinado:

Pues a ver, lo q quiero es meter varios informes en el mismo Report Viewer. El control Report Viewer tiene una flechita arriba a la derecha para elegir el informe que quieras. Pero no quiero cambiarlo en el diseño cada vez q quiera elegir un informe, quiero cargarlo en el combo box. No quiero crear varios Report Viewer. Y eso de crear subinformes ni idea jejeje. Un saludo

# febrero 6, 2008 13:28

FranDiaz ha opinado:

Hola Alejandro,

Ve cambiando el informe que quieres desde código Wink.

Un Saludo

# febrero 17, 2008 14:03

Maria ha opinado:

hola Fran,

yo tengo un problema y es que cuando llamo a

int total = this.reportViewer1.ServerReport.GetDataSources().Count;

el total = 0.

Pero en mi formulario se muestra perfectamente el report.

¿como puedo acceder al dataset que alimenta mi report??

# marzo 6, 2008 12:02

Camilo ha opinado:

Hola Fran.

Me han servido mucho todo acerca de Reporting services. Pero ahora tengo un problemita.

Mi reporte cuando lo corro con el visual studio development server me corre perfectamente, pero cuando corro la aplicación con el reporte montado en el IIS, el reporviewer que va a contener el reporte aparece sin las imágenes de la barra de herramientas del reportviewer y el reporte no lo muestra.

Me podrías ayudar con esto por favor?

Muchas gracias

# marzo 10, 2008 22:37

JCamilo ha opinado:

Hola Fran.

Me ha servido de mucho tus artículos sobre reporting services. Pero tengo un problemita.

Cuando ejecuta una aplicación web para mostrar un reporte ejecutando desde el servidor virtual de Visual studio sale bien, pero cuando lo ejecuto con IIS el report viewer sale sin los controles de la barra de herramientas y no muestra el reporte.

Muchas Gracias.

# marzo 11, 2008 21:31

FranDiaz ha opinado:

Hola Camilo,

Eso te pasa porque tienes que tener instalado en el servidor unas dlls específicas para utilizar el control ReportViewer.

Instala estas que te indico a continuación y ya me contarás Wink.

Enlace: http://geeks.ms/blogs/fdiaz/archive/2007/06/21/microsoft-report-viewer-distributable-2005-sp1.aspx

Un Saludo

# marzo 18, 2008 8:56

FranDiaz ha opinado:

Hola Maria,

En el momento que ha llamas a esa instrucción, ¿está cargado ya el report?¿le hicistes un refresreport?

Un Saludo

# marzo 18, 2008 8:58

Maria ha opinado:

Hola Fran,

Los informes van a ser programados por la noche.

he hecho algunas pruebas y ya encontré una solución a lo que te preguntaba.

Para acceder a mis datos del report,he renderizado mi informe a xml y a partir de ahi me creo un dataset con los datos que me interesan.

un saludo

# marzo 18, 2008 11:17

Maria ha opinado:

hola Fran,

yo tengo un problema con las marcas de contraer y expandir.

Resulta que cuando visualizo el informe en un visor, me lo muestra todo contraído.Pincho para desplegar y va bien.

Pero luego cuando vuelvo a pinchar no me lo contrae.

Si esto lo hago en el servidor de informes funciona correctamente

¿tienes alguna idea?

Además, cuando vuelvo a ejecutar la aplicacion, el mismo informe se ve expandido, es decir, se visualiza con el ultimo estado

no sé qué es lo que está pasando

muchas gracias y enhorabuena por tu blog.

# marzo 31, 2008 16:00

Sara ha opinado:

Me gustaria que me explicaras como acceder a un informe que tengo en una carpeta en local sin usar servidor

# abril 7, 2008 13:37

FranDiaz ha opinado:

Hola a tod@s,

Estoy contestando todos los comentarios en los foros de MSDN. Más información del porque la podéis encontrar aquí: http://labloguera.net/blogs/fdiaz/archive/2008/04/25/191-adi-243-s-a-los-comentarios-en-el-blog.aspx

Un Saludo

# abril 26, 2008 13:57
No se permiten comentarios de usuarios anónimos