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

91 thoughts on “Exportando un informe desde Reporting Services

  1. Hola Fran, muy buen articulo, sin duda de gran utilidad. Veo que en esa pelea con los servicios web ssrs las estas ganando con creces :^) mucho ánimo

  2. me parece un articulo buenisimo.. gracias..

    solo una pregunta… quiero meter mis propias funciones o codigo al reporte en que seccion lo hago y como las mando llamar como esxpercion para enviarle parametros

  3. Buen día.

    Soy nuevo en .Net y en RS y al correr el programa me sale este error y no lo he podido corregir.

    Error 1 The type or namespace name ‘WApp_FormatoRS’ could not be found (are you missing a using directive or an assembly reference?)

    Agradeceria cualquier recomendacion al respecto.

    Diego.

  4. Hola Polux,

    Perdona por no contestar antes, no vi el comentario. Verás el nombre ‘WApp_FormatoRS’ es el nombre de mi proyecto, tu deberás de cambiarlo por el tuyo.

    Un Saludo

  5. Hola Sgil,

    Que tipo de funciones quieres meter, es decir que vas a hacer, o si puedes explicame un poco mejor cual es tu necesidad para poder ayudarte.

    Un Saludo

  6. Estoy tratando de crear un reporte que tiene un subreporte, pero no se como establecer los valores de los parámetros de consulta para el subreporte.

    Les agradezco su ayuda.

  7. Hola Fran, me ha servido de mucha utilidad tu artículo.
    Ahora he querido ir un poco más lejos y he añadido parámetros a mi report (parametro a asignar en clausula where) y no encuentro la forma de asignarlos en la llamada.

    Thanks in advance.

  8. Hola Fran, me ha servido de mucha utilidad tu artículo.
    Ahora he querido ir un poco más lejos y he añadido parámetros a mi report (parametro a asignar en clausula where) y no encuentro la forma de asignarlos en la llamada.

    Thanks in advance.

  9. Hola Cristina,

    Para implemetnar en una consulta un parámetro, dentro del editor de consulta, cambia tu consulta de la forma siguiente:

    =”select campo1, campoN from tabla/s where campoX = ‘” & Parameters!NombreDeTuParametro & “,”

    Listo, con esto cuando le pases algun valor a tu parámetro en el informe te generará la consulta correctamente. Si te das cuenta puse igual(=) y comillas(“”) para encerrarlo en una cadena. Ya que en el editor se puede utilizar sentencias de Visual Basic. Y es correcto utilizarlo así.

    Espero que te sea de utilidad.

    Un Saludo

  10. Hola de nuevo Fran, he probado pero me temo que no va a ser tan sencillo.
    Resulta que no estoy utilizando un servidor local de reports, asiq tengo que hacer deploy.
    Y al meter la consulta entre comillas me muestra un agradable cartel diciendome que el máximo de cadena es 128!!.
    Estoy bastante desesperada.

  11. Hola Cristina,

    Te recuerdo que esa select la tienes meter en el editor de consultas del diseñador y no en el campo. ¿es eso lo que haces ahora?.
    Para hacer el deploy tienes que configurarlo, es decir, una carpeta para el datasource(si lo vas a compartir), para el informe y el servidor de informes. Una vez hecho esto podrás implementar.

    Estoy a la espera.

    Un Saludo

  12. Hola Fran me parece formidable la informacion que nos facilitas, mira tal vez yo estoy un poquillo fuera de entorno pero tengo un problema con la suscripciones del RS, quiero enviarle parametros de fechas restandole un dia para que se envie diariamente, tu crees que esto sea posible?.. espero tus comentarios,
    Gracias de antemano.

  13. hola Marcps,

    No he estado tratando mucho ese tema, pero investigaré sobre ello. Cuando tenga una respuesta te avisaré por aquí, si lo consigues tu antes, avísame aquí como lo hicistes, así compartimos con la comunidad.

    Un Saludo

  14. Un articulo muy interesante. Estoy usandolo como guia.

    Tengo una duda al respecto. Cuando intento pasar desde un webform de asp.net usando una funcion de javascript para abrir el report nos da un error con uno de los parametros pasados en la URL:
    “El parametro de informe “Fecha” es de solo lectura y no se puede modificar. (rsReadOnlyReportParameter)”.

    Un saludo.

  15. Hola Gari,

    Realmente no se porque te puede pasar, ya que no se como le pasas los parámetros y como es la función.

    ¿Podrías especificar algo más? Gracias.

    Un Saludo

  16. Hola Fran,
    Un artículo interesante para aprender a exportar informes. Lo he seguido para exportar un informe a excel (con RS 2000), pero me surge un problema: no me aparece la barra de menú (la típica con el icono de guardar el archivo, etc). En cambio, al exportar a PDF sí que aparece. Esto es problema del RS o de algun parámetro que me falta por configurar?
    Gracias por adelantado :)

  17. Hola Bea,

    No trabajé nunca con SSRS 2000, solo con 2005. No sé si tiene los mismos servicios y no sé si funciona igual.

    Siento mucho no poder ayudarte [:(].

    Un Saludo

  18. Al exportar a Excel un reporte, quiero que los encabezados de las columnas se repitan en todas las hojas de excel al mandar a imprimir.
    (Las columnas a las que me refiero estan dentro de una tabla en el cuerpo del informe)

    ¿Como puedo hacer esto?
    ¿Se puede con alguna propiedad desde la creacion del reporte?

    Ya le puse las propiedades que repita los encabezados y pie de paginas, pero aun asi no se repiten en Excel los encabezados.

    Les agradezco de antemano su ayuda. Gracias

  19. Hola Javier,

    Tan solo tienes que decirle que se repitan en la cabecera de la tabla. Sino mal recuerdo es la misa propiedad(No tengo la herramienta ahora aquí).

    Sitúate en la tabla, luego selecciona la cabecera entera y busca la propiedad.

    Espero que te sirva.

    Un Saludo

  20. Hola Fran
    Me parece interesante que compartas todos tus conocimientos con nostros que recien empezamos en el RS2005, gracias por eso, bueno sabes tengo una duda, como puedo exportar un .rdl desde un web form por medio de un control button por ejemplo.
    Un Saludo

  21. Hola Carlos,

    Si ya sabes a que formato lo vas a exportar, tan solo basta con poner ese código en el botón o en una clase aparte.
    También podrías poner un combobox con los tipos de formatos a exportar(los que tu creas convenientes [;)]) y un botón de exportar.

    Espero que te sirva.

    Un Saludo

  22. enhorabuena por tu artículo y gracias por tu tiempo. Desearía imprimir un reporting, sin visualizarlo el usuario, directamente en la impresora por defecto y sin ningún mensaje. Directamente del “button” impresión del formulario a la impresora. Muchas gracias.

  23. Gracias , te agradezco tu ayuda, sin embargo, funciona bien la propiedad al verse en WEB, pero al exportar a Excel en un libro que tiene mas de una hoja no se repite en encabezado de la tabla, solo se repite el encabezado del informe.

    Tengo que hacer en Excel que el encabezado de la tabla sea parte del encabezado de la pagina, pero quisiera de saliera de manera automatica.

    Le he intentado todas la propiedades y combinaciones,y aun no logro que salga de manera automatica.

    Gracias!

  24. Hola mlopez,

    Tan solo tendrías que poner el trozo de código de exportar en tu botón con el formato que tu quieras.¿responde eso a tu pregunta?

    Un Saludo.

  25. Hola Javier Payro,

    Veamos, yo cuando exporto a excell(en SSRS 2005) me exporta la cabecera del informe junto con la de la tabla. Despues de esto los datos, y solo una vez, no se me repiten ni cabecera de informe ni de tabla. ¿Es ese tu problema?.

    Un Saludo

  26. Hola Fran, muy bueno el articulo. Tengo que exportar a exel desde una web application aproximadamente 20 reportes. La idea es que se exporten todos al mismo tiempo al presionar sobre un button. Tenes idea como ùedo encararlo?

  27. Hola Fran, muy bueno el articulo. Tengo que exportar a exel desde una web application aproximadamente 20 reportes. La idea es que se exporten todos al mismo tiempo al presionar sobre un button. Tenes idea como ùedo encararlo?

  28. Hola,

    Pues si sabes la ruta, los informes que son, tan solo tienes que hacer un for o while(como mejor creas) y exportarlos tal como te indico en este post. La diferencia, es que no tienes que pedirle al usuario la extensión, ya la sabes [;)].

    Espero que te sirva de ayuda.

    Un Saludo.

  29. hola tengo un apregunat quisiera saber si se pueda hacer la entrega de in reporte cuando lo solicita el usuario y no en forma automatica , porfavor ayuda

  30. No me refiero a que si se pude crear una pagina o pantalla que pueda accesar el usuario y que cuando modifique la informacion esta pueda hacerle cambios a la suscripcion de los infromes cambiando la hora y/o fecha del envio de dicho reporte

  31. Hola Fran,

    Estupendo artículo el tuyo. No obstante poniendo este ejemplo en producción me encuentro con que salta la siguiente excepción:
    System.Web.Services.Protocols.SoapException: The permissions granted to user ‘NT AUTHORITYNETWORK SERVICE’ are insufficient for performing this operation. —>

    ¿Sabes a que puede ser debido?

  32. Hola Gonzalo,

    Cuando trabajas en local todo va a las mil maravillas. El caso es que estando en local tienes permiso para entrar en tu servidor de informes porque tu máquina por defecto los tiene.

    El problema viene, cuando intentas acceder a otro servidor para traerte esos reportes. Accede al servidor(http://TuServidor/reports) y configura los permisos necesarios para que tú máquina pueda entrar.
    Si te apetece mejor tener una cuenta en la máquina del servidor y entrar con esta(controlando tu que usuario entra y demás a través de formularios) date una vuelta por aquí(http://geeks.ms/blogs/fdiaz/archive/2007/06/06/configurando-seguridad-desde-el-reportviewer.aspx) que explico como hacerlo.

    Espero que se te solucione.

    Un Saludo

  33. Buenas.

    Quisiera saber cómo se hace para exportar un informe de reporting services en formato pdf desde un formulario aspx en un proyecto web. Solamente quiero que al hacer click en un botón se le pasen los parámetros al reporte y se me abra el pdf generado con el reporte para poder imprimirlo.

    Gracias

  34. Hola,

    Muy bueno el artículo, ayuda mucho.

    Me da un error cuando ejecuto el refresh report:
    “El cliente encontro el tipo de contenido de respuesta “, pero se esperaba ‘text/xml’. Error de la solicitud con una respuesta vacia.”
    ´
    ¿Sabes que podría haber hecho mal?

    Gracias, un saludo

  35. Hola Jesús Daniel,

    Realmente me coges fuera de juego. En verdad hay que obtener los parámetros de tu página web(de tus controles), pasarselos al informe y decirle que exporte.

    Me imagino que esto es lo que habrás pensado ya tu claro. Sigue pensando y yo en estos dias lo miro y te comento como lo hice(si no lo consigues tu antes claro).

    Un Saludo

  36. Hola Lucía,

    Dame un poco más de información ¿ok?. ¿Eso te pasa cuando lo ejecutas desde el visual studio(en vista previa digo) o desde un control(reportviewer o browser)?

    Un Saludo

  37. Hola Fran : Gracias por tu blog , me ah ayudado muhco en mis tareas , bueno mi consulta es la siguiente y agradeceria mucho me pudieras ayudar , por q ya nos e q mas puedo hacer :
    Necesito exportar un reporte a excel , pero mi reporte tiene mas de 65000 registros , y pues me sale un error a generarlo en excel , quisera q me digas que puedo hacer , al respecto me dan la posibilidad de que se exportado a .txt , pero tampoco se nos ofrece esa opcion que puedo hacer? , por ayudame!!
    100000 d gracias

  38. Hola Melvy,

    Hace unos dias me pasó lo mismo. Por ahora no lo traté pero si se me ocurrió cosas para cuando vaya a hacerlo. Esto es un problema para el usuario, ya que no podrá exportar como tu bien dices, más de 65000 registros, es decir, una más de una hoja de excell.

    Se podría controlar el tema poniendo un mensaje al usuario con el problema para que lo entendiera. Ponder parámetros para que pudiera traer los registros entre unos rangos o controlarlo tu al exportar y juntar “X” hojas de excell en una misma.

    En fin, cuando mire mi caso postearé al respecto. Si tienes o haces alguna solución coméntala [;)].

    Un Saludo

  39. buenas!

    quiero exportar un report con parámetros a PDF sin abrir el viewer
    me devuelve el ‘famoso’ error:
    “Falta el valor actual del campo de parámetro”

    ¿alguien tiene la solución a este problema?

    muchas gracias

  40. Buenas Fran

    No se si he entendido bien la solución que me propones para mi problema con .NET y Crystal Reports, me he decidido a escribirte ya que poder solventar este inconveniente me supondría un gran ahorro en mi tarea.

    Quiero exportar varios rpt’s a PDF automáticamente, sin utilizar viewer ni ventanas de “guardar como” ni similares, así que trataba de utilizar el motor de CR desde .NET.
    Mis rpts tienen parámetros que le envío desde programa, así como parámetros de enlace con subinformes.
    He implementado una rutina para aplicar los valores de TODOS los parámetros; el problema que me he encontrado es que la clase ParameterValue no tiene una propiedad value, y si aplico la clase ParameterDiscreteValue tampoco me aplica el valor que le introduzco en su propiedad (las funciones ApplyCustomParameters o algo así…).
    No se si hago algo mal, o existe un bug en el .NET 2002 que no realiza esto correctamente.

    Lo que entiendo de la solución que me propones es que cree los prámetros en ejecución desde programa, si es así, esto no me sirve, ya que tengo los parámetros de enlace entre subinformes.

    A ver si puedes echarme una mano.

    Muchísimas gracias por tu tiempo y por tu atención.

    Un saludo,
    DSL.

  41. Hola DSL,

    Creo que ha habido un mal entendido desde el principio. Yo creía que utilizabas Reporting Services como sitema de informes y tu utilizas Crystal Reports.

    La verdad es que no utilizo Crystal Reports y no puedo ayudarte con ello [:(].

    Lo siento.

    Un saludo

  42. tengo un reporte al cual ya le agregue un subreporte, pero al momento de mandar a imprimir solo me imprime el reporte principal no asi el subreporte, como le puedo hacer para que se impriman los dos??’

  43. Hola Armando,

    Es raro que no puedas imprimir los dos [:S]. En el momento de imprimir el report, ¿ya está ejecutado el subreporte?

    Si lo solucionastes ya me comentarás.

    Un Saludo

  44. Hola Frank,

    Te felicito por ayudar a tanta gente y brindarles tu conocimiento.

    Estoy trabajando con unos reportes de tipo Tabla, y les tengo el “drilldown”. Estos los invoco a partir del Web Services en .net.

    Deseo hacer que cuando el usuario seleccione el formato PDF, el reporte generado sea como si no tuviera el “drilldown”. Es decir saliera todo expandido.

    Gracias por tu ayuda.

  45. Hola Derly,

    Lo puedes hacer igual que ahora, con los web services. Eso por una parte para cargarlo de nuevo. A ti te ha pasado lo mismo que a mí en su día. Está muy bien todo contraido porque así es el usuario el que abre cada nodo o region. Pero cuando queremos imprimir o exportar, este sale tal como lo tengamos en ese momento. Yo para ello, creé un parámetro de tipo boolean que me expande o contrae todo según su valor. Podrías hacer lo mismo a la hora de exportarlo. Puedes crearte el parámetro oculto y pasarle el valor este al exportar al formato que tú quieras.
    Bueno, ¿como hacemos esto?, igual a estas alturas ya sabes más o menos, pero en otra entrada de mi blog lo hice hace tiempo. Te la dejo ahí para que le eches un vistazo.
    http://geeks.ms/blogs/fdiaz/archive/2007/05/14/how-to.aspx
    Espero que te sirva. Ya me contarás que tal te fué.

    Un Saludo

  46. Hola Fran,

    Gracias por compartir tus conocimientos para todos los que estamos aprendiendo a utilizar esta herramienta, muy buen articulo.

    Tengo una consulta, hay alguna forma de imprimir un reporte en un tamaño de pagina determinado por ejemplo tamaño A4 sin necesidad crear el reporte con este tamaño, es decir que se realice un zoom de reduccion para que salga impreso correctamente en la hoja?

    Gracias.

  47. Hola,

    Gracias Derly, hacemos lo que se puede [:)]. Me alegro de que te vaya bien.

    Miguel, ¿te refieres a imprimir directamente el informe?. El zoom lo puedes manejar tu desde el ReportViewer con las propiedades ZoomMode y ZoomPercent.

    Si no es esto lo que buscas por aquí estaré.

    Un Saludo.

  48. Necesito que los datos que muestro en mi enzabezado, los cuáles son llamados desde una BD, aparezcan en todas mís páginas ya que solo aparecen en una 8-S, ayuda please ya llevo un rato con esto, cualquier tip o sugerencia es bienvenida!

    Gracias Frank o quién sea que me conteste!!

  49. Saludos, tengo una gran duda, ya que obtengo el arreglo de bytes y lo quiero guardar con el dialogfile, no lo guarda, elijo un archivo .pdf y le doy sobreescribir, no marca errores pero cuando abro el archivo esta en blanco, si lo abro con notepad, aparece un encabezado de pdf, si alguien me puede decir que sucede estare muy agradecido.

  50. Saludos, tengo una gran duda, ya que obtengo el arreglo de bytes y lo quiero guardar con el dialogfile, no lo guarda, elijo un archivo .pdf y le doy sobreescribir, no marca errores pero cuando abro el archivo esta en blanco, si lo abro con notepad, aparece un encabezado de pdf, si alguien me puede decir que sucede estare muy agradecido.

  51. Saludos, tengo una gran duda, ya que obtengo el arreglo de bytes y lo quiero guardar con el dialogfile, no lo guarda, elijo un archivo .pdf y le doy sobreescribir, no marca errores pero cuando abro el archivo esta en blanco, si lo abro con notepad, aparece un encabezado de pdf, si alguien me puede decir que sucede estare muy agradecido.

  52. Hola David,

    No hacía falta escribirlo tres veces, jejeje. Normalmente al gente que no está registrada en este portal de blogs no les permito escribir directamente por el tema del spam en los comentarios. Para otra vez con que pulses una vez irá bien [;)].

    Volviendo al tema, lo que explico en este post, es como exportar un informe a diferentes formatos. Para poder guardar la información el informe tiene que estar generado antes. Probablemente sea es tu problema.

    Ya me contarás que tal te fué.

    Un Saludo

  53. Antes que nada una disculpa por postearlo tantas veces, ahora, el informe ya se encuentra guardado en el report server en una carpeta donde tengo mis informes /reportes/informe1 etc, ahora cuando lo mando a llamar para ejecutar el render del report service me responde de forma correcta y extraigo el arreglo de bytes, pero a la hora de guardarlo ocurre lo que te describo en el post anterior, gracias de antemano

  54. Antes que nada una disculpa por postearlo tantas veces, ahora, el informe ya se encuentra guardado en el report server en una carpeta donde tengo mis informes /reportes/informe1 etc, ahora cuando lo mando a llamar para ejecutar el render del report service me responde de forma correcta y extraigo el arreglo de bytes, pero a la hora de guardarlo ocurre lo que te describo en el post anterior, gracias de antemano

  55. Antes que nada una disculpa por postearlo tantas veces, ahora, el informe ya se encuentra guardado en el report server en una carpeta donde tengo mis informes /reportes/informe1 etc, ahora cuando lo mando a llamar para ejecutar el render del report service me responde de forma correcta y extraigo el arreglo de bytes, pero a la hora de guardarlo ocurre lo que te describo en el post anterior, gracias de antemano

  56. Hola Fran,
    tus articolus siempre son muy intresante y me ayudan mucho, eres un gran programador.
    Tengo un problema con la linea:

    // Cargo el report.
    RSGuardar.LoadReport(this.reportViewer1.ServerReport.ReportPath, history);

    A mi me sale un error que no se por que me sale, el informe me lo presenta bien pero al guardar a un formato me falla.
    Este es el error que me sale:
    No es posible conectar con el servidor remoto

    Pero esto es mentira porque si que me lo presenta el informe y se conecta al servidor, tengo todos los permisos, no lo entiendo, si sabes algo por que me pasa esto dimelo.
    Muchas gracias, un saludo.

  57. Hola Sap,

    ¿Te conectas desde tu máquina a la del servidor?. Si estás siguiendo mi código, este pone las credenciales por defecto. Y entonces tú máquina debe de tener permisos en el servidor al que accedes para poder ejecutar el informe.

    Ya me vas comentando.

    Un Saludo.

  58. Hola otra vez yo,
    que rapido eres en contestar, yo he pensado que mañana lo vera una respuesta xD
    Bueno esto puede ser el problema pero no tengo idea como tendria que ponerlo.
    Es algo con:
    System.Net.CredentialCache.DefaultNetworkCredentials.UserName y System.Net.CredentialCache.DefaultNetworkCredentials.Password?
    Lo siento por las molestias, pero es que yo soy nuevo en .NET y no tengo muchas experiencias.

  59. Saludos Fran, de nuevo disculpas por que el post se muestra 3 veces, pero esta vez esoty seguro de que no fui yo, por lo que creo que hay un problemita con el sitio, asi que tel vez este post tambien se replique 3 veces, por otro lado que dejo el codigo que estoy ocupando

    private void button2_Click(object sender, EventArgs e)
    {

    this.comboBox2.SelectedValue = 3;
    string rep = Rep.ObtenerPDF(30, 1);
    byte[] reporte = System.Text.Encoding.Unicode.GetBytes(rep);

    this.saveFileDialog1.Filter = “PDF *.pdf|*.pdf”;
    try
    {
    if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)
    {

    using (FileStream stream = File.OpenWrite(@”C:Rep1.pdf”))
    {

    stream.Write(reporte, 0, reporte.Length – 1);
    }

    }
    }
    catch (Exception ex)
    {
    throw;
    }
    }

    como veras la clase Rep contiene el metodo que me carga el reporte y me lo devuelve en un string Rep.ObtenerPDF(30, 1), hasta ahi no tengo inconveniente, el problema es al guardar,

    private static string ObtenerPDF(ParameterValue[] param, string nombreReporte)
    {
    // Se crea la clase proxy al WS
    ReportingService rs = new ReportingService();

    string pdf = string.Empty;
    // Preparación de argumentos del reporte
    string historyID = null;
    string deviceInfo = null;
    string format = “PDF”;
    string showHide = null;
    DataSourceCredentials[] credentials = null;
    Byte[] results;
    string encoding;
    string mimeType;
    Warning[] warnings = null;
    ParameterValue[] reportHistoryParameters = param;
    string[] streamIDs = null;

    // Se especifican las credenciales para el acceso al WS
    //string usuario = System.Configuration.ConfigurationSettings.GetConfig[“usrRS”];
    //string pwd = System.Configuration.ConfigurationSettings.GetConfig[“pwdRS”];
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;//new System.Net.NetworkCredential(“MX-D-DXM03045″,””);

    // Se especifica el URL del WS de MSRS
    rs.Url = “http://localhost/ReportServer/ReportService.asmx”;

    // Se ejecuta el reporte y se guarda el resultado en una cadena de caracteres
    try
    {
    results = rs.Render(nombreReporte, format, historyID, deviceInfo, param,
    credentials, showHide, out encoding, out mimeType,
    out reportHistoryParameters, out warnings, out streamIDs);

    pdf = System.Text.Encoding.Unicode.GetString(results, 0, results.Length);

    }
    catch (Exception ex)
    {
    bool rethrow = ExceptionPolicy.HandleException(ex, “Negocio Exception Policy”);
    if (rethrow)
    throw;
    }
    return pdf;
    }

    de antemano gracias

  60. Hola de nuevo david [:)],

    Vuelve a aparecerme tres veces [:S](esta vez solo dejo uno).
    Yo tu código lo veo bien, solo algunas cosillas:
    rs.Url = “localhost/…/ReportService.asmx”;

    En los … pones algo ¿no?

    ¿que error te da?

    Un Saludo

  61. Hola,

    Tengo una aplicación Windows que visualiza un Report rdlc con reportviewer desde local y luego lo exporta a .PDF.

    Ahora debo realizar el mismo proceso pero desde un servicio windows (programado en Vb.NET). Debo sustituir el ReportViewer por otro objeto. Podéis indicarme que objeto?

    Gracias

  62. tengo un reporte en crystal report 8 y requiero hacer un subreporte en el, alguien me podra ayudar con algunos link donde venga informacion, he buscado pero no encuentro informacion que pueda ayudarme, si tienen algun ejemplo, se los agradeceria

    Saludos

    Norma

  63. Hola, se que fran no ha trabajado con RS2000, pero de pronto alguien mas que entra ha esta pagina me puede ayudar, mi problema es que ya publico mis reportes pero cuando hago algun cambio y entro a ver nuevamente el reporte, este no se actualiza, el 2000 no tiene el ReportViewer1.RefreshReport();, en su lugar hay un boton de actualizar en la barra de herramientas, pero yo no quiero que el usuario que ve el reporte pueda exportarlo, por eso necesito deshabilitar la barra de herramientas e implementar la funcionalidad del boton actualizar, si alguien sabe como hacer eso, por fa ayudenme… Gracias 😉

  64. Hola Olguita,

    No sé si esto funcionará, pero puede ser una solución. En SSRS, si te vas al IIS y entras en la carpeta ReportServer, luego abres el archivo rsreportserver.config podrás ver una estructura xml. Navega y comenta(con ) todo el contenido de Render(esta etiqueta no) para que te desaparezcan las opciones de exportar o deja las que te parezcan.

    Espero que esto te pueda ayudar.

    Un Saludo

  65. Hola Fran:
    Agradeciendo enormemente tu apoyo te escribo para comentarte que implementé este código en un WebForm de aspx y aunque solucioné algunos detalles (como la ausencia del control SaveFileDialog) no he podido solucionar lo siguiente:
    – Mi reporte tiene parámetros que filtran los resultados pero al momento de exportar (conforme a este ejemplo) el archivo que resulta trae siempre todos los datos de la consulta principal, es decir, no respeta el filtrado de los parámetros. ¿Que me estará faltando? Saludos y de antemano muchas gracias

  66. hola,
    tengo una duda, segui tu ejemplo y resulta muy interesante, sobre todo porque hace mucho que no hago algo con SSRS, pero cuando lo ejecuto me aparece un error.
    en el reportpath puse lo siguiente :
    reportViewer1.ServerReport.ReportPath = “D:/Documents and Settings/virginia.luduena/My Documents/nueva_prueba_reports/Report_Test.rdlc”;

    y me tira un error :
    The path of the item “D:/Documents and Settings/virginia.luduena/My Documents/nueva_prueba_reports/Report_Test1.rdlc” is not valid. the path must be less than 260 characters long and must start with slash. Other restrictions apply. (rslnvalidItemPath)

    por favor si me pueden ayudar, desde ya muchas gracias 😀
    virgy

  67. Hola,

    RitaE.- A que te refieres con modificar el ancho y alto de un parámetro. ¿Puedes explicarte un poco más?

    virgy_1.- El problema que tienes, es que estás intentando subir un informe que es de tipo local(rdlc) y no de servidor(rdl). Para exportar un informe de tipo local, no deberías de tener mayor problema con hacerlo desde el reportviewer. Voy a ver si saco tiempo y explico en un artículo como hacerlo [;)].

    Un Saludo

  68. Hola Franz
    Que gusto saber que se puede contar contigo para salir de nuestras dudas, queria preguntarte si es posible enviar un informe a un correo electronico desde codigo, lo que deseo hacer es que clicando en un boton se pueda enviar un informe en formato .pdf a un correo pero todo desde codigo y que el correo cambie cada vez que yo lo indique creo que para esto se tiene que crear una nueva suscripcion cada vez, lo cual tambien quisiera hacerlo por codigo, si tienes alguna idea de como hacer esto porfavor dimela, te agradezco mucho, Pilar.

  69. Hola Fran!!! Oye, tu apoyo es muy valioso. Ojala me puedas ayudar :) Necesito enviar directamente a impresión un reporte que está en un reportserver. Ya le paso parámetros, le paso las credenciales, lo puedo pasar a un arreglo de bytes en formato PDF, pero no sé cómo imprimirlo directamente a la impresora!!! Probé utilizando el objeto PrintDocument, pero hay que sobrecargar el evento PagePrint, pero me envía basura a la impresora. ¿Tendrás la solución a éste asunto?
    De antemano gracias por tu atención.

  70. Hola Pilar,

    Lo que pides no es muy dificil [:)]. Verás, exporta el informe, crea el pdf y envíalo a cuantas direcciones quieras. ¿Qué es lo que te falta para terminar esta acción?
    Las suscripciones son otro tema. Si quieres suscribir a un usuario a un informe, cuando se actualize este le mandará el correo.
    Creo que lo que me comentas son dos temas distintos. De suscripciones no estoy muy puesto, pero puedo mirar como funciona [;)].

    Ya me contarás.

    Un Saludo

  71. ¡Fran Díaz! Qué manera tan elegante de solucionar éste problema. Te agradezco muchísimo tu ayuda.

    Recibe luz en tu misión de vida, y que tu cosecha sea de abundancia en lo que más atesores.

    Quedo de ti, por si en algún momento del camino puedo corresponder tu orientación.

    Un abrazo.

  72. Hola Franz
    Muchas gracias por responder, de tu respuesta entiendo lo siguiente: visualizar el report en un control ReportViewer y exportar este report en .pdf lo cual se podria hacer por codigo creo (desde un boton por ejemplo, lo cual nunca he probado)y despues enviarlo a diferentes direcciones una vez que tenga el .pdf, solo que no tengo idea como hacer este envio a los mail, nose si existen metodos ya encargados para esto en el WebService ReportServer o si devo utilizar una herramienta para hacer el envio a los direcciones como las clases del SMTP, todo este proceso lo he ya probado manualmente en el webservice ReportManager creandome suscripciones, pero lo quisiera hacer por codigo. Gracias por escucharme, Pilar.

  73. Hola muchas gracias por el apoyo que me puedas brindar
    Tengo un requerimiento sobre obtener el formato de un reporte segun el numero de filas que se obtiene al ejecutar. Quiero decir si el resultado del reporte tiene menos de 10000 registros entonce que lo muestro solo por web, si el resultado del reporte tiene mas de 10000 pero menor que 60000 registros entonce que lo muestre por excel se puede configurar con esos criterio que te expongo ???
    GRACIAS

  74. Fran Diaz, tengo el siguiente problema en reporting services y quisiera saber si puedes ayudarme.
    Actualmente tengo un reporte alojado en el report server.
    El mismo tiene un link hacia un form.net, el cual se invoca mediante la funcion JS window.open embebida dentro del reporte.
    Este feature funciona a la perfeccion accediendo al reporte desde el report viewer site. (http://server/reports)
    Pero yo necesito mostrar el reporte dentro de un frame de un website.
    Hasta ahi voy bien, ya que logro mostrarlo sin problemas utilizando lo siguiente:
    http://servername/reportserver?%2fREPORT_NAME&rs:Command=Render

    El reporte se muestra correctamente, pero el feature del popup javascript esta deshabilitado.
    Sin embargo, si accedo al reporte desde el report viewer funciona de maravillas.
    Se te ocurre alguna idea?
    Quizas sea el frame el que este deshabilitando el codigo javascript?

    Espero tus comentarios, muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *