Home > Artikel > Ausgabe 6/2017 > Zeilenvorschub in Berichten steuern

Zeilenvorschub in Berichten steuern

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Es gibt einige Möglichkeiten, den Zeilenvorschub bei der Ausgabe in Berichten zu steuern. Dazu gehört die Eigenschaft MoveLayout, die Sie in entsprechenden Ereignissen eines Berichts setzen können, um die Ausgabe des Detailbereichs zu steuern. Ein schönes Beispiel dazu ist die Ausgabe eines Monatskalenders, bei dem jeweils eine Zeile eine Woche abbildet und jede neue Woche in einer weiteren Zeile beginnt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1706_BerichtsausgabeSteuern.accdb.

Vorbereitungen

Als Beispiel für die Eigenschaften eines Berichts, um mehrere Datensätze in einer Zeile anzuzeigen oder einen Zeilenvorschub zu bewirken, verwenden wir eine Tabelle namens tblDatumswerte. Diese soll im Feld Datumswert einige hundert Datumswerte enthalten, mit denen wir im Bericht komfortabel experimentieren können. Der Entwurf dieser Tabelle ist einfach gehalten und umfasst neben dem obligatorischen (und hier noch nicht einmal nötigen) Primärschlüsselfeld noch das Feld Datumswert (siehe Bild 1).

Entwurf der Datumstabelle

Bild 1: Entwurf der Datumstabelle

Diese Tabelle füllen wir mit der Prozedur DatumsangabenSchreiben, welche Sie im Modul mdlTools der Beispieldatenbank finden. Die Prozedur sieht wie in Listing 1 aus und durchläuft eine Schleife, in der jeweils ein Datensatz zur Tabelle hinzugefügt wird, bis 1.001 Datumsangaben in der Tabelle liegen. Die Schleife läuft über eine Datumsvariable namens datCurrent, der Startwert ist der 1.1.2017, der Endwert ist dieses Datum plus 1.000.

Public Sub DatumsangabenSchreiben()

     Dim db As DAO.Database

     Dim datCurrent As Date

     Dim datStart As Date

     Set db = CurrentDb

     datStart = "1.1.2017"

     db.Execute "DELETE * FROM tblDatumswerte", dbFailOnError

     For datCurrent = datStart To datStart + 1000

         db.Execute "INSERT INTO tblDatumswerte(Datumswert) VALUES(" & Format(datCurrent, "\#yyyy\-mm\-dd\#") & ")", dbFailOnError

     Next datCurrent

End Sub

Listing 1: Füllt die Tabelle tblDatumswerte mit 1.000 Datensätzen

Das Ergebnis sieht in der Tabelle wie in Bild 2 aus.

Gefüllte Datumstabelle

Bild 2: Gefüllte Datumstabelle

Datum im Bericht

Nun wollen wir den Bericht erstellen, für den wir vorerst die folgende Vorgabe festlegen wollen: Er soll in einer Zeile sieben Datumsangaben anzeigen und dann in der nächsten Zeile mit den Datumsangaben fortfahren. Um die Wochentage et cetera kümmern wir uns vorerst nicht.

Als Erstes legen wir einen neuen Bericht namens rptKalender an, dem wir als Datenherkunft die Tabelle tblDatumswerte hinzufügen. Dann ziehen Sie das Feld Datumswert aus der Feldliste in den Detailbereich des Berichtsentwurfs und entfernen das Bezeichnungsfeld dieses Steuerelements. Schieben Sie das Steuer­element dann nach ganz links oben. Ändern Sie seine Größe so, dass es sieben Mal nebeneinander in den Bericht passt (siehe Bild 3).

Einfügen des Feldes zur Anzeige des Datums

Bild 3: Einfügen des Feldes zur Anzeige des Datums

Wenn Sie den Bericht nun in der Seitenansicht öffnen, werden die Datumswerte natürlich alle untereinander angezeigt (siehe Bild 4). Bevor wir dafür sorgen, dass sieben Datensätze je Zeile angezeigt werden, entfernen wir noch die alternierenden Hintergrundfarben und die Textrahmen. Stellen Sie dazu für den Detailbereich die Eigenschaft Alternative Hintergrundfarbe auf den gleichen Wert ein wie die Eigenschaft Hintergrundfarbe sowie die Eigenschaft Rahmenart des Textfeldes auf den Wert Transparent.

Bericht in der herkömmlichen Ansicht mit einem Datensatz je Zeile

Bild 4: Bericht in der herkömmlichen Ansicht mit einem Datensatz je Zeile

Mehrere Datensätze pro Zeile

Nun kümmern wir uns um die Wiederholung der Datensätze pro Zeile. Dazu fügen Sie für den Detailbereich des Berichts eine Ereignisprozedur für das Ereignis Beim Formatieren hinzu (siehe Bild 5).

Einfügen einer Ereignisprozedur für Beim Formatieren

Bild 5: Einfügen einer Ereignisprozedur für Beim Formatieren

In einem ersten Versuch stellen wir in dieser Prozedur die Eigenschaft MoveLayout auf den Wert False ein:

Private Sub Detailbereich_Format(Cancel As Integer, _

FormatCount As Integer)

Me.MoveLayout = False

End Sub

Dies führt uns bereits in die richtige Richtung, aber noch nicht vollständig: Wie Bild 6 zeigt, erfolgt nun kein Zeilenwechsel mehr. Allerdings werden nun alle Datensätze der Tabelle übereinander abgebildet. Wir sorgen nun im nächsten Schritt dafür, dass die Elemente immer eine Position weiter nach rechts rücken.

Alle Datensätze werden übereinander geschrieben.

Bild 6: Alle Datensätze werden übereinander geschrieben.

Dazu behelfen wir uns der Einstellung der Eigenschaft Left, welche den Abstand eines Steuerelements vom linken Rand angibt. Wir führen eine modulweit zugängliche Variable namens intPosition ein, welche die Position des Textfeldes für den aktuellen Datensatz speichern soll. Dieser Wert wird immer beim Aufruf der Beim Formatieren-Ereignisprozedur um eins erhöht. Da dies wie in Listing 2 immer zu Beginn der Prozedur geschieht, lautet dieser Wert beim ersten Durchgang also beispielsweise 1. Wenn intPosition größer als 7 wird, soll es wieder auf den Wert 1 eingestellt werden. Immer nach der Ermittlung des aktuellen Wertes für intPosition stellt die Prozedur die Eigenschaft Left ein, und zwar auf die über die Eigenschaft Width ermittelte Breite multipliziert mit intPosition - 1.

Dim intPosition As Integer

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)

     Me.MoveLayout = False

     intPosition = intPosition + 1

     If intPosition > 7 Then

         intPosition = 1

     End If

     Me!Datumswert.Left = Me!Datumswert.Width * (intPosition - 1)

End Sub

Listing 2: Die Datensätze sollen nun auf sieben Positionen aufgeteilt werden.

Für den ersten Datensatz beträgt der Wert für Left also 0, da intPosition - 1 gleich 0 ist und auch das Produkt somit zu 0 wird. Die Breite des Steuerelements beträgt aktuell 1206, also wird das Steuerelement durch Einstellen der Eigenschaft Left auf diesen Wert für den zweiten Datensatz genau rechts neben dem ersten Textfeld platziert. Auf diese Weise geht es weiter, bis das siebte Feld mit dem Wert 1206 * 6 für die Eigenschaft Left ganz rechts angelegt wird und intPositon für den folgenden Datensatz wieder auf den Wert 1 gesetzt wird.

Auf diese Weise erhalten wir das Ergebnis aus Bild 7. Nun wollen wir als Nächstes alle sieben Datensätze einen Zeilen­umbruch einfügen.

Nun sind die Datensätze immerhin auf sieben Spalten aufgeteilt.

Bild 7: Nun sind die Datensätze immerhin auf sieben Spalten aufgeteilt.

Jede Woche in einer Zeile

Wir haben mit der Einstellung der Eigenschaft MoveLayout auf den Wert False dafür gesorgt, dass wir nicht in die nächste Zeile rutschen. Wir müssten nun also alle sieben Datensätze einmal MoveLayout auf den Wert True einstellen. Wenn wir das naiverweise wie folgt erledigen, erhalten wir allerdings das Ergebnis aus Bild 8:

Die Zeilenumbrüche sind da, aber falsch.

Bild 8: Die Zeilenumbrüche sind da, aber falsch.

Me.MoveLayout = False

intPosition = intPosition + 1

If intPosition > 7 Then

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!