2009-03-25 15 views
10

Dispongo di un ServerServer di SQL Server 2005 Reporting Services distribuito e utilizzato frequentemente dall'app Winforms (Framework 2.0) tramite il controllo ReportViewer.Server di stampa Report senza anteprima

Quello che mi serve è di fornire un pulsante di stampa con un clic da uno dei moduli dell'app che attiva solo la finestra di dialogo di stampa, senza far apparire il ReportViewer.

Ho provato a eseguire il rendering del report su un array di byte, ma non riesco a superarlo.

Questo rapporto ha più pagine, quindi non so se il rendering di "Immagine" che funziona per i rapporti locali funzionerà anche per i rapporti del server.

ho cercato tiro MSDN, ma c'è un solo riferimento a rapporti locali:

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

E le poche informazioni che posso ottenere sui rapporti lato server utilizzano i riferimenti Web al servizio Web ReportServer e non lo voglio

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

C'è un modo per stampare un report del server, utilizzando la finestra di stampa, senza mostrare il visualizzatore di report per l'utente (non mi importa se è dietro le quinte)?

risposta

11

Ok, finalmente capito.

controllare questo link: Printing Reporting Services 2005 Reports

Questo post sul blog ha quasi tutto quello che mi serviva, ma ho intenzione di inviare la risposta completa per i riferimenti.

Ho finito per utilizzare l'oggetto visualizzatore di report dietro le quinte, ma solo per comodità, poiché non è richiesto.

Il primo passo sta chiedendo all'utente le impostazioni della stampante:

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 

Avere che, si procede a configurare il nostro appello rapporto: modifica di questa stringa, si può arrivare a stampare su qualsiasi formato e qualsiasi orientamento (commutazione dell'altezza e della larghezza per il paesaggio), ma il report stesso deve essere configurato nello stesso layout di pagina.

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 = "" 

Infine, rendiamo il rapporto con tutte le sue pagine.

Si noti che se il report ha solo una pagina, il metodo renderStream non viene mai utilizzato.

rpt_control è il controllo del visualizzatore di report, precedentemente configurato e mirato a un report del server.

Si noti inoltre che in questo codice si aggiungono pagine a un elenco. Questa lista è una variabile globale, poiché è necessaria nel metodo 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() 

Fino ad ora, non abbiamo fatto qualsiasi stampa a tutti, questo è in realtà gestita dal metodo PrintPageHandler che abbiamo citato in precedenza.

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

Il codice qui mi ha aiutato a uscire da un solco nel tentativo di impostare la stampa in batch da SSRS. Quindi complimenti a te. Sì, so che è passato del tempo da quando hai postato questo! –

0

vedo questo campione, ma non so se si adatta alle vostre esigenze: http://www.gotreportviewer.com/EMFPrint.zip

+0

Sì, era più o meno il primo accenno che ho ottenuto, ma si noti che questo esempio è per i rapporti locali, non i rapporti a distanza. Nei report del server non è disponibile la funzione di callback per la creazione di pagine e questo è stato il mio problema, in cui è stato descritto come inviare tutte le pagine. –

1

2 avvertimenti alla risposta data da David sopra: -

1) L'ordine in cui i flussi di etichette vengono restituiti su SQL2005 è di solito dalla seconda pagina all'ultima, ma su un carico elevato maching (ad es. ambiente di produzione) è abbastanza probabile che vengano restituiti in modo arbitrario.

Gli ID di flusso hanno il formato < nome report> _nn dove nn è un numero. Questo rende un po 'difficile da ordinare poiché il nome del report sarà alfabetico e i numeri sono solo in forma breve, quindi la pagina "myreport_2" sarà ordinata dopo la pagina "myreport_10". Che porta alla mia seconda avvertenza

2) Sulla SQL 2005 il rapporto suffissi partono da 2, su SQL 2008 cominciano a 1 (per la pagina 2)

+0

oh, grazie per questa intuizione. Finora non ho visto una situazione in cui i flussi sono entrati in un ordine arbitrario ... ma lo testerò perché potrebbe essere un problema. Non grande, dal momento che tutte le pagine saranno rese alla fine, ma chissà quali implicazioni potrebbero esserci. –

1

gente cercando di utilizzare questo codice con SQL Server 2008 R2 troverà che stampa solo la prima pagina di rapporti di più pagine. C'è un nuovo "comportamento" in cui l'array restituito agli streamid è vuoto. Siete pregati di Microsoft sapere che ti interessano qui:

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

Abbiamo appena effettuato un aggiornamento a SQL 2008 R2 lo scorso fine settimana e non avevo visto questa risposta fino ad ora. Ho passato mezza giornata a strapparmi i capelli prima di leggere un po 'di strada. Successivamente, anche io ho fatto sapere alla SM che mi importa. –

Problemi correlati