Guten Morgen,
ich habe da mal wieder ein kleines Problem bei dem ich auf dem Schlauch stehe:
Um Code zu sparen und ein wenig flexibler zu sein, habe ich mir überlegt, Berichte über ein Druck-Formular zu drucken.
Meine Gedanken:
- Tabelle mit Druckern (PDF, Farbe, SW) anlegen
- Druckformular (zur Auswahl des Druckers) erstellen
- Bericht öffnen
- über ein Objekt im Bericht das Druck-Formular aufrufen
- im Formular den Drucker auswählen
- Druckformular schließen
- Bericht entsprechend der Auswahl drucken
- Bericht schließen
Ich möchte nur ein Druckformular für alle meine Berichte nutzen.
Meine Umsetzung:
- Formular erstellt
- Code:
Private Sub cmdPDF_Click()
Dim PDF As String
PDF = DLookup("Drucker", "tbldatendrucker", "ID=1")
Set Application.Printer = Application.Printers(PDF)
DoCmd.Close acForm, Screen.ActiveForm.Name
DoCmd.OpenReport Screen.Application.CurrentObjectName
DoCmd.Close acReport, Screen.Application.CurrentObjectName
Set Application.Printer = Nothing
End Sub
- Bericht direkt geöffnet und getestet. Perfektes Ergebnis
Mein Problem:
Alle Formulare und Berichte werden als Pop-Up geöffnet. Was ich bei meinem Test nicht bedacht habe, die Berichte werden über Formulare geöffnet. Diese Formulare sind und sollen auch geöffnet bleiben.
Dadurch ist der Bericht aber beim Durchlauf des Codes nicht mehr aktiv, sondern das Hauptformular und ein Fehler ist die Folge.
Kann mir bitte jemand beim Code helfen?! (Ich möchte aber nicht die Standard-Druckauswahl nutzen!!!)
Gruß
Michael
Hallo,
ZitatDadurch ist der Bericht aber beim Durchlauf des Codes nicht mehr aktiv
In dem Fall müsstest du die Formulare udgl. beim Namen nennen
DoCmd.Close acForm, "Formularname"
DoCmd.OpenReport "Reportname"
DoCmd.Close acReport, "Reportname"
Hallo,
dann wäre ich aber nicht mehr so flexibel und müsste auch für jeden Bericht ein eigenes Druck-Formular erstellen (das möchte ich ja gerne vermeiden).
Fehlermeldung:
Laufzeitfehler '2476'
Sie haben einen Ausdruck eingegeben, für den es erforderlich ist, dass das aktive Fenster ein Bericht ist.
Kann man nicht irgendwie den Bericht wieder aktivieren?
Gruß
Michael
Hallo,
das Konzept ist m. E. etwas verbesserungswürdig...
Die Screen.Activeform-Eigenschaft ist sehr von der Umgebungssituation abhängig.
Vorschlag:
Ein ungebundenes Formular erstellen, in dem in einem Kombifeld die "gültigen" Berichte aus Tabelle "MSysObjects" angezeigt werden. Ein "gültiger" Bericht wird mit einem besonderen Prefix im Namen versehen, z. B. "outMeinBericht1", der somit in der Kombifeld-Abfrage gefiltert werden kann.
Weiterhin ein Kombifeld, das die aus dem System ausgelesenen (oder über die Printers-Auflistung ermittelten) Drucker anzeigt.(Die separate Drucker-Tabelle ist natürlich auch verwendbar, ist aber pflegebedürftig.).
Dazu ein Button "btnDrucken", der den ausgewählten Bericht auf den ausgewählten Drucker ausgibt, evtl. mit gleichzeitiger Preview des Berichtes.
Hallo,
wenn ich das richtig verstanden habe, wähle ich über ein Kombifeld den entsprechenden Bericht aus!?
Das ist nicht benutzerfreundlich, da ich viele Berichte habe und der Benutzer wahrscheinlich alles (außer den richtigen Bericht) ausdruckt.
Kann ich nicht den Namen für den geöffneten Bericht ermitteln? Es ist nur immer ein Bericht geöffnet.
Gruß
Michael
So, ich habe es nun hinbekommen:
im Druck-Formular ein Textfeld angelegt:
Private Sub txtBericht_GotFocus()
Dim r As Report
Set r = Screen.ActiveReport
txtBericht = r.Name
End Sub
und den Code angepasst:
Dim strBericht As String
strBericht = Me.txtBericht
Dim SW As String
SW = DLookup("Drucker", "tbldatendrucker", "ID=3")
Set Application.Printer = Application.Printers(SW)
DoCmd.Close acForm, Screen.ActiveForm.Name
DoCmd.OpenReport "" & strBericht & ""
DoCmd.Close acReport, "" & strBericht & ""
Set Application.Printer = Nothing
End Sub
Danke für die Anmerkung mit dem Kombifeld.
Gruß
Michael