ReportViewer VB.Net 2017

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    ReportViewer VB.Net 2017

    Hallo liebe Community,

    ich sitze aktuell vor einem Problem und konnte weder durch dieses Forum noch durch Google mir selbst eine Antwort darauf geben.

    Sachverhalt:
    Aus einer Datenbank werden via OleDb Datensätze in ein Listview geladen. Der Anwender kann im Listview eine mehrfach Auswahl der Datensätze vornehmen und über einen Menüpunkt einen Druckbefehl geben. Darauf hin werden die Datensätze via For Each Schleife in eine List(of Strings) gespeichert. Es werden dann mit einer weiteren For-Each-Schleife die Daten aus der DB geholt und in Variablen gespeichert. Diese werden dann in in den Bericht übergeben. Der Bericht ist eine Art Karteikarte ähnlich wie in einer Bücherei. Heißt jeder Datensatz soll eig. auf einer eigenen Karteikarte im BerichtViewer zum ausdrucken erscheinen. Bei nur einem Datensatz funktioniert das ganze ohne Probleme. Sobald ich nun mehre Auswähle wird im BerichtViewer nur der letzte Datensatz angezeigt und zum Drucken bereit gestellt.

    Code:

    VB.NET-Quellcode

    1. Private Sub KarteikartenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KarteikartenToolStripMenuItem.Click
    2. '-- Drucken der Auswahl aus Listview als Karteikarte -- Arry -> Dataset -> Bericht
    3. '-- Kürzen der Felder auf 300 Zeichen und anfügen von "..."
    4. Dim itmx As ListViewItem 'Dient der Multiauswahl und des Druckens mehrerer Datensätze
    5. Dim DatensatzKarteiKarte As New List(Of String)
    6. For Each itmx In lsv1.SelectedItems
    7. DatensatzKarteiKarte.Add(itmx.SubItems(0).Text)
    8. Next
    9. For Each Datensatz As String In DatensatzKarteiKarte
    10. Dim dt As New DataSetBericht
    11. Dim da As OleDbDataAdapter
    12. Dim bs As New BindingSource
    13. da = New OleDbDataAdapter("SELECT * from Pyramiden WHERE NR='" & Datensatz & "'", dbconnection)
    14. da.Fill(dt, "Pyramiden")
    15. Dim Lokalisierung As String = dt.Tables("Pyramiden").Rows(0).Item("LOKALISIERUNG").ToString
    16. Dim Literatur As String = dt.Tables("Pyramiden").Rows(0).Item("LITERATUR").ToString
    17. Dim Bemerkung As String = dt.Tables("Pyramiden").Rows(0).Item("BEMERKUNG").ToString
    18. Dim Bauherr As String = dt.Tables("Pyramiden").Rows(0).Item("BAUHERR").ToString
    19. Dim Architekt As String = dt.Tables("Pyramiden").Rows(0).Item("ARCHITEKT").ToString
    20. Dim Ort As String = dt.Tables("Pyramiden").Rows(0).Item("ORT").ToString
    21. Dim Objekt As String = dt.Tables("Pyramiden").Rows(0).Item("OBJEKT").ToString
    22. If Bemerkung.Length > 500 Then
    23. Bemerkung = Bemerkung.Substring(0, 500) & "..."
    24. End If
    25. If Bauherr.Length > 500 Then
    26. Bauherr = Bauherr.Substring(0, 500) & "..."
    27. End If
    28. If Objekt.Length > 500 Then
    29. Objekt = Objekt.Substring(0, 500) & "..."
    30. End If
    31. If Architekt.Length > 500 Then
    32. Architekt = Architekt.Substring(0, 500) & "..."
    33. End If
    34. If Ort.Length > 500 Then
    35. Ort = Ort.Substring(0, 500) & "..."
    36. End If
    37. If Lokalisierung.Length > 500 Then
    38. Lokalisierung = Lokalisierung.Substring(0, 500) & "..."
    39. End If
    40. Dim Nr As New ReportParameter("Nr", dt.Tables("Pyramiden").Rows(0).Item("NR").ToString)
    41. Dim Objektshort As New ReportParameter("Objekt", Objekt.ToString)
    42. Dim Ortshort As New ReportParameter("Ort", Ort.ToString)
    43. Dim LokalisierungShort As New ReportParameter("Lokalisierung", Lokalisierung.ToString)
    44. Dim BemerkungShort As New ReportParameter("Bemerkung", Bemerkung.ToString)
    45. Dim LiteraturShort As New ReportParameter("Literatur", Literatur.ToString)
    46. Dim Typ As New ReportParameter("Typ", dt.Tables("Pyramiden").Rows(0).Item("TYP").ToString)
    47. Dim Bild As New ReportParameter("Bild", dt.Tables("Pyramiden").Rows(0).Item("BILD").ToString)
    48. Dim Fremdnutzung As New ReportParameter("Fremdnutzung", dt.Tables("Pyramiden").Rows(0).Item("FREMDNUTZUNG").ToString)
    49. Dim Grab As New ReportParameter("Grab", dt.Tables("Pyramiden").Rows(0).Item("GRAB").ToString)
    50. Dim Sarkophag As New ReportParameter("Sarkophag", dt.Tables("Pyramiden").Rows(0).Item("SARKOPHAG").ToString)
    51. Dim Freimaurer As New ReportParameter("Freimaurer", dt.Tables("Pyramiden").Rows(0).Item("FREIMAURER").ToString)
    52. Dim Dia As New ReportParameter("Dia", dt.Tables("Pyramiden").Rows(0).Item("DIA").ToString)
    53. Dim Erhalten As New ReportParameter("Erhalten", dt.Tables("Pyramiden").Rows(0).Item("ERHALTEN").ToString)
    54. Dim Höhe As New ReportParameter("Höhe", dt.Tables("Pyramiden").Rows(0).Item("HÖHE").ToString)
    55. Dim Breite As New ReportParameter("Breite", dt.Tables("Pyramiden").Rows(0).Item("BREITE").ToString)
    56. Dim Länge As New ReportParameter("Länge", dt.Tables("Pyramiden").Rows(0).Item("LÄNGE").ToString)
    57. Dim Memokurz As New ReportParameter("Memokurz", dt.Tables("Pyramiden").Rows(0).Item("MEMOKURZ").ToString)
    58. Dim Maß As New ReportParameter("Maß", dt.Tables("Pyramiden").Rows(0).Item("MAß").ToString)
    59. Dim Neigung As New ReportParameter("Neigung", dt.Tables("Pyramiden").Rows(0).Item("NEIGUNG").ToString)
    60. Dim Jahr As New ReportParameter("Jahr", dt.Tables("Pyramiden").Rows(0).Item("JAHR").ToString)
    61. Dim Bauherrshort As New ReportParameter("Bauherr", Bauherr.ToString)
    62. Dim Architektshort As New ReportParameter("Architekt", Architekt.ToString)
    63. Dim Memo As New ReportParameter("Memo", dt.Tables("Pyramiden").Rows(0).Item("MEMO").ToString)
    64. Dim Plan As New ReportParameter("Plan", dt.Tables("Pyramiden").Rows(0).Item("PLAN").ToString)
    65. Try
    66. Berichttest.rpviewer.Reset()
    67. Berichttest.rpviewer.ProcessingMode = ProcessingMode.Local
    68. With Berichttest.rpviewer
    69. .LocalReport.ReportPath = "Karteikarte.rdlc"
    70. .LocalReport.SetParameters(New ReportParameter() {Nr, Objektshort, Ortshort, LokalisierungShort, BemerkungShort, LiteraturShort, Typ, Bild, Fremdnutzung, Grab, Sarkophag, Freimaurer, Dia, Erhalten, Höhe, Breite, Länge, Memokurz, Maß, Neigung, Jahr, Bauherrshort, Architektshort, Memo}) ' Parameterübergabe
    71. .RefreshReport()
    72. End With
    73. Catch ex As Exception
    74. ErrorToString()
    75. End Try
    76. Next
    77. Berichttest.Show()


    Problem:
    Wie bekomme ich es hin, das die "Berichts-Ausgabe" zwischengespeichert wird dann der nächste als neue DIN4 Seite an die vorherige Seite angefügt wird? Bei der Beantwortung der Frage möchte ich primär keinen fertigen Code sondern nur Hinweise, mit welcher Funktion ich das ganze umgesetzt bekomme. Gewollt ist, dass jeweils der Bericht in der For-Each-Schleife ausgegeben wird und dann der nächste als neue Seite angefügt wird. Und am Ende der gesamte Bericht angezeigt wird.

    Zusatz:
    Ich bin selbst nur ein sehr seltener Hobbyprogrammier und besitze warscheinlich nicht die beste Art sauberen Code zu schreiben. Also bitte unterlasst solche Kommentare außer sie dienen der Lösung. Weshalb ich OleDB als Verbindung gewählt habe, ich konnte bisher noch nicht mehr. Der Try-Catch-Block dient nur zu Testzwecken während ich das Programm schreibe, heißt er wird noch entfernt.

    Mit freundlichen Grüßen

    Manestrum
    Willkommen im Forum.
    Ich hab zwar (immer noch) nix mit dem ReportViewer (shame on me, @VB1963) gemacht, aber mit Zeile#83 löschst Du doch immer wieder den Report und wiederbeschreibst die einzelnen Formularfelder in Zeile#88. Und in der nächsten Schleife wieder. Wo wird denn da zwischendurch mal n Druckbefehl abgeschickt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hey VaporiZed,

    gewollt ist das löschen und wieder beschreiben der Parameter, da der Bericht selbst nur eine Seite ist mit unterschiedlichen Feldern (kein Tablix, Tabelle etc).

    Ursprünglich nahm ich wohl an, dass der ReportViewer bei einer Schleife automatisch die Seiten zusammenfügt. (Bericht wird halt mehrfach ausgeführt)

    Ich gebe dir damit Recht, dass der Druckbefehl fehlt. Jedoch sollte der Druckbefehl nicht den Drucker ansprechen sondern "intern" das Ergebnis speichern und am Ende soll alles dem User angezeigt werden.

    Liebe Grüße
    ,Ursprünglich nahm ich wohl an, dass der ReportViewer bei einer Schleife automatisch die Seiten zusammenfügt. (Bericht wird halt mehrfach ausgeführt)'
    Das was du da suchst, ist ein direktes Drucken ohne ReportViewerControl...
    Anbei zwei Verweise meines Tutorials, die du dazu benötigen wirst:
    vb-paradise.de/index.php/Thread/?postID=835049#post835049
    ReportViewer-Tutorial für Anfänger

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Danke für deine Antwort. :) Und für dein ausführliches Tutorial, es hat mir vorher schon sehr viel Arbeit abgenommen als ich mit anderen Berichten zu kämpfen hatte im selben Projekt. ;) Einziger Nachteil war, man kann in VS 2017 die Beispielprogramme nicht öffnen. :P

    Das Drucken ohne ReportViewerControl ist eventuell später mal vorgesehen. Hier aber erfüllt es glaube ich nicht den Zweck. (jedenfalls wenn ich es richtig verstanden habe oder ich bin gedanklich gerade voll neben der Spur. :D)

    Jedenfalls verstehe ich nicht genau, wie ich mit Directprint das ganze so gelöst bekomme, dass jeder Datensatz "gedruckt" wird (Report in nem Array speichern oder ähnliches?) und ich am Ende den gesamten Bericht im ReportViewerControl sehen kann. Ich komme nicht darauf, wie ich den Report am Ende der Schleife speicher ( ohne Datei auf dem Rechner) und diese am Ende vor dem .Show zusammenfügen kann.

    User wählt 3 Datensätze aus dem Listview aus und geht auf Drucken. Ergebnis soll sein, dass ich im BerichtViewerControl (um das manuelle drucken aktiviert zu lassen) 3 Seiten sehe. Pro Datensatz eine DIN A4 Seite habe.

    Liebe Grüße :)
    Verstehe ich dich da jetzt richtig:
    Du willst im Viewer deine einzelnen A4-Seiten sehen oder auf Papier?
    Ohne Viewer geht's mit DirectPrinting...
    Da brauchst du deine Daten einfach über Parameter per Schleife übergeben und die Daten auf einem A4-Seiten-Report ausgeben und den DirectPrint je Schleifendurchgang anstoßen...
    Sonst musst du die Daten per BindingSource filtern und dem Report in eine Liste übergeben und dann über den Viewer den Druckvorgang auslösen...

    Was spuckt dir VS17 bei meinen Beispielprojekten für einen Fehler aus?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Ja du hast es gerade richtig verstanden.

    Das es mit DirectPrint geht ist mir bewusst, da ich den Druckbefehl einfach in die Schleife baue und fertig.

    Mein Problem besteht aber darin, den Bericht mehrfach zu durch laufen und am Ende das Ergebnis in einem einzigem ReportViewer auszugeben.
    Es gibt keine Fehlermeldung, da ich ja leider nicht mal einen Ansatz gefunden habe bei dem ich hätte anfangen können. Oben geposteter Code funktioniert, ob nun mehrer Datensätze ausgewählt worden sind oder nur einer.

    BindingSource ist auch keine Lösung, denn das Filtern der Daten bzw. übergeben in Parametern klappt ja. Der normale Weg ist ja: "User drückt Button, Daten werden an den Bericht übergeben, Bericht wird gerendert und im ReportViewerControl angezeigt." - bei einem Datensatz // bei z.:B 3 ausgewählten Datensätzen durch läuft er diesen Weg 3x und zeigt mir am Ende im RVC nur den letzten Datensatz an. Heißt zum Ausdrucken steht mir eine DIN A4 Seite zur Verfügung.

    Ich brauche es aber so: "User drückt Button, Daten werden an den Bericht übergeben, Bericht wird gerendert als "fertige Aussagabe" in einer Varialbe oder ähnliches gespeichert und wieder von vorne. Bleiben wir im o.g. Beispiel. Das ganze wird 3x durch laufen und am Ende der Schleife (also wenn sie durch ist) soll der RVC erst dem User angezeigt werden, also nicht vorher. Und im RVC sollen dann 3 DIN A4 Seiten zum Ausdrucken sichtbar sein.

    Mein Problem liegt im speichern des gerenderten Berichts und dann das zusammenfügen dieser einzelnen Berichte.

    Drücke mich vielleicht auch etwas dumm aus. :/ Hänge mal den RDLC in den Anhang.

    Ich werde es im laufe des Tages mal umsetzen und ausprobieren, ich denke aber es klingt gut nach der Lösung die ich gesucht habe. :)
    Wäre auf Liste niemals selber gekommen. :D *kopfschüttel*

    Danke. :)


    Nachtrag: Habe das Problem jetzt gelöst, indem ich den Code umgeschrieben habe.

    VB.NET-Quellcode

    1. ​Try
    2. Berichttest.DataSetBericht.Pyramiden.Clear()
    3. dbconnection = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbconnection_class.pfad() & "")
    4. For Each SelItem As ListViewItem In lsv1.SelectedItems
    5. Dim Nr As String = SelItem.SubItems(0).Text
    6. MsgBox(Nr)
    7. Dim dt As New DataSetBericht
    8. Dim da As OleDbDataAdapter
    9. Dim bs As New BindingSource
    10. da = New OleDbDataAdapter("SELECT * from Pyramiden WHERE NR='" & Nr & "'", dbconnection)
    11. da.Fill(Berichttest.DataSetBericht, "Pyramiden")
    12. Next
    13. Catch ex As ConstraintException
    14. Dim rowErrors = Bericht.DataSetBericht.Pyramiden.GetErrors()
    15. System.Diagnostics.Debug.WriteLine("YourDataTable Errors:" & rowErrors.Length)
    16. For i = 0 To rowErrors.Length - 1
    17. For Each col As DataColumn In rowErrors(i).GetColumnsInError()
    18. System.Diagnostics.Debug.WriteLine(col.ColumnName & ":" & rowErrors(i).GetColumnError(col))
    19. Next
    20. Next
    21. End Try
    22. bindReportBerichtTest("DataSetBericht", Berichttest.PyramidenBindingSource, "Karteikarte")
    23. Berichttest.Show()


    Habe also dem ganzen ein DataSet zugeordnet und dieses speichert nun sauber alles was ich benötige. Im RDLC-File habe ich eine Liste hinzugefügt und in die Liste meinen vorherigen Bericht eingefügt.

    Der Nachtrag dient dazu, diesen Beitrag vollständig zu beenden und zu schließen.

    Danke an alle dir mir geholfen haben. :)

    Grüße Manestrum

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manestrum“ ()