2009-03-25 6 views
10

J'ai un SQL Server 2005 Reporting Services ServerReport déployé et fréquemment utilisé par mon application Winforms (Framework 2.0) via le contrôle ReportViewer.Impression de ServerReport sans aperçu

Ce dont j'ai besoin est de fournir un bouton d'impression en un clic à partir de l'une des formes de l'application qui déclenche uniquement la boîte de dialogue d'impression, sans afficher le ReportViewer.

J'ai expérimenté avec le rendu du rapport à un tableau d'octets, mais je ne peux pas passer cela.

Ce rapport comporte plusieurs pages, donc je ne sais pas si le rendu "Image" qui fonctionne pour les rapports locaux fonctionnera également pour les rapports de serveur.

J'ai cherché un jet MSDN, mais il n'y a qu'une référence aux rapports locaux:

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

Et le peu d'informations que je peux obtenir des rapports côté serveur utilisent des références Web au service Web ReportServer et je ne le veux pas.

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

Est-il possible d'imprimer un rapport de serveur, en utilisant la boîte de dialogue d'impression, sans montrer le spectateur de rapport à l'utilisateur (je ne me dérange pas si elle est dans les coulisses)?

Répondre

11

Ok, enfin compris.

vérifier ce lien: Printing Reporting Services 2005 Reports

Ce billet de blog a presque tout ce que je avais besoin, mais je vais poster la réponse complète ici des références. J'ai fini par utiliser l'objet visualiseur de rapport dans les coulisses, mais seulement pour plus de commodité, car ce n'est pas nécessaire.

La première étape demande à l'utilisateur les paramètres de l'imprimante:

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 

Ayant, nous procédons à configurer notre appel de rapport: La modification de cette chaîne, vous pouvez obtenir d'imprimer sur tout format de papier et tout orientation (changer la hauteur et la largeur pour le paysage), mais le rapport lui-même doit être configuré dans la même mise en page.

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

Enfin, nous rendons le rapport avec toutes ses pages.

Notez que si le rapport n'a qu'une seule page, la méthode renderStream n'est jamais utilisée. Rpt_control est le contrôle du visualiseur de rapports, précédemment configuré et visant un rapport de serveur. Notez que dans ce code, nous ajoutons des pages à une liste.

Cette liste est une variable globale, car elle est nécessaire dans la méthode 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() 

Jusqu'à présent, nous n'avons pas fait l'impression du tout, cela est en fait manipulé par la méthode PrintPageHandler que nous dit plus tôt.

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

Le code ici m'a aidé à sortir d'une ornière que j'étais dans essayer d'établir une impression en lots de SSRS. Alors bravo à toi. Oui, je sais que le temps s'est écoulé depuis que vous avez posté ceci! –

0

Je vois cet exemple, mais je ne sais pas si elle répond à vos besoins: http://www.gotreportviewer.com/EMFPrint.zip

+0

Oui, c'était à peu près le premier indice que je suis arrivé, mais notez que cet exemple est pour les rapports locaux, pas de rapports à distance. Dans les rapports de serveur, il n'y a pas de rappel pour la création de pages et c'était mon problème, en triant comment envoyer toutes les pages. –

1

2 mises en garde à la réponse donnée par David ci-dessus: -

1) L'ordre dans lequel les flux d'étiquettes sont retournées sur SQL2005 est habituellement de la deuxième à la dernière page, mais sur un très chargé maching (par exemple environnement de production) il est tout à fait possible pour eux d'être retourné dans l'ordre arbitraire. Les identifiants de flux prennent la forme < nom_rapport> _nn où nn est un nombre. Cela rend un peu difficile à trier puisque le nom du rapport sera alphabétique et que les nombres sont simplement courts, donc la page "myreport_2" va trier après la page "myreport_10". Menant à ma deuxième mise en garde

2) Sur SQL 2005, le rapport suffixes à partir de 2, sur SQL 2008, ils commencent à 1 (pour la page 2)

+0

oh, merci pour cette idée. Jusqu'à présent, je n'ai pas vu une situation où les flux sont venus dans l'ordre arbitraire ... mais je vais tester cela parce que cela pourrait être un problème. Pas grand, puisque toutes les pages seront rendues à la fin, mais qui sait quelles implications il pourrait y avoir. –

1

Les gens essaient d'utiliser ce code avec SQL Server 2008 R2 trouverez qu'il imprime uniquement la première page des rapports de plusieurs pages. Il y a un nouveau "comportement" dans lequel le tableau retourné à streamids est vide. S'il vous plaît laissez Microsoft vous vous souciez ici:

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

Nous venons de faire une mise à niveau vers SQL 2008 R2 le week-end dernier et je n'avais pas vu cette réponse jusqu'à maintenant. J'ai passé une demi-journée à m'arracher les cheveux avant de lire un peu plus loin. Par la suite, moi aussi j'ai laissé savoir à MS que je m'en soucie. –