Hallo zusammen,
ich habe eine kleine Herausforderung, die ich irgendwie nicht gelöst bekomme.
In einem Bericht im Seitenkopf ist ein Unterbericht eingebettet.
Aufgrund einer Prozessanpassung möchte ich diesen Bericht mehrfach verwenden.
Hierzu ist es erforderlich zwei Bezeichnungsfelder im Unterbericht sichtbar / unsichtbar zu machen.
Dieses Bezeichnungsfeld über den übergeordneten Bericht anzusprechen funktioniert bei mir nicht:
"Reports![Seitenkopf PP].Bezeichnungsfeld167.Visible = False" (im Bereich "Report_Open")
--> Laufzeitfehler: 2451 Berichtsname nicht vorhanden oder nicht geöffnet...
Ich vermute, dass es daran liegt, dass der Bericht nur kurz im Hintergrund (beabsichtigt) zum Drucken geöffnet wird.
DoCmd.OpenReport "Pruefprotokolle", acPreview, , PMFilter, acHidden, sOrder
DoCmd.SendObject acReport, "Pruefprotokolle", acFormatPDF, An, "", "", GetMessage(273), nachricht, True, ""
DoCmd.Close acReport, "Pruefprotokolle", acSaveNo
Hat hierzu irgendjemand eine Idee / Lösung?
Herzlichen Dank!
Viele Grüße
Christoph
Innerhalb des Reports würde ich folgendes versuchen:
Me.NameUnterberichtSteuerelement.Report!NameSteuerelement.Visible
Hallo,
einen Unterbericht kann man nicht über die Reports-Auflistung ansprechen, dort wird nur der Hauptbericht verwaltet. Ich würde die Steuerung in den Hauptbericht verlegen und beim Öffnen des Berichts per Openargs die notwendigen Argumente übergeben.
Gruß
Knobbi38
Guten Morgen,
ja, das hat bei mir auch nicht funktioniert.
Me.NameUnterberichtSteuerelement.Report!NameSteuerelement.Visible
Das mit OpenArgs hatte ich mir auch schon mal überlegt gehabt, nur weiß ich leide nicht, wie ich das mitgeben soll, da der Unterbericht ja im Seitenkopf eingebettet ist und beim öffnen des Hauptberichts automatisch mit geladen wird.
Wo kann ich das mitgeben? Oder gilt OpenArgs auch für Unterberichte, die automatisch mit geöffnet werden?
D. h. dass die Parameter, die ich beim Öffnen des Hauptformulars mitgebe, dort auch mit verwendet werden können?
Vielen Dank
Hallo,
nochmal: die Unterberichte kannst du nicht direkt von Außen ansprechen, nur immer über das SubReport-Steuerelement!
OpenArgs gibst du beim Öffnen des Berichtes mit und das wird dann "Beim Öffnen" oder "Beim Laden" Ereignis ausgewertet.
Gruß
Knobbi38
Hallo knobbi38,
ja, hatte ich auch so verstanden.
Ich wollte es trotzdem nicht unversucht lassen, was markusxy geschrieben hatte:-).
Also habe ich in meinem Fall keine Möglichkeit, oder?
Denn OpenArgs Argumente kann ich ja nicht mitgeben, da der Unterbericht, wie geschrieben, eingebettet ist und nicht mittels VBA-Code aufgerufen wird. Sondern automatisch zusammen mit dem Hauptbericht geladen wird.
Ich weiß zumindest nicht, wie das konkret gehen könnte.
Vielen Dank
Christoph
Hallo Christoph,
sicherlich kannst du Openargs mitgeben und dann im Hauptbericht in den bereits beschriebenen Ereignissen auswerten - wo ist das Problem. Im Bereicht selber hast du doch problemlos Zugriff auf die Unterberichte über das SubReport-Steuerelement. Schau dir das nochmal genauer an.
Gruß
Knobbi38
ZitatDenn OpenArgs Argumente kann ich ja nicht mitgeben, da der Unterbericht, wie geschrieben, eingebettet ist
Du sollst und kannst die OpenArgs ja nur dem HRpt mitgeben.
Hallo ein letztes Mal:-)
Ich blicke leider irgendwie nicht :-[ .
Ich öffne den Hauptbericht zum Drucken oder Mailen im Hintergrund mittels 2 Varianten:
DoCmd.OpenReport "4401_Pruefprotokolle", acPreview, , PMFilter, acHidden, "4403" & sOrder (zum Versenden per Mail)
oder
DoCmd.OpenReport "4401_Pruefprotokolle", acViewNormal, , PMFilter, , "4403" (zum klassischen Drucken)
in diesem Bericht ist ein Unterbericht eingebettet, der ja beim Laden automatisch mit geöffnet wird.
Wie soll ich denn dem Unterbericht irgendwelche OpenArgs Argumente mitgeben??
Viele Grüße
Christoph
Zitat von: cyberchris am März 14, 2025, 08:23:43Guten Morgen,
ja, das hat bei mir auch nicht funktioniert.
Me.NameUnterberichtSteuerelement.Report!NameSteuerelement.Visible
Das sollte schon funktionieren.
Wie lautet die Fehlermeldung, bzw wie lautet die Anweisung und von wo aus startest du sie?
Zitat von: cyberchris am März 14, 2025, 16:32:08Wie soll ich denn dem Unterbericht irgendwelche OpenArgs Argumente mitgeben??
Die Openargs kannst du nur dem Hauptbericht mitgeben. Danach brauchst du noch die Methode die ich dir schon gezeigt habe :-\
Ergänzung: Es sollte auch außerhalb des Hauptreports klappen. Du musst nur die Anweisung entsprechend ergänzen:
Reports!NameHauptreport!NameUnterberichtSteuerelement.Report!NameSteuerelement.VisibleAber natürlich nur, wenn du den Report mittels PreView öffnest - ansonsten brauchst du OpenArgs oder eine andere Art um die Argumente zu übergeben.
Hallo Markus,
danke für deine Antwort.
Also ich öffne den Report u. a. mit:
DoCmd.OpenReport "4401_Pruefprotokolle", acPreview, , PMFilter, acHidden
in Form_Open habe ich mal beide Varianten von dir getestet:
Me.[Seitenkopf_PP].Report!Bezeichnungsfeld186.Visible = True
--> Laufzeitfehler 2465: Datenbank kann das in Ihrem Ausdruck angesprochene Feld '|1' nicht finden.
Reports![4401_Pruefprotokolle]!Seitenkopf_PP.Report!Bezeichnungsfeld186.Visible = True
--> Laufzeitfehler 2465: Datenbank kann das in Ihrem Ausdruck angesprochene Feld 'Seitenkopf_PP' nicht finden.
Hauptformular heißt: 4401_Pruefprotokolle
Unterformular heißt: Seitenkopf_PP
In Form_Load habe ich das nicht getestet, da das bei Berichten glaube nicht funktioniert, oder?
Ich hatte in der Vergangenheit zumindest immer Probleme, wenn ich bei Berichten mit Form_Load gearbeitet hatte.
Anschließend wird eine E-Mail geöffnet und der Bericht angefügt, mit:
DoCmd.SendObject acReport, "4401_Pruefprotokolle", acFormatPDF, _ ...
Schönen Abend
Christoph
Hallo Christoph,
also die Grundlagen von Access sollte man schon verstehen und kennen. Das ein Form_Open nicht in einem Report existiert, sollte eigentlich klar sein und wie man Openargs in einem Formular oder einem Bericht auswertet, eigentlich auch.
Wie dem auch sei, in der Anlage ein kleines Beispiel, wie so etwas gelöst werden könnte.
@Ulrich,
Me.subContainer.Report.VisibleID = CBool(OpenArgs)vs
Me.subContainer.Report.txtID.Visible = CBool(OpenArgs)VisibleID ist mir jetzt neu und daher verwirrend? Klappt das auch für die anderen Controls in ähnlicher Weise?
@Christoph,
den Namen des Subreports darfst du nicht verwenden. Von der Logik her muss dir einfach klar sein, dass man einen SubReport auch mehrfach einsetzen könnte (vor allem bei SubForms beliebt) und dieser daher nicht eindeutig ist. Es muss also immer des Name des SubReportControls verwendet werden.
@markusxy Wie du dem Code entnehmen kannst, ist "VisibleID" eine Public Property im Report. Anstatt direkt auf das Control im Report zuzugreifen, habe ich hier im Sinne von OOP die Variante mit der Property verwendet. Der Name des Controls sollte für den Aufrufer keine Rolle spielen.
Grüße
Ulrich
@Ulrich,
alles klar. Da hab ich nicht rein geschaut.
OOP? Da würde ich eher auf EarlyBinding gehen, dann kann man auf den Bang Operator verzichten und der Compiler meldet falsche Bezüge und die IntelliSense funktioniert auch ...
Und der code bleibt einfach.
Aber jedem seine Spielereien :)
Zitat von: markusxy am März 17, 2025, 17:16:45EarlyBinding
Early Binding bei einem SubReport? OOP Designtechniken bzw. Pattern haben mit Early Binding wenig zu tun und auch nichts mit dem Bang-Operator. Das sind verschiedene Themenbereiche.
Hier geht es um Datenkapselung.
Grüße Ulrich
Hallo zusammen,
Danke für eure Antworten. Muss ich mir mal anschauen und testen.
@knobbi38: sorry, ich hatte mich natürlich verschrieben... meinte "Report_Open" und "Report_Load". Wollte damit nur mitteilen, wo ich die Code eingebaut hatte...in _Open...
Auch weiß ich, wie man grundsätzlich OpenArgs mitgibt und auswertet - nur eben bisher noch nicht, wie damit in einem Unterformular umzugehen ist.
Viele Grüße
Christoph
@Ulrich,
hier ein Beispiel was ich meine:
Private Sub Report_Load()
If Not IsNull(OpenArgs) Then
Dim sr As Report_srptData
Set sr = Me.subContainer.Report
sr.txtID.Visible = CBool(OpenArgs)
End If
End SubWenn man eine Referenz auf das Report Objekt erstellt, kann man IntelliSense nutzen und hat einen Code, den der Compiler prüfen kann.
@markusxy Hallo Markus,
danke für den Hinweis und wer gerne IntelliSense verwenden möchte, sollte das auch so machen.
Leider steht dann in VBA direkt der Name des Unterreports als Typ im Code, was ich gerne vermeiden möchte und deshalb das generische "Object" bevorzuge. Um diesen Nachteil zu vermeiden und dennoch mit IntelliSense arbeiten zu können, müßte man ein Interface verwenden. In dem Fall, bei nur einer Property oder Methode, halte ich das aber für etwas übertrieben.
VG
Ulrich
Änderung:
für Interessierte im Anhang die entsprechende Interface-Version.
Hallo zusammen,
danke für eure Unterstützung.
ich habe es nun teilweile erfolgreich hinbekommen.
Mein Fehler war, dass ich die ganze Zeit im "Report_Open" war. Dies geht aber nur im "Report_Load"
Me.[Prüfprotokoll].Report!Bezeichnungsfeld186.Visible = True
Jedoch nur, wenn ich den Bericht so öffne (Variante für Mail-Anhang):
DoCmd.OpenReport "4401_Pruefprotokolle", acPreview, , PMFilter, acHidden, "4401" & sOrder
Beim Öffnen zum Drucken durchläuft er irgendwie "Report_Load" nicht:
DoCmd.OpenReport "4401_Pruefprotokolle", acViewNormal, , PMFilter, , "4401"
Daher funktioniert es in diesem Fall leider nicht.
Viele Grüße
Christoph
Hallo Christoph,
Von Report_Open war nie die Rede und acViewNormal wird bei Reports eigentlich selten verwendet - warum verwendest du das Überhaupt?
ZitatDaher funktioniert es in diesem Fall leider nicht.
Bei Reports in der Berichts- und Seitenansicht wird hingegen sehr wohl das "Report_Load" Ereignis ausgelöst und sollte also auch in deinem Fall funktionieren. Du kannst also den Bericht versteckt öffnen und dann mit PrintOut ausdrucken, wie das in den meisten Fällen gemacht wird.
Wie du PMFilter und Openargs verwendest, gibst du leider nicht an - diesbezüglich ist dann auch keine Hilfe möglich.
Gruß
Knobbi38
Vielen Dank an alle, die mir hierzu weitergeholfen haben.
Hallo Christoph,
noch eine kleine Anmerkung:
wenn ein Bericht mit einem eingebetteten Unterbericht erstellen wird, legt Access leider das SubReport-Steuerelement mit dem Unterberichtsnamen an. Der Bezeichner für das SubReport-Steuerelement sollte danach zwingend geändert werden, um spätere Fehler zu vermeiden. Meistens wird dem Steuerelementnamen einfach ein Präfix 'sub' vorangestellt, das reicht schon aus, um die Eindeutigkeit wieder herzustellen.
Gruß
Knobbi38
Zitat von: knobbi38 am März 18, 2025, 11:13:28Leider steht dann in VBA direkt der Name des Unterreports als Typ im Code, was ich gerne vermeiden möchte und deshalb das generische "Object" bevorzuge.
Hallo Ulrich, hab's mir jetzt endlich angesehen.
Ist natürlich auch ein guter Ansatz, wenn man sich den Aufwand antun will.
Der Vorteil ist immerhin, dass die Anzeige auf die vorgesehenen Controls eingeschränkt ist und der Compiler der Lage ist zu prüfen.