Announcement

Collapse
No announcement yet.

Mehrfachaufruf Form mit Crystal Report

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrfachaufruf Form mit Crystal Report

    Hallo alle zusammen
    Umgebung:
    VS2010
    Crystal Reports für .NET Framework 4.0
    .Net - VB

    Problem:
    Um die Seitenzahl von generierten Berichten zu ermitteln, wird für diese Berichte über eine Schleife jeweils eine Vorschau erstellt.
    Code:
    'Ausschnitt ...
    
    for Each rw As DataRow In dt.Rows
    	'übergabe variable..
    
    	Dim f As New prnpruefdokumente
    	f.ShowDialog()
    	f.Dispose()
    
    next
    ..
    
    
    
    Private Sub prnpruefdokumente_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    ..
    
    	Me.cr_pruefdokumente.ReportSource = New Pruefanweisung_1
    	Me.cr_pruefdokumente.ReportSource.SetDataSource(dt)
    
    ..
    	Me.cr_pruefdokumente.ShowLastPage()
    	Dim anz_page As Long
    	anz_page = Me.cr_pruefdokumente.GetCurrentPageNumber
    
    End Sub
    Das funktioniert genau 76 mal und dann kommt die Fehlermeldung, dass der Bericht nicht geladen werden kann. Der Abbruch kommt dann (nach Debug..) genau mit Zuweisung
    Code:
    	Me.cr_pruefdokumente.ReportSource = New Pruefanweisung_1
    Dabei ist Pruefanweisung_1 ein in Crystal Reports erstellter Bericht.
    Anschließend kann ich gar keinen Bericht mehr anzeigen und der Fehler ist immer der gleiche. Keine Ahnung wo ich noch was zurücksetzen kann. Der Arbeitsspeicher sieht sauber aus. Erst nach dem schließen der Applikation und dem Neustart, kann der Bericht wieder angezeigt werden. Starte ich aber meine 'Massenvorschau' zur Seitenermittlung, laufe ich wieder in den Fehler.

    Habt Ihr einen Hinweis für mich?

    Vielen Dank vorab

  • #2
    ... Fehlermeldung, dass der Bericht nicht geladen werden kann ...
    Da hängen doch sicherlich mehr Informationen dran. Also ein Exception mit weiteren Innerexceptions die man durchforsten kann nach mehr Details zur Ursache.

    Comment


    • #3
      Hallo Ralf Jansen,

      Natürlich hängt eine Exception dran und noch eine Menge anderer Code z.B. zum laden einer datatable als Datasource. Leider ist der angesagte Fehler erstmal die Fehlermessage der Exception.
      Aber die Innerexception scheint einen Hinweis zu geben.

      System.Runtime.InteropServices.COMException (0x80000000): Die von Ihrem Systemadministrator festgelegte Höchstanzahl von Berichtverarbeitungsaufträgen wurde erreicht.
      bei CrystalDecisions.ReportAppServer.ClientDoc.ReportC lientDocumentClass.Open(Object& DocumentPath, Int32 Options)
      bei CrystalDecisions.ReportAppServer.ReportClientDocum entWrapper.Open(Object& DocumentPath, Int32 Options)
      bei CrystalDecisions.ReportAppServer.ReportClientDocum entWrapper.EnsureDocumentIsOpened()


      Stellt sich nur die Frage, wo man diese Höchstzahl an Berichtsverarbeitungsaufträgen modifizieren kann.
      Vielleicht weiß das ja jemand oder ich finde was dazu. Ersmal danke..

      Comment


      • #4
        Willst du tatsächlich mehr als die angesprochenen 76 Berichte gleichzeitig offen haben? Ich würde sagen wenn die jetzige Grenze bei 76 liegt ist die für eine sinnvolle Benutzung mehr als hoch genug.

        Comment


        • #5
          Nein ich möchte nicht mehr als 76 Berichte gleichzeitig öffnen. Ich möchte Sie vielmehr nacheinander öffnen - eben durchlaufen (
          öffnen -Seitenzahl ermitteln - schließen - nächster Bericht).

          Aber offensichtlich zieht das Dispose() nicht. Oder ich wende es falsch an. Dadurch denkt mein System wohl, die Berichte sind offen.

          Beim schließen des Fensters wende ich dispose jedoch auf das Crystal - Objekt an.
          Me.cr_pruefdokumente.Dispose()

          Comment


          • #6
            Von welchem Dispose() sprichst du? Ich hoffe du hast eins für das Object das du der ReportSource zuweist.

            Comment


            • #7
              Ja, habe ich.

              Code:
              Me.cr_pruefdokumente.Dispose()
              Wird beim schließen des Reportfensters durchlaufen, scheint aber nicht wirksam zu sein.

              Comment


              • #8
                Nein eigentlich rede ich von 'New Pruefanweisung_1'. Der Code und damit dieses Object wird doch wahrscheinlich mehrmals durchlaufen und damit mehrmals erzeugt, oder ?
                Ich würde vor dem Zuweisen eines neuen Pruefanweisung_1 Objects das alte das noch an der ReportSource Property hängt disposen. Wobei ich mich frage wofür du überhaupt mehrmals Pruefanweisung_1 erzeugst. Aber ich kenne Crystal Reports (und deinen Code) nicht wirklich um mir da ein echtes Urteil zu erlauben.

                Comment


                • #9
                  Hallo,

                  ich muss die Mehrfacherzeugung zulassen, weil je nach Parameter unterschiedliche Formulartypen auftreten können. Das kann ständig wechseln.

                  Aber nochmal zurück.
                  Siehe erster Codeausschnitt

                  Code:
                  Private Sub prnpruefdokumente_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
                  
                  ..
                  
                  	Me.cr_pruefdokumente.ReportSource = New Pruefanweisung_1
                  	Me.cr_pruefdokumente.ReportSource.SetDataSource(dt)
                  
                  ..
                  	Me.cr_pruefdokumente.ShowLastPage()
                  	Dim anz_page As Long
                  	anz_page = Me.cr_pruefdokumente.GetCurrentPageNumber
                  
                  End
                  'Und mit dem Schließen der Vorschau

                  Code:
                  Private Sub prnpruefdokumente_Activated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Activated
                          If cancelForm = 1 Then
                              Me.cr_pruefdokumente.ReportSource = Nothing
                  
                              Me.cr_pruefdokumente.Dispose()
                              Me.Close()
                          End If
                   End Sub
                  Sollte das nicht reichen?
                  Muss jetzt erstmal zum Kunden. Melde mich später nochmal..

                  Comment


                  • #10
                    Ich würde vor dem hier

                    Me.cr_pruefdokumente.ReportSource = Nothing
                    auf ReportSource auch explizit ein Dispose aufrufen wenn ReportSource nicht Nothing ist.

                    Comment


                    • #11
                      Das Ende vom Lied

                      Code:
                        If cancelForm = 1 Then
                                  Me.cr_pruefdokumente.ReportSource.dispose()
                                  Me.cr_pruefdokumente.Dispose()
                                  Me.Close()
                        End If
                      und alles ist gut.

                      Vielen Dank, Blinden muß eben geholfen werden.

                      Comment


                      • #12
                        Das Ende vom Lied,

                        Code:
                          If cancelForm = 1 Then
                                    Me.cr_pruefdokumente.ReportSource.dispose()
                                    Me.cr_pruefdokumente.Dispose()
                                    Me.Close()
                           End If
                        Blinden muß eben geholfen werden.
                        Vielen Dank!

                        Comment

                        Working...
                        X