2009-03-25 2 views
10

Ich habe einen SQL Server 2005 Reporting Services-Serverbericht bereitgestellt und häufig von meiner Winforms-App (Framework 2.0) über das ReportViewer-Steuerelement verwendet.Drucken von Serverbericht ohne Vorschau

Was ich brauche, ist eine Drucktaste mit einem Klick von einem der Formulare der App, die nur den Druckdialog auslöst, ohne den ReportViewer aufzurufen.

Ich habe experimentiert mit dem Rendern des Berichts zu einem Byte-Array, aber ich kann das nicht passieren.

Dieser Bericht hat mehrere Seiten, daher weiß ich nicht, ob das Rendering "Image", das für lokale Berichte funktioniert, auch für Serverberichte funktioniert.

Ich habe geschaut, throw MSDN, aber es gibt nur Bezug auf lokale Berichten:

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

Und die kleinen Informationen, die ich auf Server-Seite Berichte erhalten kann, werden mit Hilfe von Web Verweisen auf den Reportserver Web-Service und das will ich nicht.

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

Gibt es eine Möglichkeit, einen Server-Bericht zu drucken, um den Druck-Dialog, ohne den Report Viewer für den Benutzer darstellt (ich nichts dagegen, wenn es hinter den Kulissen ist)?

Antwort

11

Ok, schließlich herausgefunden.

Check this link: Printing Reporting Services 2005 Reports

Die Blog-Post fast alles hat, was ich brauchte, aber ich werde die vollständige Antwort hier nach Referenzen veröffentlichen.

Ich landete mit dem Report Viewer-Objekt im Hintergrund, aber nur aus Bequemlichkeit, da es nicht erforderlich ist.

Der erste Schritt ist der Benutzer für die Druckereinstellungen zu fragen:

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 

dass Having, gehen wir unseren Bericht Aufruf konfigurieren: ändern Sie diese Zeichenfolge, können Sie sich auf jedes Papierformat drucken und jedem Ausrichtung (Höhe und Breite für Querformat wechseln), aber der Bericht selbst muss im selben Seitenlayout konfiguriert werden.

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

Schließlich rendern wir den Bericht mit all seinen Seiten.

Beachten Sie, dass die RenderStream-Methode nie verwendet wird, wenn der Bericht nur eine Seite enthält.

rpt_control ist das Report Viewer-Steuerelement, das zuvor konfiguriert wurde und auf einen Serverbericht abzielt.

Beachten Sie, dass wir in diesem Code Seiten zu einer Liste hinzufügen. Diese Liste ist eine globale Variable, da sie in der PrintPageHandler-Methode benötigt wird.

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() 

Bisher haben wir kein Drucküberhaupt gemacht wird dies tatsächlich von der PrintPageHandler Methode behandelt, die wir früher verwiesen.

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

Der Code hier half mir, aus einer Spur heraus zu kommen, in der ich versuchte, etwas Stapeldruck von SSRS zu setzen. Also ein großes Lob an dich. Ja, ich weiß, es ist etwas Zeit vergangen, seit du das geschrieben hast! –

0

Ich sehe diese Probe, aber nicht wissen, ob es Ihren Bedürfnissen entspricht: http://www.gotreportviewer.com/EMFPrint.zip

+0

Ja, das so ziemlich der erste Hinweis war ich bekam, aber beachten Sie, dass dieses Beispiel für die lokale Berichte, nicht remote Berichte. In Server-Berichten gibt es keinen Rückruf für die Erstellung von Seiten und das war mein Problem, sortiert, wie Sie alle Seiten senden. –

1

2 Einsprüche auf die Antwort von David gegeben oben: -

1) Die Reihenfolge, in der die Ströme Etiketten auf SQL2005 zurückgegeben werden, in der Regel von der zweiten bis zur letzten Seite, sondern auf einem stark ausgelasteten maching (zB Produktionsumgebung) ist es durchaus möglich, dass sie in beliebiger Reihenfolge zurückgegeben werden.

Die Stream-IDs haben die Form < Reportname> _nn wobei nn eine Zahl ist. Dies macht es ein wenig schwierig zu sortieren, da der Name des Berichts alphabetisch ist und die Zahlen nur eine kurze Form sind, so dass die Seite "myreport_2" nach der Seite "myreport_10" sortiert wird. Was zu meinem zweiten Vorbehalt

2) Auf SQL 2005 den Bericht Suffixe bei 2 beginnen, auf SQL 2008 sie beginnen bei 1 (für Seite 2)

+0

oh, danke für diese Einsicht. Bisher habe ich noch keine Situation gesehen, in der die Ströme in beliebiger Reihenfolge kamen ... aber ich werde das testen, weil es ein Problem sein könnte. Kein großer, da am Ende alle Seiten gerendert werden, aber wer weiß, welche Implikationen es geben könnte. –

1

Leute versuchen, diesen Code zu verwenden, um mit SQL Server 2008 R2 finden dass nur die erste Seite mit mehrseitigen Berichten gedruckt wird. Es gibt ein neues "Verhalten", bei dem das zu Streamids zurückgegebene Array leer ist. Bitte teilen Sie Microsoft wissen Sie sich interessieren hier:

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

Wir haben letztes Wochenende ein Upgrade auf SQL 2008 R2 durchgeführt und ich hatte diese Antwort bis jetzt nicht gesehen. Ich habe einen halben Tag damit verbracht, mir die Haare auszureißen, bevor ich ein wenig weiter gelesen habe. Später habe ich auch MS wissen lassen, dass es mich interessiert. –