PDA

Vollständige Version anzeigen : Druckseiten


hcscherzer
15.03.2013, 14:47
Gibt es von Access aus irgend eine Möglichkeit, festzulegen, aus welchem Papier-Einzug unterschiedliche Seiten eines Druckauftrags kommen sollen?
Also z.B. die erste Seite aus dem manuellen Einzug und der Rest aus einem bestimmten Fach?

el_gomero
15.03.2013, 14:57
Hi,

schau mal nach PaperBin unter Application.Printer.

hgs_x
15.03.2013, 15:12
Hallo,

schau mal hier nach:

http://support.microsoft.com/?kbid=200546

Gruß hgs

hcscherzer
15.03.2013, 15:35
Danke schon mal für die beiden Anregungen.
Werde es aber erst kommende Woche testen können ...

mengelhardt
25.03.2013, 16:22
Die Microsoft Funktion hat mir den richtigen Weg gezeigt, ist aber dennoch irreführend: Die Fach-Nummern stimmen offensichtlich nicht für jeden Drucker.
Außerdem habe ich beim Speichern mit DoCmd.Save einen "Laufzeitfehler 29068:
Datenbank kann diesen Vorgang nicht abschliessen" bekommen.

Die Tray-Nummern kann man aber für seinen Drucker folgendermaßen heraus bekommen:

Einen Drucker anlegen, bei dem das gewünschte Fach als Standard-Fach angegeben ist. Dann die Funktion *print_available_printers* (siehe Listing für Modul 'PrintUtils') ausführen. Dort sieht man die Drucker mitsamt zugehöriger Fachnummer.

Um die Gesamtanzahl an Seiten für einen Report herauszukriegen, setzt man einfach im 'Page' Event des Reports die Variable PrintUtils.PagesOnCurrentReport:


Private Sub Report_Page()
PrintUtils.PagesOnCurrentReport = Me.txt_pages
End Sub


*Me.txt_pages* wiederum ist ein verstecktes TextBox Control mit folgendem Steuerelementinhalt:


=[Seiten]


Die Lösung mit Paperbin hat bei mir nicht funktioniert.

Hier das Listing für Modul 'PrintUtils'.



' Module PrintUtils

' populate this variable from within the current report
Public PagesOnCurrentReport As Long

Type zwtDevModeStr
RGB As String * 94
End Type

Type zwtDeviceMode
dmDeviceName As String * 16
dmSpecVersion As Integer
dmDriverVersion As Integer
dmSize As Integer
dmDriverExtra As Integer
dmFields As Long
dmOrientation As Integer
dmPaperSize As Integer
dmPaperlength As Integer
dmPaperWidth As Integer
dmScale As Integer
dmCopies As Integer
dmDefaultSource As Integer
dmPrintQuality As Integer
dmColor As Integer
dmDuplex As Integer
dmResolution As Integer
dmTTOption As Integer
dmCollate As Integer
dmFormName As String * 16
dmPad As Long
dmBits As Long
dmPW As Long
dmDFI As Long
dmDRr As Long
End Type


Sub print_on_different_trays(rptName As String, args As String, firstPageTray As Integer, remainingPagesTray As Integer, Optional maxPage)
Dim Rpt As Report
Dim dm As zwtDeviceMode
Dim DevString As zwtDevModeStr
Dim DevModeExtra As String
Dim lastPage As Integer

DoCmd.SetWarnings False
' Set Paper Tray for page 1
DoCmd.OpenReport rptName, acDesign

Set Rpt = Reports(rptName)
DevModeExtra = Rpt.PrtDevMode
DevString.RGB = DevModeExtra
LSet dm = DevString
dm.dmDefaultSource = firstPageTray '1 = Upper Tray, 2 = Lower Tray, 5 = _
Envelope Feeder

LSet DevString = dm
Mid$(DevModeExtra, 1, 68) = DevString.RGB
Rpt.PrtDevMode = DevModeExtra

'DoCmd.Save acReport, Rpt.Name
DoCmd.Close acReport, Rpt.Name, acSaveYes

DoCmd.OpenReport rptName, acViewReport, , args

DoCmd.SelectObject acReport, rptName, True
DoCmd.OpenReport rptName, acViewReport, , args
DoCmd.PrintOut acPages, 1, 1
DoCmd.Close acReport, rptName, acSaveNo

' Set Paper Tray for remaining pages
DoCmd.OpenReport rptName, acDesign
Set Rpt = Reports(rptName)
DevModeExtra = Rpt.PrtDevMode
DevString.RGB = DevModeExtra
LSet dm = DevString
dm.dmDefaultSource = remainingPagesTray ' see right values output by *print_available_printers*
LSet DevString = dm
Mid$(DevModeExtra, 1, 68) = DevString.RGB
Rpt.PrtDevMode = DevModeExtra
DoCmd.Close acReport, Rpt.Name, acSaveYes
DoCmd.SelectObject acReport, rptName, True
DoCmd.OpenReport rptName, acViewReport, , args

If IsMissing(maxPage) Then
lastPage = PagesOnCurrentReport
Else
lastPage = maxPage
End If

DoCmd.PrintOut acPages, 2, lastPage
DoCmd.Close acReport, rptName, acSaveNo

DoCmd.SetWarnings True
End Sub

Public Sub print_available_printers()
Dim prtLoop As Printer

For Each prtLoop In Application.Printers
With prtLoop
Debug.Print "Device name: " & .DeviceName & vbCr _
& "Driver name: " & .DriverName & vbCr _
& "Port: " & .Port & vbCr _
& "PaperBin: " & .PaperBin & vbCr
End With
Next prtLoop

End Sub

hcscherzer
25.03.2013, 16:26
Vielen Dank, Malte.