Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bericht

Begonnen von alfini, April 03, 2025, 14:34:35

⏪ vorheriges - nächstes ⏩

alfini

Hallo Forum,

es sollen verschiedene Berichte in der Vorschau angezeigt werden
Ich lasse mir die einzelnen Nummern in einer MSGBOx anzeigen.
Das funktioniert auch.
Für diese Nummern soll jedes Mal ein Bericht erstellt werden und anzeigt.
Es wird aber nur ein Bericht angezeigt.
Wie kann ich das lösen?
Für eure Mühe bedanke ich mich im voraus.
Gruß alfini

Knobbi38

Hallo alfini,

dann solltest du aber auch zeigen, wie du das im Einzelnen machst, sonst kann man nur raten.

Gruß Knobbi38


alfini

Hallo knobby38

Die Berichte versuche ich mit dieser Schleife aufzurufen.
Private Sub cmdAbrAlle_Click()
On Error GoTo Fehler
Dim strFilter As String
Dim strVon As String
Dim strBis As String
Dim SAnzahl As Long
Dim MitIDF As Long
Dim i As Long
Dim db As DAO.Database
Dim rc As DAO.Recordset
If Not IsDate(Me!ZRVon) Then
    MsgBox "Bitte ein gültiges Startdatum eingeben!", vbInformation
    Me!ZRVon.SetFocus
    Exit Sub
End If
If Not IsDate(Me!ZRBis) Then
    MsgBox "Bitte ein gültiges Enddatum eingeben!", vbInformation
    Me!ZRBis.SetFocus
    Exit Sub
End If
strVon = "#" & Format(Me!ZRVon, "yyyy-mm-dd") & "#"
strBis = "#" & Format(Me!ZRBis, "yyyy-mm-dd") & "#"
SAnzahl = DCount([Mit_ID], "qryMAStdAbrechnung")
Set rc = CurrentDb.OpenRecordset("qryMAStdAbrechnung")
If rc.RecordCount > 0 Then
  rc.MoveLast
  rc.MoveFirst
    Do Until rc.EOF
        MitIDF = rc!Mit_ID_F
             DoCmd.OpenReport "rptMaStdAbrechnung", acViewPreview, , "Mit_ID_F = " & MitIDF _
               & " And [Obs_datum] between " & strVon & " And " & strBis
        DoCmd.RunCommand acCmdZoom100
        rc.MoveNext
     Loop
   End If
 rc.Close
 Set rc = Nothing
ExitFehler:
 On Error GoTo 0
    Exit Sub
Fehler:
    MsgBox Err.Description
Resume ExitFehler
End Sub
Gruß alfini


Knobbi38

#3
Hallo  alfini,

du kannst einen Bericht mit demselben Namen nicht mehrfach gleichzeitig öffnen. Hier mußt du dir also etwas anderes in deinem Workflow einfallen lassen.

Noch eine kleine Anmerkung am Rande:
SAnzahl = DCount([Mit_ID], "qryMAStdAbrechnung")
Set rc = CurrentDb.OpenRecordset("qryMAStdAbrechnung")
If rc.RecordCount > 0 Then
  rc.MoveLast
  rc.MoveFirst
    Do Until rc.EOF

Dieser Code ist ein wenig verquer. SAnzahl wird nicht benötigt und die Recordcount Eigenschaft ist erst dann valide, nachdem MoveLast ausgeführt wurde, nicht vorher. Ist aber beides alles nicht notwendig, weil du ja auf EOF prüfst.

Gruß Knobbi38

andyfau

Hallo,

mit folgendem Code kann man einen Bericht, analog zu Formularen, mehrfach mit z.B. verschieden Filtern gleichzeitig aufrufen, bzw. instanzieren.

Option Compare Database
Option Explicit
Dim repInstance1 As Report
Dim repInstance2 As Report

Private Sub ButtonRep1_Click()
Set repInstance1 = New Report_repName
With repInstance1
     .Visible = True
     .Caption = "Ich bin Report 1"
End With
End Sub

Private Sub ButtonRep2_Click()
Set repInstance2 = New Report_repName
With repInstance2
     .Visible = True
     .Caption = "Ich bin Report 2"
End With
End Sub
Beste Grüße
Andreas

Knobbi38

@andyfau

Das ist dann aber nur die halbe Miete. Was passiert mit den beiden Referenzen, wenn der Report geschlossen wird?
Wie setzt man bei so einer Vorgehensweise einen Filter?

Vielleicht solltest du das dann auch noch aufzeigen.

Gruß
Knobbi38
 

andyfau

 Wenn der Report z.B. ein Feld namens Teilnehmername hat:

Option Compare Database
Option Explicit
Dim repInstance1 As Report
Dim repInstance2 As Report

Private Sub ButtonRep1_Click()
Dim strfilter1 As String
Set repInstance1 = New Report_repTeilnehmer
strfilter1 = "[Teilnehmername]='Müller'"
With repInstance1
     .Filter = strfilter1
     .FilterOn = True
     .Visible = True
     .Caption = "Ich bin Report 1"
End With
   
End Sub

Private Sub ButtonRep2_Click()
Dim strfilter2 As String
Set repInstance2 = New Report_repTeilnehmer
strfilter2 = "[Teilnehmername]='Schulze'"
With repInstance2
     .Filter = strfilter2
     .FilterOn = True
     .Visible = True
     .Caption = "Ich bin Report 2"
End With
   
End Sub
Beste Grüße
Andreas

alfini

Hallo,

habe die berichte als PDF erstellt.
Das funktioniert.
Besten Dank.
Gruß alfini

Knobbi38

@andyfau

Hallo Andreas,

zunächst einmal Chapeau für deine Lösung, ich wäre im Zusammenhang mit Berichten nicht so ohne weiteres darauf gekommen.

Allerdings hat mir dabei noch nicht gefallen, daß nach dem Schließen eines Reports die entsprechende Referenz ins Nirwana zeigt und nicht auf Nothing zurückgesetzt wird. So kann nicht geprüft werden, ob die Referenz noch gültig ist oder nicht, sondern es müssen bei Zugriff darauf ganz brutal Fehler mit einem Errorhandling abfangen werden.

Deshalb habe ich mir die Sache nochmal etwas genau angeschaut und habe dabei festgestellt, daß die Lösung ohne Filter läuft, aber in Verbindung mit einem Filter das ganze instabil wird und bei mir immer mal wieder Fehlermeldungen mit dem Hinweis, daß irgendwelche Drucker nicht abgefragt werden könnten, angezeigt worden sind.

Was nicht ganz offensichtlich ist, daß selbst, wenn so neue Instanzen eine Reports erzeugt werden, diese in der Reports-Auflistung eingetragen werden. Gleichzeitig wird bei Zuweisung eines Filters der Report aber quasi wieder geschlossen und das Objekt neu initialisiert. Dabei wird kein neues Objekt erzeugt! Wird dann so ein Report geschlossen, treten dann beim nächsten Aufruf u.U. solche Fehler auf. Die Reports waren zu diesem Zeitpunkt in den meisten Fällen noch unsichtbar im Hintergrund geöffnet.

Reports verhalten sich hier komplett anders als Formulare.

Nach einigem hin- und her habe ich jetzt folgenden Workaround gefunden, zumindest gibt es keine Fehler mehr und eine globale Referenz wird nicht mehr benötigt:
Public Sub RepTest()
  Dim rep As Report
 
  Const RPT_NAME As String = "rptData"
 
  Do While CurrentProject.AllReports(RPT_NAME).IsLoaded
    DoCmd.Close acReport, RPT_NAME
  Loop
 
  Set rep = New Report_rptData
 
  With rep
    .Caption = "Bericht 1"
    .Filter = "ID < 5"
    .FilterOn = True
    .Visible = True
  End With
 
  DoEvents
 
  Set rep = New Report_rptData
 
  With rep
    .Caption = "Bericht 2"
    .Filter = "ID >= 5"
    .FilterOn = True
    .Visible = True
  End With
 
  DoEvents
 
  Set rep = Nothing
End Sub
Vielleicht kannst du das ja nochmal gegen checken?

Grüße
Ulrich

andyfau

Hallo Ulrich,
das war mal wieder in der Freude, dass ich auch mal eine Lösung beitragen konnte, quick and dirty.  ::)
Ich hatte vor kurzem mit instanzierten Formularen zu tun und dachte, einfach mal versuchen, weil so viele Dinge bei Reports und Formularen analog sind. Natürlich sollte man Objekte nach Gebrauch wieder zerstören.
Danke für den Hinweis. So ist mir auch DoEvents mal wieder bewusst geworden.
Beste Grüße
Andreas