none
Drucken aus einem Formular aufrufen

    Frage

  • Hallo,

    sicher klingt die Frage auf den ersten Blick komisch. Ich habe aber Access so weit abgeriegelt, dass der User nur noch das Formular sieht und Access auch nur über einen Formular-Button verlassen kann.

    Dabei ist leider auch Datei -> Drucken -> Drucken abhanden gekommen. Wie kann ich dem User durch einen Button diese Möglichkeit zur Verfügung stellen? Schnelldruck und Seitenansicht sind nicht unbedingt notwendig, der User soll die Möglichkeit haben einen Drucker auszuwählen und Seitenansicht benötigt er nicht, weil dies schon durch die Report-Vorschau (DoCmd.OpenReport "Sales Report", acViewNormal) realisiert wird.

    Access 2010 in 32-Bit und 64-Bit

    Windows 7

    Vielen Dank im Voraus für die Hinweise

    Bjoern

    Dienstag, 22. Mai 2012 09:35

Antworten

Alle Antworten

    • Als Antwort markiert Bjoern Kulig Mittwoch, 23. Mai 2012 07:48
    Dienstag, 22. Mai 2012 20:08
  • Hallo,

    Danke, so etwas suchte ich.

    Mit freundlichen Grüßen

    Bjoern

    Mittwoch, 23. Mai 2012 07:51
  • Noch ein kleiner Hinweis, falls der Druck durch einen Button gestartet werden soll. Hierzu muss erst das zu druckende Formular aufgerufen werden

    DoCmd.OpenReport "zu druckender Report", acViewReport
    DoCmd.RunCommand acCmdPrint
    DoCmd.Close

    Falls nur die Vorschau, vielleicht bei einem anderen Button, angezeigt werden soll reicht

    DoCmd.OpenReport "R0191_Kunde_aktiv", acViewPreview

    Hier muss der User die Vorschau des Reports selbst schließen.

    Im oberen Fall bekommt der User die Vorschau solange angezeigt bis er den Druckvorgang startet. Danach wird die Vorschau geschlossen. Die Vorschau erscheint mir sinnvoll, damit der User auch sieht was er drucken wird.

    Bjoern

    Mittwoch, 23. Mai 2012 16:02
  • Damit die Sub rund ist, muss ich noch eine Ergänzung machen. Sollte der User beim Aufruf der Druckversion den Druck abbrechen, so gibt es eine Fehlermeldung im Programm. Dies kann man vermeiden. Dies als Beispiel einer komplette Sub

    Private Sub report_Beispiel_Click()

    On Error Resume Next
    DoCmd.OpenReport "R Beispiel", acViewReport
    DoCmd.RunCommand acCmdPrint
    DoCmd.Close

    End Sub

    Bjoern

    Donnerstag, 24. Mai 2012 07:26
  • Hallo!

    In so einem Fall, würde ich den Fehler immer explizit abfangen, damit andere Fehler nicht verschluckt werden.
    Außerdem würde ich bei DoCmd.Close den Bericht angeben, damit nicht irrtümlich etwas anderes geschlossen wird.

    Public Sub PrintReportWithPrintDialog(ByVal ReportName As String, _
                                 Optional ByVal WhereCondition As String = vbNullString, _
                                 Optional ByVal ShowPreview As Boolean = True)
    
       Dim WindowMode As AcWindowMode
    
       If ShowPreview Then
          WindowMode = acWindowNormal
       Else
          WindowMode = acHidden
       End If
    
       DoCmd.OpenReport ReportName, acViewPreview, , WhereCondition, WindowMode
    
    On Error GoTo ErrPrint
    
       DoCmd.RunCommand acCmdPrint
    
    On Error GoTo 0
    
       DoCmd.Close acReport, ReportName
    
       Exit Sub
    
    ErrPrint:
       If Err.Number = 2501 Then
          'Druckdialog wurde abgebruchen
          Resume Next
       Else
          Err.Raise Err.Number, "PrintReportWithPrintDialog - " & Err.Source, Err.Description
       End If
    
    End Sub


    Aufruf:

    Private Sub report_Beispiel_Click()
    
    On Error GoTo Err_
    
       PrintReportWithPrintDialog "R Beispiel"
       Exit Sub
    
    Err_:
       DeineAllgemeineFehlerbehandlung_FehlerAnzeige_Fuer_Anwender
    
    End Sub


    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 24. Mai 2012 08:25
  • Hallo,

    Deine Variante ist viel umfangreicher und bei viel Code innerhalb des Sub auch angebracht. Welche Fehlervarianten sollen bei einem relevanten Statement auftauchen. In meinem Fall empfinde ich es als mit Kanonen auf Spatzen schießen.

    Es existieren jetzt zwei Varianten, von denen sich ein Entwickler die für ihn passendere Variante heraussuchen kann. Insofern ist Dein Lösungsansatz zu begrüßen.

    Mit freundlichen Grüßen

    Bjoern

    Donnerstag, 24. Mai 2012 10:58
  • Hallo!

    Meine Variante wird aber schnell weniger umfangreich, wenn du mehrere Berichte auf diese Art drucken willst, da PrintReportWithPrintDialog eine wiederverwendbare Prozedur ist. Der eigentliche Aufruf besteht dann nur noch aus einer einzigen Zeile.

    Außerdem sollte meiner Ansicht nach die Zeilenanzahl eines Codes keine allzu große Rolle spielen. Wichtig bei Code ist für mich, dass er "sauber" arbeitet. ;-)

    Bei deiner Variante hast du On Error resume next vor das Öffnen des Berichtes gesetzt. Kommt es nun innerhalb des Berichtes zu einem Fehler, wirst du das nicht mehr bemerken. ... Eigentlich wolltest du doch nur das Abbrechen des Druckdialogs abfangen und nicht jeden Fehler übregehen, oder?

    Daher: Fehler exakt abfangen, um andere Fehler nicht zu verheimlichen. Zumindest ist das meine Vorstellung von einer sauberen Fehlerbehandlung. ;-)

    Deine Variante etwas anders gestaltet:

    DoCmd.OpenReport "R Beispiel", acViewReport
    On Error Resume Next
    DoCmd.RunCommand acCmdPrint
    On error goto 0
    Ddocmd.Close acReport, "R Beispiel"

    Damit werden wenigsten nur noch die Fehler von RunCommand acCmdPrint übergangen.

    BTW: Im Nachhinein betrachtet würde ich den Parameter "ShowPreview" von PrintReportWithPrintDialog direkt mit WindowMode tauschen, damit man als Nutzer der Prozedur mehr Einstellungsmöglichkeiten hat.

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Donnerstag, 24. Mai 2012 11:12