Direkt Print mit "ExternalImages"

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Direkt Print mit "ExternalImages"

    Hallo Zusammen,

    ich habe eine kurze Frage.

    Im ReportViewer wird mit Hilfe .EnableExternalImages ein externes Bild im Report angezeigt.

    VB.NET-Quellcode

    1. Me.ReportViewer1.LocalReport.EnableExternalImages = True


    Ausdruck im Report (wie im Beitrag ReportViewer-Tutorial für Anfänger @VB1963)
    ="file://C:/Users/.../Bild.png"

    Nun möchte ich den Report ohne Viewer automatisch drucken lassen.
    Ohne Bild funktioniert es prima. Mit Bild erhalte ich eine Fehlermeldung -->Fehlermeldung = Microsoft.Reporting.WinForms.LocalProcessingException {"Fehler bei der lokalen Berichtsverarbeitung."}

    VB.NET-Quellcode

    1. Dim rep As New LocalReport
    2. With rep
    3. .ReportEmbeddedResource = String.Concat("Programm.Report.rdlc")
    4. .DisplayName = "Linerbegleitschein"
    5. .SetParameters(New ReportParameter("Straße", "Straße 12"))
    6. [b].EnableExternalImages = True[/b]
    7. End With


    @VB1963 Ich hoffe, ich habe wieder keinen Tippfehler ;)

    Vielen Dank für eure Hilfe.

    Frostbeule
    Hallo,
    ich hänge mich hier mal mit dran, habe scheinbar ein ähnliches Problem.
    Ich habe mir das Beispiel von @VB1963 angeschaut und die darin enthalte DirectPrinting Classe in mein Projekt übernommen.
    Villeicht kurz zum Projekt. Hier geht es um Betriebliche Arbeitsanweisungen im Comic Stil.
    Eine Arbeitsanweisung besteht meist aus sehr vielen Seiten, mit noch mehr Text. Um die Produktionsmitarbeiter auf das nötigste zu konzentrieren, werden Arbeitsanweisungen im Comic Stil erstellt. (bisher in Excel).
    Ein Beispiel hab ich angehängt (OSI-Beispiel.pdf). In Zukunft soll dies über eine Eingabemaske gemacht werden, daher hab ich angefangen, dies in C# mit WinForms zu erstellen.
    Das Datenmodell dahinter sieh so aus:
    Bis auf 2 Sachen ist es auch soweit fertig.
    Beim Report, der in etwas so aussehen soll, wie das angehängte Beispiel, kanllt es leider jedesmal wenn SaveAs() aufgerufen wird.
    Ich weis nicht, obe es vielleicht daran liegt das ich die Bilder, jedesmal in Byte[] und wieder zurück konvertiere, damit sie in der PictureBox angezeigt und ins Dataset gespeichert werden können.
    Das Projekt hänge ich hier mal an, vielleicht bekommen wir ja so das Problem gelöst.

    Vielen Dank

    EDIT: Durch Haltepunkte hab ich folgende Fehlermeldung feststellen können: lblPrintResult.Text = "Report-Error! : System.ApplicationException: Die Berichtsdefinition des Berichts \"ComicSteps\" wurde nicht angegeben. ---> System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.\r\n bei Microsoft.ReportingService...
    Dateien
    "Hier könnte Ihre Werbung stehen..."

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

    MichaHo schrieb:

    Die Berichtsdefinition des Berichts \"ComicSteps\" wurde nicht angegeben.
    Dein Projektname OSI.Gui enthält einen Punkt und das verträgt sich leider nicht mit dem Report und seiner Datenanbindung und kann's daher nicht finden... (siehe hier)

    C#-Quellcode

    1. rep.ReportEmbeddedResource = "OSI.GUI.ComicSteps.rdlc";


    PS: ich kann dein Projekt leider nicht kompilieren? (es fehlen Verweise...)
    Hallo @VB1963 ich hab das Projekt mal neu benannt (SolutionExplorer vom @ErfinderDesRades sei Dank).
    Leider hab ich irgendwo noch nen Fehler drin...
    Was mich auch stutzig macht ist diese Methode aus Deiner DirectPrinting Klasse hier:

    C#-Quellcode

    1. private void SaveReport(int Counter = 0, byte[] Picture = null)
    2. {
    3. var myPath = string.Empty;
    4. if (Counter == 0 && !myExtensions.Any(d => d.Value == "Image"))
    5. myPath = myFile.FullName;
    6. else
    7. myPath = string.Concat(myFile.DirectoryName, '\\', string.Concat(myFile.Name.Replace(myFile.Extension, string.Empty), " (", Counter, ')', myFile.Extension));
    8. using (var fs = new FileStream(myPath, FileMode.Create))
    9. {
    10. byte[] Bytes = null;
    11. if (Picture == null)
    12. {
    13. try
    14. {
    15. Bytes = myReport.Render(myExtensions.First((d) => d.Key == myFileExtension).Value); // Format angeben
    16. }
    17. catch (MissingReportSourceException ex)
    18. {
    19. myResponse = string.Concat("Report-Error! : ", ex.Message);
    20. }
    21. catch (LocalProcessingException ex)
    22. {
    23. myResponse = string.Concat("Report-Error! : ", ex.InnerException.Message);
    24. }
    25. catch (Exception ex)
    26. {
    27. myResponse = string.Concat("Report-Error! : ", ex.Message);
    28. }
    29. }
    30. else
    31. Bytes = Picture;
    32. if (Bytes.Length != 0)
    33. {
    34. fs.Write(Bytes, 0, Bytes.Length);
    35. fs.Flush();
    36. }
    37. else
    38. {
    39. SystemSounds.Hand.Play();
    40. fs.Close();
    41. System.IO.File.Delete(myPath); // Datei der Länge 0 wieder löschen
    42. }
    43. }
    44. }

    Die Variable Picture ist immer null, wenn Sie null ist, weist Du der Variable Bytes das Format hinzu. Später überschreibst Du dies aber wieder mit Bytes = Picture also ist Bytes dann wieder null und es gibt eine Exeption.
    Wenn ich diese Zuweisung auskommentiere, dann läuft der Code durch, schmeißt aber einen leeren Bericht raus, der mit Adobe nicht geöffnet werden kann.

    Ich hab im Projekt nun alle Dll. mit hinzugefügt (Reporting, nUpdate usw.) im Ordner Libraries...
    Beim Erstellen habe ich nachher zig Dlls mit denen ich nix anfangen kann und ich frag mich, wo die alle her kommen???
    Im Ordner Database habe ich eine dbFile.osi hinzugefügt, die enthält eine gekürzte Beispiel Instruction. (die muss im Anwendungsordner in den Ordner Database)

    Das 2. Problem ist für mich sehr kniffelig.
    Es kann vorkommen, das eine Arbeitsanweisung fertig ist, die Mitarbeiter aber dann feststellen das zwischen 2 Hauptschritten oder auch zwischen 2 Unterschritten, ein Schritt fehlt, der muss dann dazwischen eingefügt werden und die StepNummern der nachfolgenden Schritte erhöht sich dann entsprechend.
    Beispiel: es gibt 1 Hauptschritt, der hat 3 Unterschritte... jetzt müsste zwischen schritt 2 und 3 ein Schritt hinzugefügt werden, somit wäre der neue Schritt der 3. und der ehemals 3. Schritt wäre dann der 4.
    Da hänge ich seit Montag dran rum...

    Vielleicht hat jemand ne Idee dazu...
    Danke Euch
    Dateien
    • MN.OSI00.zip

      (5,54 MB, 79 mal heruntergeladen, zuletzt: )
    "Hier könnte Ihre Werbung stehen..."

    MichaHo schrieb:

    Leider hab ich irgendwo noch nen Fehler drin...

    Zuerst habe ich den Verweis auf Microsoft.SqlServer.Types.dll setzen müssen...
    "Report-Error! : Microsoft.Reporting.DefinitionInvalidException: The definition of the report '' is invalid. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: An unexpected error occurred in Report Processing. ---> System.IO.FileNotFoundException: Die Datei oder Assembly \"Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91\" oder eine Abhängigkeit davon wurde nicht gefunden. Das System kann die angegebene Datei nicht finden."

    Dann habe ich folgende Formel aus der Textbox (Seitenpageanzeiger) entfernt:

    Report-Error! : Microsoft.Reporting.DefinitionInvalidException: The definition of the report '' is invalid. ---> Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: The Value expression for the textrun ‘Textbox25.Paragraphs[0].TextRuns[1]’ refers to the global variable PageNumber or TotalPages. These global variables can be used only in the page header and page footer.

    Dann ist mir aufgefallen, dass einige Textboxen im Bericht nicht auf den Formeleditor zugreifen lassen?

    Die Bildinformationen der Bilder können nicht im Report angezeigt werden!
    Warning: The Value expression for the image ‘Image1’ uses an aggregate function with an expression that returned a data type not valid for the aggregate function. (rsAggregateOfInvalidExpressionDataType) Warning: The value of the ImageData property for the image ‘Image1’ is “=First(Fields!MainStepImage.Value, "dsComic")”, which is not a valid ImageData. (rsInvalidDatabaseImageProperty) Warning: The Value expression for the image ‘Image2’ uses an aggregate function with an expression that returned a data type not valid for the aggregate function. (rsAggregateOfInvalidExpressionDataType) Warning: The value of the ImageData property for the image ‘Image2’ is “=First(Fields!ChildStepImage.Value, "dsComic")”, which is not a valid ImageData. (rsInvalidDatabaseImageProperty)

    Dein Report ist leider korrupt...

    Das mit den vielen .dll's kommt nur im Debug-Ordner zum Vorschein... 8|
    Beim Release-Ordner ist's nicht so...

    Ich habe dir eine Demo in C# angehängt, wo die Klasse DirectPrinting.cs (gleiche, wie immer) mit Images funktioniert... (hatte angenommen, dass mir da beim Übersetzen ein Fehlerchen unterlaufen ist...)
    Diese Solution ist sehr rudimentär gehalten, daher kann man auch das Wesentliche leichter herauslesen...

    Guck dir die Solution einmal an - ich glaube fast, du musst dein Projekt nochmals neu aufsetzen und deinen Report neu überarbeiten...

    lg VB1963
    Dateien

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

    Hi @VB1963 Danke Dir erstmal für Deine Geduld...
    Ich schau mir Deine Solution am WE an.
    Ich hab ja damals auch schon den Reportviewer benutzt um bei dem Brillenprogramm für meine Frau einen Report raus zu lassen, das klappte mit deiner Anleitung hervorragend. Aber hier fängt es echt an zu nerven...
    Ich verstehe auch nicht wieso Microsoft da nicht irgendwas einfaches erfinden kann um PDF Berichte zu erstellen und abzuspeichern... furchtbar...
    was ich aber beim Lesen deiner Nachricht gerade gesehen habe ist, das ich total übersehen habe, das ein Bericht ja immer Header und Footer hat, die hab ich total außer Acht gelassen...
    Ich werd das Projekt nochmal neu erstellen und diesmal den Reportviewer wieder über nuget installieren, ist glaub einfacher...
    "Hier könnte Ihre Werbung stehen..."