Doorlopend nummeren

Er bestaat soms de behoefte om sleutelvelden te maken die bestaan uit (bijvoorbeeld) een jaartal en een volgnummer binnen dat jaar.

In het voorbeeld ga ik uit van een sleutelveld dat bestaat uit een jaartal plus een volgnummer van vier posities. Dus: 20090001, 20090002, 20090003 enzovoort. Dat veld is de sleutel in een tabel (DeTabel) die verder alleen een (ander) tekstveld bevat.

Het genereren van zo'n sleutel kan je doen in een gebeurtenis 'voor invoegen' (BeforeInsert) te maken op het formulier waarmee de gegevens van de betreffende tabel onderhouden worden. In mijn voorbeeld ziet de gebeurtenis er dan zo uit:

Private Sub Form_BeforeInsert(Cancel As Integer)
Dim Jaar As String
Dim Hoogste As Variant

Jaar = Year(Date)
Hoogste = Nz(DMax("Sleutelveld", "DeTabel", "Left(Sleutelveld,4)='" & Jaar & "'"), 0)

If Hoogste = 0 Then
  Me.Sleutelveld = Jaar & "0001"
Else
  If Hoogste = Jaar & "9999" Then
     MsgBox "Er zijn geen vrije nummers meer", vbCritical, "Nummers op"
     Cancel = True
  Else
     Me.Sleutelveld = Hoogste + 1
  End If
End If

Me.Refresh
End Sub

Op het formulier heb ik het 'Sleutelveld' (jaar/volgnummer) vergrendeld en de eigenscap 'tabstop' op 'nee' gezet. Dat zorgt ervoor dat je het sleutelveld niet zelf in kunt vullen en dat zodra je bij een nieuw record het andere veld begint in te vullen, de gebeurtenis (die het sleutelveld vult) afgaat.
In de gebeurtenis bepalen we met de functie DMax de hoogste waarde van het sleutelveld die voor een bepaald jaar (eerste vier posities van het sleutelveld) in de tabel aanwezig is. We moeten daarbij rekening houden met de mogelijkheid dat er nog geen record voor het huidige jaar aanwezig is. De DMax levert dan de waarde Null op. In dat geval maken we daar met de functie Nz nul van. De waarde van het sleutelveld wordt dan YYYY0001. Vinden we wel een hoogste waarde voor het sleutelveld, dan hogen we dat met 1 op en hebbem de waarde voor het nieuwe record bepaald. Wel moeten we in de gaten houden of er nog wel vrije nummers gemaakt kunnen worden. Als de hoogste waarde die we vinden YYYY9999 is, is de koek voor dat jaar op.

Een voorbeelddatabase kan je hier downloaden.