Berichte manuell füllen

Auch wenn man Berichte meist erst gegen Ende eines Projekts programmiert und sie gegenüber der Benutzeroberfläche oft stiefmütterlich behandelt, weiß man doch, wie man Berichte mit Inhalt füllt: Nämlich durch Datenbindung des Berichts an eine Tabelle oder Abfrage und der in den verschiedenen Bereichen eingefügten Felder zur Anzeige der Daten. Es geht aber auch anders: Mit dem Print-Befehl des Report-Objekts drucken Sie Texte an beliebige Stellen der einzelnen Berichtsbereiche. Wie das funktioniert und was Sie damit anstellen können, lesen Sie in diesem Beitrag.

Wer in Access-Berichten die üblichen Pfade verlassen und ausgefallene Szenarien realisieren möchte, muss im Normalfall ein wenig Zeit mitbringen. Mal eben Text in einem Textfeld in unterschiedlichen Schriftarten darstellen, den Inhalt eines Textfelds mittig oder gar am unteren Rand ausrichten oder eine komplette Seite mit Informationen füllen, die nicht aus gebundenen Feldern stammen

Mit Access-Berichten durchaus ein Problem – wenn es denn die Print-Methode des Report-Objekts nicht gäbe.

Mit dieser Methode können Sie Text in beliebigen Schriftarten an beliebigen Stellen in die einzelnen Bereiche eines Access-Berichts schreiben. Der kleine Nachteil ist, dass dies nicht bereichsübergreifend geschehen kann – das schmälert den Nutzen dieser Funktion für Berichte mit dem gewissen Etwas jedoch nicht.

Ereignisreich

Während Sie die Datenherkunft und die Position der gebundenen und ungebundenen Steuerelemente eines Access-Berichts normalerweise zur Entwurfszeit festlegen und diese dann von Access automatisch gefüllt werden, erfolgt der Aufruf des Print-Befehls erst zur Laufzeit, und zwar innerhalb bestimmter Ereignisse. Dabei handelt es sich um die beiden Ereignisse Beim Formatieren und Beim Drucken eines jeden Berichtsbereichs, die auch in dieser Reihenfolge pro Bereich einmal oder mehrmals ausgelöst werden.

Der Unterschied zwischen den beiden Ereignissen ist, dass beim Aufruf von Beim Formatieren noch keine Informationen über die Formatierung des aktuellen Bereichs vorliegen, beim Ereignis Beim Drucken jedoch schon.

Wenn Sie einem Bereich, der in Abhängigkeit vom Inhalt seiner gebundenen Steuerelemente eine unterschiedliche Höhe aufweisen kann, per Print Text hinzufügen möchten, ist es möglicherweise interessant, die endgültige Höhe des Bereichs zu kennen – und dies ist erst im Ereignis Beim Drucken möglich.

Print it

Probieren Sie das einfach mal aus, indem Sie beispielsweise für den Seitenkopf das Ereignis Beim Drucken anlegen und dort einen Print-Befehl unterbringen. Dazu öffnen Sie einen Bericht in der Entwurfsansicht, aktivieren den Seitenkopfbereich durch einen Klick auf den Balken mit der Beschriftung Seitenkopf, klicken auf die Eigenschaft Beim Drucken im Bereich Ereignisse des Eigenschaftsfensters und anschließend auf die nun erscheinende Schaltfläche mit den drei Punkten (…).

Wenn Sie im folgenden Dialog den Eintrag Code-Generator auswählen, öffnet sich der VBA-Editor und präsentiert den automatisch angelegten Rumpf einer Prozedur namens Seitenkopfbereich_Print.

Tragen Sie hier die folgende Anweisung ein und öffnen Sie den Bericht in der Seitenvorschau, um das Ergebnis aus Bild 1 zu erhalten:

pic001.png

Bild 1: Ein erster kleiner Beispieltext

Private Sub Seitenkopfbereich_Print(Cancel As µ
    Integer, PrintCount As Integer)
    Me.Print "Printed by Print"
    End Sub

Es kann sein, dass Sie nun keinen Text sehen, was zum Beispiel daran liegen kann, dass Sie Access 2007 verwenden und den Bericht in der Berichtsansicht geöffnet haben. Diese löst aber weder das Beim Formatieren– noch das Beim Drucken-Ereignis aus. Sie müssen also zur Seitenansicht wechseln. Es kann auch sein, dass der Bereich, in dem der Text gedruckt werden soll, schlicht zu klein bemessen ist. Die Print-Anweisung nimmt keine Rücksicht darauf, ob der auszugebende Inhalt im Zielbereich Platz findet; gegebenenfalls erhalten Sie hier sogar abgeschnittene Zeilen.

Auf die oben angegebene Weise können Sie Texte in alle Berichtsbereiche drucken. Der Text im Detailbereich erscheint auf jeden Fall mindestens einmal, auch wenn die Datenherkunft keine Datensätze enthält.

Von Zeile zu Zeile

Wenn Sie nicht nur eine, sondern mehrere Zeilen drucken möchten, geben Sie einfach mehrere Print-Anweisung hintereinander ein:

Me.Print "Zeile 1"
Me.Print "Zeile 2"

Entgegen der Angabe in der Online-Hilfe führt dies allerdings nur zu einem Wagenrücklauf, nicht jedoch zu einem Zurücksetzen der X-Position auf den Beginn der Zeile. Stattdessen erhalten Sie die Ausgabe aus Bild 2.

pic002.png

Bild 2: Zwei aufeinanderfolgende Print-Anweisungen liefern einen Wagenrücklauf, aber keinen Start am Zeilenbeginn.

Wenn Sie zwei Zeilen direkt untereinander drucken möchten, müssen Sie die X-Position zuvor mit folgender Anweisung auf 0 einstellen:

Me.CurrentX = 0

Damit kommen wir zum Einstellen der Startposition von Texten, die per Print in Berichte geschrieben werden sollen: Neben der Eigenschaft CurrentX gibt es nämlich auch noch die Eigenschaft CurrentY zum Einstellen der y-Koordinate.

Wenn Sie den Text also nicht ganz oben im betroffenen Bereich drucken möchten, sondern weiter unten, müssen Sie den Abstand zum oberen Rand des Bereichs mit der CurrentY-Eigenschaft angeben. Das Gleiche gilt natürlich für den Abstand zum linken Rand; hier kommt die CurrentX-Eigenschaft zum Zuge.

Diese beiden Eigenschaften behalten ihren Wert nach einmaligem Einstellen jedoch nicht, sondern ändern sich mit jedem erneuten Aufruf der Print-Anweisung und definieren die neue Position des Startpunkts für weitere Print-Aufrufe. Als Beispiel geben die folgenden Zeilen die x- und y-Position vor und nach dem Drucken einer Textzeile aus:

Debug.Print Me.CurrentX, Me.CurrentY
Me.Print "Zeile 1"
Debug.Print Me.CurrentX, Me.CurrentY

Das Ergebnis im Direktfenster sieht so aus:

0 0
588 269

Auf diese Weise können Sie gleichzeitig die Höhe und die Breite des soeben ausgedruckten Textes bestimmen. Aber um welche Einheit handelt es sich denn hier überhaupt Normalerweise um Twips. Die Einheit stellen Sie auf zwei Arten ein:

  • Sie legen mit der Eigenschaft ScaleMode einen der gängigen Werte 1 (Twips), 2 (Punkt) oder 3 (Pixel) fest (übrige Werte siehe Online-Hilfe).
  • Sie bestimmen eine eigene Einheit, indem Sie den Bereich durch Angabe von Werten für die Eigenschaften ScaleWidth und ScaleHeight in die gewünschte Anzahl Einheiten aufteilen – die Gesamtbreite und die Gesamthöhe des Bereichs, geteilt durch die für ScaleWidth und ScaleHeight angegebenen Werte, ergibt die Breite beziehungsweise Höhe der neuen Einheit. Wenn der Bereich 15 Zentimeter breit ist und Sie geben für ScaleWidth den Wert 10 an, ist jede Einheit 1,5 Zentimeter breit.

Zusätzlich zur Länge/Breite einer Einheit können Sie deren Ursprung relativ zum bestehenden linken und oberen Seitenrand verändern, und zwar mit den beiden Eigenschaften ScaleLeft und ScaleTop.

Texte aneinanderreihen

Wenn Sie Texte ohne Zeilenumbruch aneinanderreihen möchten, können Sie dem Argument der Print-Anweisung ein Semikolon anhängen:

Me.Print "Text 1 ";
Me.Print "Text 2"

liefert beispielsweise folgende Ausgabe im Bericht:

Text 1 Text 2

Kreuzweise

Mit den hier vorgestellten Befehlen können Sie etwa Kreuztabellen in Berichten realisieren. Ein einfaches Beispiel ist die Darstellung des kleinen 1×1. Dafür ist der Code aus Listing 1 erforderlich und das Ergebnis sieht wie in Bild 3 aus. Beachten Sie, dass der Bereich, in dem diese Matrix gedruckt werden soll, hoch genug ist – anderenfalls wird diese nicht komplett dargestellt. Die Routine durchläuft zwei Schleifen und füllt so zunächst die Spalten der Matrix und dann die Zeilen.

Listing 1: Drucken des kleinen 1×1 im Detailbereich eines Berichts

Dim i As Integer
Dim j As Integer
Me.Print "Kleines 1x1"
For i = 1 To 10
    Me.CurrentX = Me.ScaleWidth / 11 * (i)
    Me.CurrentY = Me.ScaleHeight / 11
    Me.Print i
    For j = 1 To 10
        If i = 1 Then
            Me.CurrentX = 0
            Me.CurrentY = Me.ScaleHeight µ
            / 12 * (j + 1)
            Me.Print j
        End If
        Me.CurrentX = Me.ScaleWidth / 11 * (i)
        Me.CurrentY = Me.ScaleHeightµ
        / 12 * (j + 1)
        Me.Print i * j
    Next j
Next i
Me.Line (0, Me.ScaleHeight / 12 * 2)-µ
(Me.ScaleWidth, Me.ScaleHeight / 12 * 2)
Me.Line (Me.ScaleWidth / 11 * 1, µ
Me.ScaleHeight / 12 * 1)-(Me.ScaleWidthµ
/ 11 * 1, Me.ScaleHeight / 12 * 12)

pic003.png

Bild 3: Das per Print-Anweisung erzeugte kleine 1×1

Damit Sie erkennen, welchen Nutzen das Erstellen einer eigenen Einheit beziehungsweise eines eigenen Rasters haben kann, finden Sie in Listing 2 einige Zeilen Code, die zwar genau das Gleiche durchführen wie die aus Listing 1, die aber von einer normierten Matrix im aktuellen Berichtsbereich ausgehen (hier 11×12). Der eine oder andere mag diese Vorgehensweise vorziehen.

Text eines Textfelds in unterschiedlichen Schriftarten anzeigen

Unter Access ist es nicht möglich, dem Inhalt eines Textfelds verschiedene Formatierungen zuzuweisen – zumindest nicht in Versionen älter als Access 2007. Dort finden Sie zumindest eine spezielle Art von Rich-Text-Format, um Texte zu formatieren.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar