Skip to main content

Kein ArchiveEvent in der ViewerForm

Comments

2 comments

  • Lothar Hasenkämper

    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
  • René Jakobs

    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.ToString auf 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 If

    CommonScript:

    '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 Sub
    0

Please sign in to leave a comment.