Neuigkeiten:

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

Mobiles Hauptmenü

Bericht fokusieren

Begonnen von MaxP, Mai 22, 2020, 09:40:05

⏪ vorheriges - nächstes ⏩

MaxP

Hallo zusammen,

ich habe mir ein kleines Formular mit speziellen Druckbefehlen erstellt, dass mit div. Berichten (1-seitig) aufgerufen werden soll.

In dem VBA-Code des Druckmenüs DoCmd.PrintOut acPrintAll wird das aktuelle Objekt gedruckt.
Leider druckt er nur das Druckformular aus. Der Druckbefehl soll bei beliebigen Berichten aufgerufen werden.

Gibt es einen Code, der den aktuell geöffneten Bericht fokusiert?

Ich habe es mit DoCmd.SelectObject acReport, "Berichtname" probiert.
Es funktioniert auch, aber ich brauche jedesmal den entsprechenden Berichtsnamen.

Kann man den Berichtsnamen direkt auslesen? Report.Name oder so?

Danke im Voraus.

Gruß
Max
Win 10 pro 64 bit, Access 2003

DF6GL

Hallo,
Zitat
der den aktuell geöffneten Bericht fokusiert... Kann man den Berichtsnamen direkt auslesen?

Screen.ActiveReport.Name

MaxP

Hallo,
nachdem ich den Code eingebunden habe, erscheint die Fehlermeldung:

Laufzeitfehler 2476: Sie haben einen Ausdruck eingegeben, für den es erforderlich ist, dass das aktive Fenster ein Bericht ist.

Der Bericht ist definitiv geöffnet, aber vermutlich nicht aktiv.

Gruß
Max
Win 10 pro 64 bit, Access 2003

DF6GL

Hallo,

wir sprachen ja auch vom "aktuellen" Bericht. Wenn der Focus nicht darauf ist, ist der Bericht auch nicht aktuell.

Es wird halt dann schwierig, das Berichtsfenster zu aktivieren, wenn der Berichtsname nicht bekannt ist.

Warum kennst Du den Namen denn nicht? Wie wird der Bericht  geöffnet?

Vermutlich hast Du eine falsche Vorgehensweise.

MaxP

Doch ich kenne den Berichtsnamen, jedoch wollte ich eigentlich das Druckmenü wenn möglich von Berichtsnamen freihalten, um es universell einzusetzen.
Es gibt viele Berichte, die aus verschiedenen Formularen aus aktiviert werden.

Gruß
Max
Win 10 pro 64 bit, Access 2003

DF6GL

Hallo,


dem kann ich nicht folgen...

Es ist doch möglich,  den Berichtsnamen bei Öffnen z. B. in eine globale Variable zu schreiben und diese dann dort zu verwenden, wo Du es gedenkst zu tun.



Beaker s.a.

Hallo Max,
ZitatDoch ich kenne den Berichtsnamen
Du kennst sogar alle. Somit kannst du den richtigen Namen doch an der
richtigen Stelle übergeben. Die .OpenReport-Methode erwartet ja nur einen
String als Parameter (ReportName), und der kann auch mit einer Variablen
geliefert werden.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaxP

Hallo,
die Sache scheint doch schwieriger zu sein, als ich dachte.

Gretchenfrage:
Muss ich den Berichtnamen im Ausgangsformular z.B. über ein Steuerelement bereitstellen (was bei diesem Formular nicht so einfach wäre) oder kann der Berichtsname direkt beim Öffnen des Berichts an einen VBA-Code übergeben werden? (Man sollte meinen, dass der Bericht seinen eigenen Namen kennt)

Im ersten Fall müsste im Druck-Code das Form benannt werden und bei anderen Formularen müsste der Code dann anders lauten. Kompliziert!

Im zweiten Fall müsste der Berichtsname vom Bericht-Öffnen-Code, mit dem gleichzeitig auch das Druckformular geöffnet wird, an den per Button ausgelösten Druck-Code übergeben werden. Aber wie?

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt.

Gruß
Max
Win 10 pro 64 bit, Access 2003

DF6GL

Hallo,

ich verstehe nur Bahnhof...

Was überhaupt willst Du (prinzipiell) denn machen?

Ich hoffe, du öffnest die Berichte per VBA-Code , bzw. per Ereignisprozeduren...

Und was müsste bei anderen Formularen anders heißen?

Was soll das "Druckformular" bewirken?


Ich kann mir nur vorstellen, als dass Du einen Bericht öffnen willst und dieser Bericht wiederum ein Popup-Form läd, mit dem verschiedene Druckparameter, z. B. ein passender Drucker eingestellt werden können.

In diesen Fall kann eine Funktion herhalten, die beim Öffnen des  Berichtes aufgerufen wird und alle Maßnahmen ausführt, die an dieser Stelle vorgesehen sind.


Mit "Me.Name" erhältst du den Namen des Berichtes, z. B. in dessen Ereignisprozedur "Beim Laden" .

Die o. g. Funktion musst Du halt entspr. den Anforderungen programmieren.

Beaker s.a.

Hallo Max,
Mir geht es ja wie Franz, so recht verstehen kann ich es auch nicht.
ZitatMuss ich den Berichtnamen im Ausgangsformular z.B. über ein Steuerelement bereitstellen
Nicht unbedingt, - du kannst deine Berichte, richtiger ihre Namen, ja
auch in einer Tabelle bereithalten.
Zitatoder kann der Berichtsname direkt beim Öffnen des Berichts an einen VBA-Code übergeben werden? (Man sollte meinen, dass der Bericht seinen eigenen Namen kennt)
Der Bericht natürlich, aber VBA musst du den zum Öffnen erstmal
bekannt geben.
DoCmd.OpenReport "NameDesBerichtes", ...
Wenn du einen Bericht jedoch direkt aus dem Navigationsbereich öffnest,
kannst du VBA den Namen in der Weise bekannt geben, wie es Franz
beschrieben hat.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaxP

Hallo,
entschuldigt bitte, dass ich mein Vorhaben nur so knapp geschildert habe. Ich nahm an, dass viele Accessler so ihre Berichte drucken würden.

Deshalb noch mal zum besseren Nachvollziehen:

Statt meine zahlreichen Berichte (Schriftverkehr mit Kunden) klassisch über den entsprechenden Menüpunkt Drucken auszugeben und ständig einen anderen Drucker wählen zu müssen (Normal/Konzept/PDF/Fax), hatte ich die Idee, ein Formular zu entwerfen, in dem die gewünschten Druckaufträge mit einem Klick über Optionsschaltflächen gestartet werden können. (Anzahl der Kopien gibts auch noch). Dieses kleine Formular ist als Popup definiert und wird mit dem Öffnen des Berichts gestartet.

Im Druckereignis steht :
DoCmd.SelectObject acReport, rpt 'Aktivierung des geöffneten Berichts
    'Druckauftrag z.B.
Application.Printer = Application.Printers("Druckername")
    DoCmd.PrintOut acPrintAll, , , , varAnz


Die Variable rpt enthält den Berichtsnamen.
Der wird durch das Öffnen des Berichts in dem entsprechenden Ereignis über me.Name (Danke dafür) an ein ungebundenes Steuerelement in ein Startformular, das immer geöffnet ist, gespeichert. (Das geht sicherlich auch eleganter über Variablen-Weitergabe im VBA; das beherrsche ich jedoch (noch) nicht.)

Der Druckbefehl holt sich wiederum den Berichtsnamen aus dem besagtem Steuerelement des Startformulars und speichert ihn in der Variablen rpt.

So, nun funzt es! Ich denke, das war's.
Danke Euch!!

Gruß
Max






Win 10 pro 64 bit, Access 2003

Beaker s.a.

Hallo Max,
Auch wenn es nun so läuft, könnte ich mir eine andere Vorgehensweise
vorstellen.
Du speicherst alle Einstellungen zu den Berichten in eine Tabelle. Diese
wird dann DS-Herkunft deines Forms. Die Steuerelemente bindest du an
die entsprechenden Felder der Tabelle. Das Form kannst du dann gefiltert
(s.u.) auf den aktuellen Bericht öffnen. Auf diese Weise hast du schon alle
Einstellungen parat, und der Anwender muss nur noch evtl. Änderungen
vornehmen.
Wie du geschrieben hast, öffnest du das Form beim Öffnen des Berichtes
in dieser Art
Private Sub Report_Open(Cancel As Integer)
    DoCmd.OpenForm "DeinForm", ...
End Sub

Mit einer Tabelle als Basis dann so
Private Sub Report_Open(Cancel As Integer)
    Dim lRptID As Long
    lRptID = Nz(DLookup("ReportID", "TabelleMitBerichten", "ReportName = " & Me.Name), 0)
'falls vergessen wurde den Bericht in die Tabelle einzutragen, was du mit dem gebundenen Form auch nebenbei erledigen kannst
    If lRptID = 0 Then
        If MsgBox(Prompt:="Dieser Bericht und seine Einstellungen wurden noch nicht erfasst! Soll er angelegt werden", _
            Buttons:=vbOKCancel) = vbOK Then
            DoCmd.OpenForm _
                FormName:="DeinForm", _
                DataMode:=acFormAdd
'hier könntest du auch per OpenArgs gleich den Berichtsnamen mit übergeben, und im Form_Load-Ereignis dem Feld als Vorgabe spendieren
        Else
            Cancel = True
            Exit Sub
        End If
    Else
        DoCmd.OpenForm _
           FormName:="DeinForm", _
           WhereCondition:="ReportID = " & lRptID
    End If
'wegen Kommazählerei alles mit benannten Parametern, weitere musst du deinen Bedürfnissen entspr. ergänzen
End Sub


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaxP

Hallo Ekkehard,

danke für Deinen Nachtrag.

Sofern ich zu der Erkenntnis gelange, dass das Eintragen des Ereignisses in jeden Bericht mir zu umständlich ist, werde ich Deinen Code ausprobieren.

Besonders komfortabel finde ich die Möglichkeit des nachträglichen Aufnehmens eines Berichtsnamens in die Tabelle!

Gruß
Max
Win 10 pro 64 bit, Access 2003

Beaker s.a.

Hallo Max,
ZitatSofern ich zu der Erkenntnis gelange, dass das Eintragen des Ereignisses in jeden Bericht mir zu umständlich ist, werde ich Deinen Code ausprobieren.
Klar, den kannst du natürlich auch in eine öffentliche Prozedur auslagern,
der du als Parameter einfach den Berichtsnamen mitgibst.
Public Sub OpenFormReports(sRepName As String)
.
'einzige Änderung
lRptID = Nz(DLookup("ReportID", "TabelleMitBerichten", "ReportName = " & sRepName), 0)
.
End Sub

Aufruf
Private Sub Report_Open(Cancel As Integer)
    Call OpenFormReports(Me.Name)
End Sub

   
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)