2009-03-25 54 views
10

Tengo un SQLServer 2005 Reporting Services ServerReport implementado y utilizado con frecuencia por mi aplicación Winforms (Framework 2.0) a través del control ReportViewer.Imprimir ServerReport sin vista previa

Lo que necesito es proporcionar un botón de impresión con un solo clic desde uno de los formularios de la aplicación que activa solo el cuadro de diálogo de impresión, sin abrir el ReportViewer.

He estado experimentando con la representación del informe en una matriz de bytes, pero no puedo pasar eso.

Este informe tiene varias páginas, por lo que no sé si la representación de "Imagen" que funciona para los informes locales funcionará también para los informes del servidor.

He estado buscando tiro MSDN pero sólo hay referencia a los informes locales:

http://msdn.microsoft.com/en-us/library/ms252091(VS.80).aspx

Y la poca información que puedo obtener informes sobre el lado del servidor están utilizando referencias Web al servicio Web de servidor de informes y no quiero eso

http://blogs.msdn.com/bryanke/articles/71491.aspx

¿Hay alguna forma de imprimir un informe del servidor, usando el diálogo de impresión, sin mostrar el visor de informes para el usuario (no me importa si es detrás de las escenas)?

Respuesta

11

Ok, finalmente descubrió.

verificación de este enlace: Printing Reporting Services 2005 Reports

Esa entrada de blog tiene casi todo lo que necesitaba, pero voy a publicar la respuesta completa aquí por referencias.

Terminé usando el objeto visor de informes detrás de las escenas, pero solo por conveniencia, ya que no es obligatorio.

El primer paso es pedir al usuario para la configuración de la impresora:

Dim doc As New Printing.PrintDocument() 
AddHandler doc.PrintPage, AddressOf PrintPageHandler 
Dim dialog As New PrintDialog() 
dialog.Document = doc 
Dim print As DialogResult 
print = dialog.ShowDialog() 
doc.PrinterSettings = dialog.PrinterSettings 

Tener que, se procede a configurar nuestro llamado informe: La modificación de esta cadena, puede llegar a imprimir en cualquier tamaño de papel y cualquier orientación (cambio de altura y ancho para el paisaje), pero el informe mismo debe configurarse en el mismo diseño de página.

Dim deviceInfo As String = _ 
"<DeviceInfo>" + _ 
"<OutputFormat>emf</OutputFormat>" + _ 
" <PageWidth>8.5in</PageWidth>" + _ 
" <PageHeight>11in</PageHeight>" + _ 
" <MarginTop>0.25in</MarginTop>" + _ 
" <MarginLeft>0.25in</MarginLeft>" + _ 
" <MarginRight>0.25in</MarginRight>" + _ 
" <MarginBottom>0.25in</MarginBottom>" + _ 
"</DeviceInfo>" 

Dim warnings() As Warning 
Dim streamids() As String 
Dim mimeType, encoding, filenameExtension, path As String 
mimeType = "" : encoding = "" : filenameExtension = "" 

Finalmente, presentamos el informe con todas sus páginas.

Tenga en cuenta que si el informe tiene solo una página, el método renderStream nunca se utiliza.

rpt_control es el control del visor de informes, previamente configurado y con el objetivo de un informe del servidor.

Tenga en cuenta que en este código agregamos páginas a una lista. Esta lista es una variable global, ya que se necesita en el método PrintPageHandler.

Dim data() As Byte 
rpt_control.ServerReport.SetParameters(_parametros) 
data = rpt_control.ServerReport.Render("Image", deviceInfo, mimeType, encoding, filenameExtension, streamids, warnings) 
pages.Add(New Metafile(New MemoryStream(data))) 

For Each pageName As String In streamids 
    data = rpt_control.ServerReport.RenderStream("Image", pageName, deviceInfo, mimeType, encoding) 
    pages.Add(New Metafile(New MemoryStream(data))) 
Next 
doc.Print() 

Hasta ahora, no hemos hecho ninguna impresión en absoluto, esto es en realidad controla con el método PrintPageHandler que se hizo referencia anteriormente.

Dim pages As New List(Of Metafile) 
Dim pageIndex As Integer = 0 
Private Sub PrintPageHandler(ByVal sender As Object, ByVal e As PrintPageEventArgs) 
    Dim page As Metafile = pages(pageIndex) 
    pageIndex += 1 
    e.Graphics.DrawImage(page, 0, 0, page.Width, page.Height) 
    e.HasMorePages = pageIndex < pages.Count 
End Sub 
+0

El código aquí me ayudó a salir de la rutina en que estaba tratando de configurar algunos lotes de impresión desde SSRS. Así que felicitaciones para ti. Sí, sé que ha pasado un tiempo desde que publicaste esto. –

0

veo esta muestra, pero no saben si se adapta a sus necesidades: http://www.gotreportviewer.com/EMFPrint.zip

+0

Sí, eso fue más o menos el primer indicio de lo que tengo, pero tenga en cuenta que este ejemplo es para los informes locales, no informes remotos. En los informes del servidor no hay devolución de llamada para la creación de páginas y ese era mi problema, resolviendo cómo enviar todas las páginas. –

1

2 advertencias a la respuesta dada por David anterior: -

1) El orden en que se devuelven los arroyos etiquetas en SQL2005 es por lo general desde la segunda hasta la última página, pero en un muy cargado Maching (por ejemplo, entorno de producción) es muy posible que se devuelvan en orden arbitrario.

Los id. De ruta toman la forma < nombre de informe> _nn donde nn es un número. Esto hace que sea un poco complicado ordenar, ya que el nombre del informe será alfabético y los números son solo de forma abreviada, por lo que la página "myreport_2" ordenará después de la página "myreport_10". Que lleva a mi segunda advertencia

2) En SQL 2005, el informe de sufijos empiezan a las 2, en SQL 2008 que comienzan en 1 (para la página 2)

+0

oh, gracias por esta idea. Hasta ahora no he visto una situación en la que las transmisiones fluyan en un orden arbitrario ... pero voy a probar esto porque podría ser un problema. No es muy grande, ya que todas las páginas se presentarán al final, pero quién sabe qué implicaciones podría haber. –

1

gente tratando de utilizar este código con SQL Server 2008 R2 encontrará que solo imprime solo la primera página de informes de varias páginas. Hay un nuevo "comportamiento" en el que la matriz devuelta a streamids está vacía. Por favor, deje que Microsoft sé que la atención aquí:

https://connect.microsoft.com/SQLServer/feedback/details/573997/with-ssrs-2008-r2-microsoft-reporting-winforms-serverreport-render-method-returns-no-stream-identifiers-for-image-format#

+0

Acabamos de hacer una actualización a SQL 2008 R2 el pasado fin de semana y no había visto esta respuesta hasta ahora. Me he pasado medio día arrancándome el pelo antes de leer un poco más. Posteriormente, también le he hecho saber a MS que me importa. –

Cuestiones relacionadas