Kein ArchiveEvent in der ViewerForm
Liebes Coresuite Team,
wie viele andere Nutzer bin auch ich daran interessiert, gedruckte Dokumente zu archivieren.
Dabei würde ich auch gerne die DocumentGUID abgreifen, die bei jedem einzelnen Druck neu vergeben wird. Das geht nur über das Document-Objekt. Das wird bei eurem ArchiveEvent glücklicherweise mit übergeben, was sehr hilfreich ist. Dadurch könnte man das Dokument sogar als XML statt als PDF exportieren und in einer manuellen ViewerForm wieder anzeigen, um dem Nutzer anzuzeigen, was vorher ausgegeben wurde – das habe ich schon erfolgreich umgesetzt.
Das Problem ist nur, dass dieses Event nicht zuverlässig über alle Möglichkeiten einer Beleg-Ausgabe hinweg feuert. Wenn ein Nutzer einen Beleg in der Vorschau öffnet, kann er (1) drucken, (2) per E-Mail versenden, (3) als PDF exportieren oder (4) den Bericht exportieren (diverse Optionen inkl. Bildern). Bis auf den Druck feuert keine dieser Funktionen das ArchiveEvent. Trotzdem kann der Nutzer das Dokument durch die PDF-Export Funktion oder per Mail exportieren, ohne dass man das Dokument archiviert hätte.

Die Optionen 2 und 3 kann man mit Berechtigungen deaktivieren, was ich jedoch eher einen Workaround als eine Lösung nennen würde. Es wäre toll, wenn das Event auch bei diesen Funktionen feuern würde. Das sollte für euch ja eigentlich keine große Herausforderung sein, das Document muss ja für das Rendern vorliegen.
Eine andere mögliche Option wäre es, das zweite ReportEvent (nach dem Rendern, isBefore false) um das Document-Objekt zu erweitern. So könnte man es dort abgreifen und ggf. den Prozess sogar noch synchron stoppen, wenn beim Archivieren ein Fehler auftritt.
Das alles finde ich deutlich angenehmer und einfacher als einen eigenen virtuellen Printer zu implementieren oder Ähnliches.
Gebt mir gerne andere Vorschläge, wenn ihr welche habt.
-
Ich würde das auch begrüßen.
Beim Email-Versand ist das auch so.

Man weiß nicht ob der User auf senden drückt oder abbricht.
Grüße Lothar
0 -
Ich habe noch einen Weg gefunden, der zumindest mich in meinem Ziel zufriedenstellen könnte und bei den bisherigen Tests zuverlässig funktioniert. Was natürlich nichts daran ändert, dass es toll wäre, wenn man entwicklerseitig ein wenig mehr in Events einhacken könnte.
Falls es jemanden interessiert:
Im GenerateScript des Layouts kann man mit ein wenig TryCast einen EventHandler an das “RenderCompleted” Event des im Hintergrund verwendeten InlineReportSlot von PerpetuumSoft hängen. Diesen EventHandler kann man im CommonScript des Layouts definieren und in diesem sogar vom InlineReportSlot auf den ReportManager zugreifen, wodurch man theoretisch sogar Zugriff auf sämtliche DataSources im EventHandler hat. Das ist ganz hilfreich, um z. B. die Flag für “Preview”, den PrintMode, den User etc. mitzuloggen.
Im Layout selbst kann man über
Engine.ProductionDocument.DocumentGuid.ToStringauf die DocumentGuid zugreifen. Auf anderem Wege habe ich nur abweichende, falsche Nummern erhalten.
GenerateScript:
If Engine.IsDoublePass Then Dim b1RenderSite As swissLD.Viewer.B1RenderSite = TryCast(Engine.Site, swissLD.Viewer.B1RenderSite) If b1RenderSite IsNot Nothing Then AddHandler b1RenderSite.Source.RenderCompleted, AddressOf Custom_OnRenderComplete End If Dim b1RenderSiteNoProgress As swissLD.Viewer.B1RenderSiteNoProgress = TryCast(Engine.Site, swissLD.Viewer.B1RenderSiteNoProgress) If b1RenderSiteNoProgress IsNot Nothing Then AddHandler b1RenderSiteNoProgress.Source.RenderCompleted, AddressOf Custom_OnRenderComplete End If Dim designerRenderSiteNoProgress As swissLD.Viewer.DesignerRenderSiteNoProgress = TryCast(Engine.Site, swissLD.Viewer.DesignerRenderSiteNoProgress) If designerRenderSiteNoProgress IsNot Nothing Then AddHandler designerRenderSiteNoProgress.Source.RenderCompleted, AddressOf Custom_OnRenderComplete End If End IfCommonScript:
'Platzhalter für den Export-Pfad der XML- und PDF-Dateien 'Dim exportPath As String = "C:\DeinTestOrdner" 'Hier einmal auf dem Desktop in einem "CoresuiteTest" Ordner Dim exportPath As String = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "CoresuiteTest") 'Hilfsfunktion für ein sicheres Auslesen der LD.Par DataSource Private Function GetParValue(row As System.Data.DataRow, columnName As String) As String If row Is Nothing Then Return "UNKNOWN" If Not row.Table.Columns.Contains(columnName) Then Return "UNKNOWN" End If If IsDBNull(row(columnName)) Then Return "UNKNOWN" End If Return row(columnName).ToString() End Function Private Sub Custom_OnRenderComplete(sender As Object, e As EventArgs) 'TryCast notwendig, da der EventHandler sender als Objekt erwartet Dim slot As PerpetuumSoft.Reporting.Components.InlineReportSlot = TryCast(sender, PerpetuumSoft.Reporting.Components.InlineReportSlot) If slot IsNot Nothing Then 'Der InlineReportSlot hat ein Property namens "Manager", hinter welchem der ReportManager mit Zugriff auf die DataSources steckt 'Ich greife hier auf die LD.Par DataSource zu, um Preview-Flag, PrintMode, UserId und StationId zu nutzen Dim dataTable As System.Data.DataTable = CType(slot.Manager.DataSources("LD.Par"), System.Data.DataTable) Dim dataRow As System.Data.DataRow = dataTable.Rows(0) 'Filtert alle Preview-Generierungen raus, die interessieren mich nicht. 'Sobald im Preview auf Drucken, PDF oder Export geklickt wird, wird ein neuer Render-Prozess angestoßen und dieser Param ist dort "N", es läuft also weiter im Gegensatz zum "ArchiveEvent" If GetParValue(dataRow, "Preview") = "Y" Then Return Dim printMode As String = GetParValue(dataRow, "PrintMode") Dim userId As String = GetParValue(dataRow, "UserId") Dim stationId As String = GetParValue(dataRow, "StationId") 'Der InlineReportSlot hat ein "Document" Property, hinter dem sich das gedruckte Dokument im SharpShooter-Format versteckt 'Dieses kennt seine DocumentGuid und kann mithilfe der PerpetuumSoft Methoden als PDF und XML exportiert werden. Dim doc As PerpetuumSoft.Reporting.DOM.Document = slot.Document 'Fallback, falls der exportPath noch nicht existiert IO.Directory.CreateDirectory(exportPath) 'XML-Export PerpetuumSoft.Framework.Serialization.XSerializationManager.Write(doc, String.Format("{0}\{1}_{2}_{3}_{4}.xml", exportPath, printMode, userId, stationId, doc.DocumentGuid.ToString)) 'PDF-Export Dim exportFilter As New PerpetuumSoft.Reporting.Export.Pdf.PdfExportFilter() exportFilter.Export(doc, String.Format("{0}\{1}_{2}_{3}_{4}.pdf", exportPath, printMode, userId, stationId, doc.DocumentGuid.ToString), false) End If End Sub0
Please sign in to leave a comment.
Comments
2 comments