Laufende Nummerierung für Berichte

Datenbank

In einem Access-Bericht geben Sie normalerweise alle Datensätze einer Tabelle oder bei Einsatz eines Filters gezielt eine bestimmte Datensatzgruppe aus. Dieses Verfahren ist allerdings nicht geeignet, wenn Sie gezielt einen bestimmten Datensatz mehrfach ausgeben möchten, wie das unter anderem bei Eintrittskarten, Verpackungsaufklebern oder Preisetiketten der Fall ist. Kommt dann noch eine automatische Nummerierung hinzu, die bei spielsweise für Seriennummern benötigt wird, erhöht das den Schwierigkeitsgrad noch einmal erheblich. Wir zeigen anhand eines konkreten Beispiels, wie Sie mit wenig Aufwand zum Ziel kommen.

Öffnen sie die Datenbank und rufen dann das Formular „frmArtikel“ auf. Es zeigt die Datensätze der Tabelle „Artikel“ in der üblichen Formularansicht, sodass Sie mit den Navigationsschaltflächen die Details aller Datensätze betrachten können.

Einzige Besonderheit des Artikelformulars ist die Schaltfläche SERIENNUMMERN im Formularfuß. Klicken Sie die Schaltfläche an, nachdem Sie einen Artikel ausgewählt haben, für den Sie Verpackungsaufkleber mit Seriennummern drucken wollen.

Im Formular mit dem Titel SERIENNUMMERN DRUCKEN haben Sie nun Gelegenheit, den Bereich der Seriennummern einzugeben – beispielsweise VON „1“ BIS „10“. An schließend klicken Sie auf DRUCK VORSCHAU, um sich das Resultat am Bildschirm anzusehen.

Wichtig dabei: Sobald Sie das Berichtslayout überprüft haben, kehren Sie mit der Symbolleisten-Schaltfläche SCHLIEßEN zum Formular SERIENNUMMERN DRUCKEN zurück. Versuchen Sie nicht, den Bericht direkt aus dem Vorschaufenster zu drucken! Sie erhalten dann nur leere Seiten. Das liegt an den VBA-Prozeduren, die für die Nummerierung zuständig sind. Sie werden nur einmal beim Öffnen des Berichts ausgeführt. Ein Starten des Druckvorgangs aktiviert die Prozeduren nicht erneut.

Wenn Sie den Bericht mit seinen fortlaufenden Seriennummern auf dem Drucker ausgeben wollen, klicken Sie im Formular SERIENNUMMERN DRUCKEN auf die Schaltfläche BERICHT DRUCKEN.

So werden Berichte per VBA nummeriert

Die Funktionalität des Beispiels ergibt sich komplett durch VBA-Routinen in den Formularen „frmArtikel“ (dem Formular mit der Artikelliste) und „frmSNDrucken“ (dem Formular mit dem Titel SERIENNUMMERN DRUCKEN) sowie im Bericht „repEinzelartikel“.

Aus der normalen Datenbank-Eingabemaske öffnen Sie per Schaltfläche das Formular „frmSNDrucken“. Die entsprechende Ereignisprozedur lautet:

Private Sub cmdSNDrucken_Click()
DoCmd.OpenForm _
FormName:=“frmSNDrucken“, _
OpenArgs:=Me![Artikel-Nr]
End Sub

Eine Schaltfläche mit diesem Programmcode lässt sich leicht in Ihre eigenen Datenbankanwendungen integrieren. Beachten Sie dabei, dass das Filterkriterium, das den Bericht auf einen einzelnen Datensatz beschränken soll, als „OpenArgs“- Parameter übergeben wird. Im Beispiel dient die Artikelnummer als ein schränkendes Kriterium.

Das Formular „frmSNDrucken“, in dem Sie Start- und Endzahl der Seriennummer eingeben, hat ansonsten nur die Aufgabe, den Bericht zu öffnen. Dabei leitet es das Filterkriterium an den Bericht weiter. Hier zum Beispiel der Programmcode für die direkte Druckausgabe:

Private Sub cmdPrint_Click()
[…]
DoCmd.OpenReport _
ReportName:=“repEinzelartikel“, _
View:=acViewPreview, _
WhereCondition:=“[Artikel-Nr]=“ & Me.OpenArgs
[…]
End Sub

Die Zeilen, die im Listing übersprungen und mit den Platzhaltern „[…]“ gekennzeichnet sind, dienen lediglich dazu, Eingabefehler auszuschließen. So wird etwa geprüft, ob überhaupt Start- und Endwerte eingetragen worden sind und ob der Endwert größer ist als der Startwert.

Die automatische Nummerierung steuert der Be richt selbst. Beim Öffnen liest er Start- und Endnummer aus dem Formular „frmSN Drucken“ aus. Gespeichert wer den diese Werte in den Variablen „lngErsteSN“ und „lngLetzteSN“. Die Variablen sind am Anfang des Berichtscodes auf Modul ebene deklariert, damit sie auch in den an deren Berichtsprozeduren verfügbar sind.

Neben der Initialisierung der Variablen enthält die Ereignisprozedur „Report_Open“ einige Anweisung zur Vermeidung von Fehlermeldungen beim direkten Öffnen

Private Sub Report_Open(Cancel As Integer)
On Error Resume Next
lngErsteSN = Forms!frmSNDrucken!txtStartNr.Value
If Err <> 0 Then
MsgBox „Bericht muss per Formular geöffnet werden“
Cancel = True
Else
lngLetzteSN = Forms!frmSNDrucken!txtEndNr.Value
End If
End Sub

des Berichts aus dem Datenbankfenster.

Dass Access den Bericht mehrfach für einen einzigen Datensatz ausgibt und dabei jedes Mal eine fortlaufende Nummer einfügt, verdanken Sie einer zweiten Ereignisprozedur.

Sie wird „beim Drucken“ des „Detailbereichs“ ausgeführt und enthält folgenden Code:

Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer)
If lngErsteSN <= lngLetzteSN Then
Me.txtSerienNr = Format(lngErsteSN, „00000“)
lngErsteSN = lngErsteSN + 1
Me.NextRecord = False
Else
Cancel = True
End If
End Sub

Der Aufruf der Prozedur erfolgt automatisch – entweder beim direkten Drucken des Berichts oder beim Erstellen der Berichtsvorschau am Bildschirm. Solange die Anfangsseriennummer kleiner als oder gleich groß wie die Endseriennummer ist, schreibt die Prozedur den aktuellen Wert in einem fünfstelligen Format in das Feld „txtSerienNr“.

Dabei handelt es sich um ein ungebundenes Textfeld im Bericht. Anschließend wird der Wert der ersten Seriennummer für den nächsten Durchgang um „1“ erhöht.

Wichtig ist nun vor allem die Anweisung „Me.NextRecord = False“. Damit er reichen Sie, dass Access noch einmal versucht, den Detailbereich zu drucken. So mit erfolgt ein erneuter Vergleich von Anfangs- und Endnummer, eine erneute Werteausgabe im Berichtsfeld und eine erneute Erhöhung der Anfangsnummer.

Erst wenn Anfangs- und Endnummer identisch sind, springt die Prozedur zum „Else“-Zweig. „Cancel = True“ bricht die Ausgabe des Detailbereichs ab und präsentiert den Bericht – je nach vorheriger Auswahl im Formular „frmSNDrucken“ – auf dem Bildschirm oder auf dem Drucker.