| Hi,
habe lange rumgedoktert, bis das Problem eingekreist war:
wir haben einige Berichte mit einem hinterlegtem Sonder-Drucker.
Meine Aufgabe ist es nun, für diese Berichte eine Druckersteuerung (je nach Benutzer / PC) einzubauen.
Die Steuerung, wem welcher Drucker zuzuordnen ist funktioniert auch bereits -
es muss also "nur noch" der Bericht mit dem richtigen Drucker geöffnet werden ... eigentlich 5 min (sollte man meinen).
Habe nach einigem googlen erfahren, dass man zunächst den Report "hidden" öffnen muss, damit man einen Drucker zuweisen kann;
das merkwürdige ist nun dabei, dass die Zuordnung der Druckparameter vom SRCdrucker auf den DSTdrucker nicht angenommen werden -
teilweise sind auch einige properties nicht verfügbar (zB DSTdrucker.topmargin) !?
Habe nach langem Testen nun folgende Tatsache festgestellt:
"SRCdrucker.Orientation = SRCdrucker.Orientation" funktioniert nicht (ohne Fehlermeldung):
SRCdrucker.Orientation steht "2", in SRCdrucker.Orientation steht "1" nach dem Statement aber auch immer noch (?!?!).
Funktionieren tut das ganze nur, wenn man dem Bericht den neuen Drucker zuordnet und dann mit dem "Berichtsdrucker" weiterarbeitet !!!
Das ist zwar auch möglich, man müsste sich aber dann alles Druckereinstellungen, die man aus dem Bericht ja übernehmen will,
in einzelnen Zwischenvariablen speichern ... das muss doch anders gehen !
Nun mal zur Frage: ist das eine Art Berechtigungsproblem (config: W7 & Access 2007), dass man die Druckereinstellung im DSTdrucker nicht ändern darf ?
(bin eigentlich aber auch als Admin angemeldet, im "Geräte und Drucker" geht das ohne Probleme).
Hier mal der Code:
DoCmd.OpenReport sBerichtsname, acViewDesign, , , acHidden
If Not Reports(sBerichtsname).UseDefaultPrinter Then
Set SRCdrucker = Reports(sBerichtsname).Printer
Else
Set SRCdrucker = Application.Printer
End If
If bDebug Then
LOGtextAdd ("alt Berichts-Info - Device:" & Reports(sBerichtsname).Printer.DeviceName)
LOGtextAdd ("alt Berichts-Info - Orientation:" & Reports(sBerichtsname).Printer.Orientation)
End If
If sDruckerName <> "" Then
If SRCdrucker.DeviceName <> DSTdrucker.DeviceName Then
LOGtextAdd ("Drucker geändert für Report: " & SRCdrucker.DeviceName & " => " & DSTdrucker.DeviceName)
DSTdrucker.Orientation = SRCdrucker.Orientation ' *** geht nicht !?!? ***
Reports(sBerichtsname).Printer = DSTdrucker
Reports(sBerichtsname).Printer.Orientation = acPRORLandscape '*** das geht !!! ***
End If
End If
If bDebug Then
LOGtextAdd ("neu Berichts-Info - Device:" & Reports(sBerichtsname).Printer.DeviceName)
LOGtextAdd ("neu Berichts-Info - Orientation:" & Reports(sBerichtsname).Printer.Orientation)
End If
DoCmd.OpenReport sBerichtsname, acViewNormal, , , acWindowNormal
DoCmd.Close acReport, sBerichtsname, acSaveNo
P.S.:
im MSDN steht unter "Programming Printer Settings in Microsoft Access 2002" der folgende Code:
' Initialize rpt variable.
Set rpt = Reports!Invoice
' Save the report's current printer settings
' in the prtOld variable.
Set prtOld = rpt.Printer
' Load the report's current printer settings
' into the prtNew variable.
Set prtNew = rpt.Printer
' Change the report's Orientation property.
prtNew.Orientation = acPRORLandscape
' Change other Printer properties, and then print
' or perform other operations here.
' If you comment out the following line of code,
' and a user interactively closes the report preview
' any changes made to properties of the report's Printer
' object are saved when the report is closed.
Set rpt.Printer = prtOld
Das geht bei mir so auch nicht, da "Set prtOld = rpt.Printer" und "Set prtNew = rpt.Printer"
auf die gleichen Objekte referenzieren (!) und somit eine Änderung an prtNew sofort auch prtOld verändert !
Da scheinen die selber auch nicht den richtigen Plan zu haben ... |