Hallo zusammen. Ich habe zwei Berichte
Private Sub Print_All_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.RunCommand acCmdPrint
DoCmd.Close acReport, "BerichtChecklisteLKW", acSaveYes
DoCmd.Close acReport, "BerichtChecklisteBestueckung", acSaveYes
End If
End Sub
,die Berichte öffnen sich auch aber es wird nur der letzte gedruckt und schließen beide ( auch wenn ich die Reihenfolge ändere, immer der zweite Bericht wird gedruckt.
Kann mir einer helfen und mir den Fehler sagen. Habe überall gesucht aber keine Lösung gefunden. In beiden Berichten sind Daten enthalten.
Ja es wird nur der im Fokus stehende Bericht gedruckt. Wenn ich nach jedem geöffnetem Bericht der Druckbefehl gebe werde ich immer aufgefordert den Drucker auszuwählen.If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.RunCommand acCmdPrint
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.RunCommand acCmdPrint
DoCmd.Close acReport, "BerichtChecklisteLKW", acSaveYes
DoCmd.Close acReport, "BerichtChecklisteBestueckung", acSaveYes
End If
Ich könnte die Berichte Kopieren und beim öffnen den Befehl zum Drucken und schließen geben aber das ist nur Doppelte Belegung und bestimmt auch Quatsch ;D
Da am Ende mehrere Berichte gedruckt werden ist das nicht der Sinn.
Würde mich um eine Antwort freuen.
Gruß Udo
Hi Udo,
Du kannst einen sofortigen Druck mit einem anderen AcView-Parameter erreichen:
acViewNormal 'Standard Druckt den Bericht sofort. {gilt für access2003, daher ggf. anpassen}
Harald
Hallo,
oder den Parameter acViewReport einfach weglassen.
Hallo zusammen.
Also ich habe das schon getestet aber bei acViewNormal sowohl beim weglassen der acView... kommt ein Fenster "Druckerausgabe speichern unter" also als Datei speichern. Die Druckerauswahl kommt nur bei acViewReport.
Hallo,
zeig mal die komplette Prozedur, wie sie aktuell aussieht...
Solches sollte genügen:
Private Sub Print_All_Click()
If Me!Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
End If
End Sub
Prüfe zudem, ob die Druckereinstellung ( Seiteneinrichtung/Seite) der Berichte auf "Standarddrucker" eingestellt ist und ob der Windows-Standarddrucker dem gewünschten entspricht.
Hallo Franz.
Option Compare Database
Option Explicit
Private Sub Print_All_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", acViewReport, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.RunCommand acCmdPrint
DoCmd.Close acReport, "BerichtChecklisteLKW", acSaveYes
DoCmd.Close acReport, "BerichtChecklisteBestueckung", acSaveYes
End If
End Sub
Wie gesagt, wenn ich die acView.... weglasse oder acViewNormal eintrage, öffnet sich ein Fenster mit der Frage, wo die Datei gespeichert werden soll. Da die DB auf einem Server liegt und alle einen Zugriff darüber erhalten, muss jeder Anwender seinen eigenen Drucker (der Abteilung) auswählen können. Nacheinander Manuell funktioniert das ja auch, nur nicht in meinem Code, da werde ich nur nach dem letzt geöffnetem "Fokussiertem" Bericht gefragt, er druckt das letzte aus und schließt beide. ( zum Test hier nur zwei Berichte, werden wenn alles so läuft bis zu 10 Berichte werden)
Hallo,
hat jeder User sein eigenes Frontend ?
Dann kann doch jeder User seinen Drucker fest als Standarddrucker eingeben, dann sollte auch der Bericht ohne weiteres über seinen Drucker gedruckt werden können.
Für einen sicheren Mehrbenutzerbetrieb wäre es erforderlich, dass jeder User sein eigenes Frontend hat.
Vielen Dank an Euch.
Ja, jeder User hat eine FE. Habe den Standarddrucker festgelegt, acViewReport und DoCmd.RunCommand acCmdPrint rausgeschmissen und alles war gut.
Daumen hoch
Da bin ich wieder mal.
Das mit dem Standartdrucker festlegen war eigentlich eine gute Idee... aber das Problem ist, wenn ich den Standarddrucker festlege werden alle berichte an einem Drucker ausgedruckt. Ich würde gerne eine Abfrage bekommen welchen Drucker ich benutzen möchte. Die Abfrage habe ich durch den Code (http://www.donkarl.com?FAQ5.1) hinbekommen (Zeigt alle verfügbaren Drucker an) aber die ausgewählte Funktion wird ignoriert.
habe es so eingesetzt:
Beim öffnen des Formular Dim prtloop As Printer
Me!Printers.RowSource = ""
For Each prtloop In Application.Printers
Me!Printers.AddItem prtloop.DeviceName
Next prtloop
um das Kombifeld zu füllen. Wähle einen Drucker aus und dann....
Option Compare Database
Option Explicit
Private Sub Print_All_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
DoCmd.Close acReport, "BerichtChecklisteLKW", acSaveYes
DoCmd.Close acReport, "BerichtChecklisteBestueckung", acSaveYes
End If
End Sub
das habe ich auch versucht
Private Sub Print_All_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
Reports!BerichtChecklisteLKW.Printer = Application.Printers([Printer])
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", , , "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
Reports!BerichtChecklisteBestueckungLKW.Printer = Application.Printers([Printer])
DoCmd.Close acReport, "BerichtChecklisteLKW", acSaveYes
DoCmd.Close acReport, "BerichtChecklisteBestueckung", acSaveYes
End If
End Sub
kann mir einer von euch weiterhelfen ?
Hallo,
öffne den jeweiligen Report als "versteckt" (acHidden).
setze die Printer-Eigenschaft
drucke den Bericht mit Docmd.Printout
schließe den Bericht (ohne saveas)
Hallo Franz. Ich bekomme das nicht hin. Wenn ich dich richtig verstanden habe sollte es so aussehen. Kombifeld nach Auswahl des Druckers "After Update"
Option Compare Database
Option Explicit
Private Sub Printers_AfterUpdate()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", , , , acHidden, "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
Reports!BerichtChecklisteLKW.Printer = Application.Printers([Printers]) '<---- Ist dass so richtig?
DoCmd.PrintOut
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", , , ,acHidden, "[GeräteNummer] = '" & Me![GeräteNummer] & "'"
Reports!BerichtChecklisteBestueckungLKW.Printer = Application.Printers([Printers])
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteLKW"
DoCmd.Close acReport, "BerichtChecklisteBestueckung"
End If
End Sub
Hallo,
ändere zunächst den Kombifeldnamen in "cmbPrinter". Es muss ein gültiger Druckername in der ersten Spalte der Kombiliste stehen.
Benutz de acPreview-Parameter. AcHidden steht an falscher Stelle.
Setze zusätzlich den Fokus auf den jeweiligen Bericht:
Private Sub cmbPrinter_AfterUpdate()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
Reports!BerichtChecklisteLKW.Printer = Application.Printers(Me!cmbPrinter)
Docmd.SelectObject acReport, "BerichtChecklisteLKW"
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteLKW"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
Reports!BerichtChecklisteBestueckungLKW.Printer = Application.Printers(Me!cmbPrinter)
Docmd.SelectObject acReport, "BerichtChecklisteBestueckungLKW"
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteBestueckungLKW"
End If
End Sub
Wenn es noch mehr Berichte gibt, die ausgedruckt werden sollen, könnte der Code in eine Public Sub oder - Function ausgelagert werden...
ZitatAcHidden steht an falscher Stelle
Ich liebe
benannte Parameter. ;)
Hallo Franz.
Läuft nicht bei mir ...... auch der Code nicht ;D
Kommt keine Fehlermeldung und kein Druck. Habe den Code stück für Stück getestet.
Habe nach der Auswahl des verfügbaren Druckers durch"cmbPrinter", ein Button "Drucken" angelegt und dort den Code eingegeben.
Private Sub Drucken_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
Reports!BerichtChecklisteLKW.Printer = Application.Printers(Me!cmbPrinter)
Docmd.SelectObject acReport, "BerichtChecklisteLKW"
bis da funktioniert er. Nun ist der Bericht nach dem ersten cmd (,acHidden) wieder durch den 3. Satzt cmd (SelectObject...) wieder sichtbar und da bleibt er stehen, Kein Druck und kein schließen des Bericht.
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteLKW"
End If
End Sub
Bei Private Sub cmbPrinter_AfterUpdate()
hatte es auch nicht funktioniert, daher habe ich zur Sicherheit den Button "Drucken" angelegt.
Kann ich hinter Reports!BerichtChecklisteLKW.Printer = Application.Printers(Me!cmbPrinter)
den ausgewählten Drucker zur Kontrolle irgendwie "Sichtbar" machen, durch z.b.: MsgBox oder so?
Hallo,
mit
Debug.Print Me!cmbPrinter
(MsgBox Me!cmbPrinter geht natürlich auch)
kannst Du den ausgewählten Druckernamen, sofern die Namen in der ersten (0-ten) Spalte des Kombi-Listenteils stehen, im Direktfenster ausgeben.
Wie wird das Kombi denn gefüllt, d. h., wie lautet dessen Datensatzherkunft?
Welche Access-Version ist im Einsatz?
Mögliche Ablauffolge:
* Standarddrucker merken
* anderen Drucker als Standarddrucker festlegen
* Berichte drucken
* Standdarddrucker zurücksetzen
Hier in einem Formular-Modul realisiert.Private Declare PtrSafe Function SetDefaultPrinterW Lib "winspool.drv" ( _
ByVal pszPrinter As LongPtr) As Long
Private m_OldDefaultPrinter As String
Private Sub Form_Load()
'Standarddrucker merken
m_OldDefaultPrinter = Application.Printer.DeviceName
End Sub
Private Sub Form_Unload(Cancel As Integer)
'Standarddrucker zurücksetzen
SetDefaultPrinterW StrPtr(m_OldDefaultPrinter)
End Sub
'Kombifeld mit Druckernamen
Private cboChangeDefaultPrinter_AfterUpdate()
'neuen Standarddrucker festlegen
SetDefaultPrinterW StrPtr(Me.cboChangeDefaultPrinter)
End Sub
Nach Auswahl des Druckers im Kombifeld, Bericht(e) ganz normal drucken oder in der Seitenvorschau anzeigen.
Und natürlich überall eine Fehlerbehandlung einbauen, damit beim Schliueßen des Formulars auch der ursprüngliche Standarddrucker wieder erfolgreich zurückgesetzt werden kann.
Hallo,
m. E. muss die Printer-Eigenschaft funktionieren... Das Umswitchen des Standard-Druckers war in älteren A-Versionen erforderlich und sollte durch die vor einiger Zeit neu eingeführte Printers-Auflistung nicht mehr nötig sein.
Zudem gibt es auch noch die Einstellung "Spezieller Drucker", um einen Bericht permanent einen bestimmten Drucker zuzuweisen.
Zitat
Nun ist der Bericht nach dem ersten cmd (,acHidden) wieder durch den 3. Satzt cmd (SelectObject...) wieder sichtbar und da bleibt er stehen, Kein Druck und kein schließen des Bericht.
Ist ein "gültiger" Druckername ausgewählt?
Wurde die DB nach Fehlern nochmal neu gestartet? Es könnte sein, dass manche Berichte noch unsichtbar geöffnet sind.
Wenn es immer noch nicht geht, lad mal eine abgespeckte Version hier gezippt hoch.
@ Franz: AC2013 und das cmbPrinter hat den Datensatzherkunft auf "Wertliste" stehen. Angezeigt bekomme ich die auch, nach Auswahl. Hatte zusätzlich zur "kontrolle" ein Textfeld zum Anzeigen eingefügt. Die Abfrage mit "MsgBox Me.cmbPrinter" zeigt hinter Private Sub Drucken_Click()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
den ausgewählten Drucker an. Hinter Reports!BerichtChecklisteLKW.Printer = Application.Printers(Me!cmbPrinter)
kommt dann schon nichts mehr.
Hallo,
Fülle mal das Kombi so, wie hier beschrieben: http://www.donkarl.com/?FAQ5.1
und lad die DB hier hoch....
PS: noch ein Hinweis: Möglicherweise mag die Printers-Auflistung keinen Variant-Wert als Index. Insofern schreib:
....=Application.Printers(CStr(Me!cmbPrinter))
@Franz,
zur Zuweisung eines speziellen Druckers an einen Bericht muss AFAIK der Bericht im Design-Modus geöffnet vorliegen, was z. Bsp. von keiner MDE/ACCDE bewältigt werden kann.
Juhuuuuu..... FRANZ, mein Held.... die andern natürlich auch. ;D
So machte es spaß, zusammen mit euch den Kopf (meinen Kopf) rauchen zu lassen.
Dein Hinweis:
Möglicherweise mag die Printers-Auflistung keinen Variant-Wert als Index. Insofern schreib:
....=Application.Printers(CStr(Me!cmbPrinter))
war die Lösung.
p.s.: @Lachtaube, deinen Code werde ich mir auch mal anschauen !
Vielen vielen vielen Dank Euch allen.
Hallo,
ja, das stimmt, deshalb sagte ich ja auch "permanent" ;)
Das ist auch nur als weitergehende Alternative zu verstehen und geht zugegebenermaßen etwas am Thema bzgl. der Druckerauswahl vorbei.
@ Icemann1970: na denn .... ;D
Hallo zusammen. Die Drucker Auswahl und Druckfunktion funktioniert, habe aber ein Schönheitsfehler im Code. Hinweis: Aufgeteilte DB (BE/FE), die BE ist auf Netzwerk, Das Netzwerk wird jede Nacht neu gestartet und da ist mein Problem. Der jetzt festgelegte Drucker wird am nächsten Tag nicht erkannt und es kommt eine Meldung (Falscher Drucker , neu einstellen, Bearbeiten... bla,bla....).
Ich denke mir, dass es sinniger ist wie von Lachtaube in der Antwort 15 vorgeschlagen den Standarddrucker zu "merken" und nach Beendigung wieder "zuzuweisen"
Leider bekomme ich das nicht hin.
Jetziger Code lautet:
Private Sub cmbPrinter_Enter()
Dim prtloop As Printer
Me!cmbPrinter.RowSource = ""
For Each prtloop In Application.Printers
Me!cmbPrinter.AddItem prtloop.DeviceName
Next prtloop
End Sub
Private Sub cmbPrinter_AfterUpdate()
If Me.Kategorie = "LKW" Then
DoCmd.OpenReport "BerichtChecklisteLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
Reports!BerichtChecklisteLKW.Printer = Application.Printers(CStr(Me!cmbPrinter))
Docmd.SelectObject acReport, "BerichtChecklisteLKW"
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteLKW"
DoCmd.OpenReport "BerichtChecklisteBestueckungLKW", acPreview, , "[GeräteNummer] = '" & Me![GeräteNummer] & "'", acHidden
Reports!BerichtChecklisteBestueckungLKW.Printer =Application.Printers(CStr(Me!cmbPrinter))
Docmd.SelectObject acReport, "BerichtChecklisteBestueckungLKW"
DoCmd.PrintOut
DoCmd.Close acReport, "BerichtChecklisteBestueckungLKW"
End If
End Sub
Kann mir einer dabei behilflich sein?
Du kannst in einem Bericht nur in der Entwurfsansicht den Drucker ändern, was ja auch hier im Thema nachzulesen ist.
Mein Code ist doch klar und verständlich. Warum setzt Du ihn mit Namensanpassung nicht 1:1 um?
Hallo Lachtaube,
Keine Ahnung was da schiefgelaufen ist. Zigmal neu geschrieben und siehe da ..... jetzt funktioniert es.
Sorry und danke für deine Antwort.