Auftragsnummern für den aktuellen Monat vergeben

Ich lege gerade mit MS Access 2000 eine Datenbank für meine Kunden- und Auftragsverwaltung an. Nun möchte ich gerne, dass Access automatisch fortlaufende Auftragsnummern erzeugt. Diese Nummern sollen auf Jahr, Monat und einer laufenden Nummer basieren, also zum Beispiel »200006123« für den 123. Auftrag im Juni 2000. Können Sie mir helfen?

Sie können in einer Konfigurations-Tabelle die zuletzt vergebenen Auftragsnummern ablegen. Alternativ können Sie in den Datenbeständen die bereits vergebenen Auftragsnummern analysieren. Außerdem sind folgende Überlegungen nötig: Wird die Nummer immer anhand des aktuellen Datums vergeben, oder ist es vorstellbar, dass Sie einen Auftrag für den letzten oder vorletzten Monat erfassen möchten? Greifen unterschiedliche Nutzer gleichzeitig auf die Anwendung zu?

Die vorgestellte Lösung nutzt neben den eigentlichen Datentabellen eine Tabelle namens »Config«, in denen Access 2000 für jeden einzelnen Monat die zuletzt vergebene laufende Nummer ablegt. Das Feld »Monat« ist vom Typ »Text« und hat genau 6 Stellen. Hier speichert Access jeweils den Monat im Format »JJJJMM«. Das Feld »lfdNummer« ist von Typ »Zahl« und enthält die für den jeweiligen Monat zuletzt vergebene laufende Nummer.

Zusätzlich benötigen Sie eine VBA-Funktion »getNumber()«, die aus einem als Parameter übergebenen Datum Monat und Jahr extrahiert, in der Tabelle »Config« die zuletzt vergebene laufende Nummer ermittelt, die neue Auftragsnummer erzeugt und abschließend die Tabelle »Config« aktualisiert. Als Rückgabewert liefert diese Funktion die neue Auftragsnummer.


Public Function getNumber(Datum As Date) As String

Dim Datenbank As Database
Dim rstConfig As Recordset
Dim Monat As String
Dim Jahr As String
Dim nummer As Integer
Dim Bedingung As String

On Error GoTo Err_checkFiles

Jahr = Year(Datum)
Monat = Month(Datum)
If Monat < 10 Then
Monat = ä0ä & Monat
End If

getNumber = Jahr & Monat

Set Datenbank = CurrentDb
Set rstConfig = Datenbank.OpenRecordset(äConfigä, dbOpenDynaset)

Bedingung = äMonat = æä & getNumber & äæä
rstConfig.FindFirst Bedingung

If rstConfig.NoMatch Then
nummer = 1
rstConfig.AddNew
rstConfig!Monat = getNumber
rstConfig!lfdNummer = 1
rstConfig.Update
Else
nummer = rstConfig!lfdNummer
nummer = nummer + 1
rstConfig.Edit
rstConfig!lfdNummer = nummer
rstConfig.Update
End If

If nummer < 10 Then
getNumber = getNumber & ä00ä & nummer
ElseIf nummer < 100 Then
getNumber = getNumber & ä0ä & nummer
Else
getNumber = getNumber & nummer
End If
rstConfig.Close

Exit_checkFiles:
Exit Function

Err_checkFiles:
MsgBox Err.Description
Resume Exit_checkFiles

End Function



Das Listing funktioniert so:Zuerst ermittelt die Funktion »getNumber()« mit »Year()« und »Month()« aus dem übergebenen Datum Jahr und Monat und fügt beides zu einer Zeichenkette zusammen. Diese Zeichenkette sucht Access mit der Methode »FindFirst« im Feld »Monat« des Recordsets »rstConfig«, das zuvor mit »Set« erzeugt wurde. Findet Access einen entsprechenden Datensatz, liest es die laufende Nummer, erhöht sie um 1 und aktualisiert den Datensatz. Anderenfalls erzeugt Access mit »AddNew« einen neuen Datensatz, belegt das Feld »Monat« und schreibt den Wert »1« in »lfdNummer«. Nun muss die Funktion noch die Auftragsnummer zusammensetzen.

Bevor Sie mit Access 2000 den Datentyp »Database« und die Methode »FindFirst« nutzen können, rufen Sie im VBA-Editor den Befehl »Extras | Verweise« auf und setzen einen Haken links neben »Microsoft DAO 3.6 Object Library«. Falls der Eintrag »Microsoft ActiveX Data Objects 2.1 Library« aktiviert ist, deaktivieren Sie ihn oder priorisieren ihn niedriger als die Objektbibliothek von DAO 3.6. Die Tabelle »Config« sowie die Funktion »getNumber()« finden Sie auf der Heft-CD CHIP-Code LFDNR.