Berichte lassen sich dank der unterschiedlichen Bereiche bereits sehr flexibel gestalten. Manchmal reicht dies aber nicht aus – zum Beispiel, wenn mehrere Datensätze in eine Zeile, mehrfach oder gar nicht gedruckt werden sollen. In diesem Fall helfen die drei Eigenschaften MoveLayout, NextSection und PrintSection in diversen Kombinationen weiter.
Wozu mehr Flexibilität
Das Standardbeispiel für den Einsatz zumindest von zwei der oben genannten Eigenschaften ist der Etikettendruck. Es sollen meist mehrere Datensätze in einer Zeile gedruckt werden und die Anzahl der Exemplare je Datensatz variiert von keinem bis beliebig vielen.
Dass man dazu allenfalls noch die Eigenschaft MoveLayout benötigt, wenn man die Datenherkunft des Berichts vorher entsprechend anpasst, haben wir bereits in [1] gezeigt.
Access-Berichte bieten nur wenig Flexibilität, wenn es beispielsweise um mehrspaltige Berichte geht. So können Sie beispielsweise ohne Unterbericht und sonstige Tricks keinen einspaltigen Gruppenkopf mit zweispaltigen Detaildatensätzen realisieren. Die Seiteneinrichtung liefert zwar die Möglichkeit, mehrspaltige Berichte einzurichten und auch die Reihenfolge (von links nach rechts, von oben nach unten) festzulegen, aber Bereiche wie Gruppenköpfe oder -füße werden dort nicht berücksichtigt. Wenn Sie etwa den Bericht mit der Entwurfsansicht aus Bild 1 mit den Einstellungen aus Bild 2 ausgeben, erhalten Sie den Bericht aus Bild 3.
Bild 1: Entwurf eines zweispaltigen Berichts
Bild 2: Einstellungen für einen zweispaltigen Bericht
Bild 3: Verunglückter zweispaltiger Bericht mit Gruppierung nach Kategorien
Ein besseres Ergebnis erhalten Sie, wenn Sie die Mehrspaltigkeit selbst realisieren. Dazu stellen Sie einfach die Spaltenanzahl wieder auf den Wert 1 ein und gehen wie folgt vor.
MoveLayout – nächste Zeile oder nicht
Die Eigenschaft MoveLayout legt fest, ob der Inhalt des folgenden Bereichs in den aktuellen Bereich hineingeschrieben werden soll. Um dies zu verstehen, muss man wissen, dass Access Berichte Bereich für Bereich aufbaut. Bei allen Bereichen gibt es wiederum Prüfungen, ob diese noch auf die aktuelle Seite passen, ansonsten werden die notwendigen Schritte unter den gegebenen Bedingungen noch einmal wiederholt.
Im vorliegenden Fall wird Access zunächst den Gruppenkopf-Bereich der ersten Artikelkategorie anlegen und dann mit den Detaildatensätzen fortfahren – bis ein Datensatz nicht mehr auf die aktuelle Seite passt und eine neue Seite begonnen wird.
Sie können in das Erstellen von Bereichen einwirken, indem Sie VBA-Code etwa für die Beim Formatieren-Ereignisprozeduren anlegen. Eine Möglichkeit, den Ablauf zu beeinflussen, ist das Setzen der Eigenschaft MoveLayout auf den Wert False. Diese Eigenschaft wird von Access standardmäßig vor dem Abarbeiten dieser Ereigniseigenschaft auf den Wert True gesetzt, sodass normalerweise nach dem Schreiben des aktuellen Bereichs der folgende Bereich beschrieben wird.
Wenn Sie die Ereignisprozedur, die beim Formatieren des Detailbereichs ausgelöst wird, wie folgt füllen, springt Access bei keinem der Detaildatensätze zum nächsten, darunterliegenden Bereich, sondern schreibt alle Datensätze in den gleichen Bereich. Dass dies keinen Sinn ergibt, zeigt Abb. 4.
Bild 4: Stellt man die Eigenschaft MoveLayout für den Detailbereich auf False, druckt Access alle Datensätze einer Grupierung in den gleichen Detailbereich.
Die gleiche Wirkung erhalten Sie übrigens auch, wenn Sie MoveLayout für andere Bereiche wie Berichts-, Seiten- oder Gruppierungsköpfe und -füße auf False einstellen – Sie erhalten dann einen Bericht in sehr kompakter, aber ziemlich schlecht lesbarer Form.
MoveLayout will daher sehr gezielt eingesetzt werden, etwa, um Daten in zwei oder mehr Spalten anzuzeigen, was bedeutet, dass man nach dem Ausgeben des jeweils ersten Datensatzes MoveLayout auf False einstellt und die Steuerelemente des zweiten Datensatzes weiter rechts platziert.
Wenn Sie einen Bericht mit der Entwurfsansicht aus Bild 5 zweispaltig gestalten möchten, legen Sie die Ereigniseigenschaft Beim Formatieren des Detailbereichs an (Detailbereich markieren, Doppelklick in Eigenschaft Beim Formatieren, Klick auf die danebenliegende Schaltfläche) und füllen diese wie in Listing 1.
Bild 5: Entwurfsansicht eines Berichts, der zweispaltig ausgegeben werden soll. Im Gegensatz zu einem Bericht, bei dem Sie über die Seiteneinrichtung Zweispaltigkeit erreichen wollen, müssen Sie die Breite dieses Berichts direkt auf zwei Spalten auslegen.
Listing 1: Aufteilen von Steuerelementen auf zwei Spalten
Dim intArtikel As Integer Const intAbstand As Integer = 4000 Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer) intArtikel = intArtikel + 1 If intArtikel Mod 2 = 1 Then Me.MoveLayout = False Me!Bezeichnungsfeld0.Left = 0 Me!ArtikelID.Left = 1000 Me!Bezeichnungsfeld1.Left = 0 Me!Artikelname.Left = 1000 'weitere Steuerelemente Else Me!ArtikelID.Left = 1000 + intAbstand Me!Bezeichnungsfeld0.Left = 0 + intAbstand Me!Artikelname.Left = 1000 + intAbstand Me!Bezeichnungsfeld1.Left = 0 + intAbstand 'weitere Steuerelemente End If End Sub
Das Prinzip ist einfach: Der Zähler intArtikel wird für jeden Datensatz um eins erhöht. Die If-Bedingung prüft, ob intArtikel gerade oder ungerade ist. Ist intArtikel gerade, wurde soeben ein Datensatz in die linke Spalte geschrieben. Dann gehört der folgende Datensatz in die rechte Spalte der gleichen Zeile, also setzt die Routine MoveLayout auf False.
Beim nächten Datensatz enthält intArtikel eine gerade Zahl, wodurch die Steuerelemente nach rechts verschoben werden. MoveLayout wird nicht auf False gesetzt, was dazu führt, dass es den Wert True behält, den Access ihm vor der Format-Eigenschaft eines jeden Bereichs zuweist.
Damit wäre die Aufgabe fast erledigt, wenn Access nicht so lange versuchen würde, Datensätze auf eine Seite zu quetschen, bis keiner mehr draufpasst, und den nicht mehr passenden Datensatz dann auf der nächsten Seite ausgäbe.
Dadurch löst es nämlich das Beim Formatieren-Ereignis zweimal aus – einmal für den Versuch, den Datensatz noch auf die aktuelle Seite zu schreiben, und einmal für das tatsächliche Schreiben auf die folgende Seite. Um dies zu umgehen, legen Sie kurzerhand noch eine Routine für die Ereigniseigenschaft Bei Seite an, die den Zähler intArtikel beim Seitenwechsel wieder auf 0 setzt.
Zweispaltiger Bericht mit einspaltigem Gruppenkopf
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