Validierung mit einer Prüfziffer ◦ ?

Benutzereingaben sind fehleranfällig. Um Schaden zu vermeiden, prüft der Entwickler am besten möglichst früh, ob eine Eingabe regelkonform ist. Access lässt Sie deshalb bereits bei der Definition eines Formulars oder Steuerelements Gültigkeitsregeln formulieren. Die Gültigkeitsregel >="A" Und <="Z" stellt zum Beispiel sicher, dass für eine Zuordnungsaufgabe nur Buchstabenpräfixe zwischen A und Z eingegeben werden. Für ein konkretes Beispiel markieren Sie in Testverwaltung.mdb das Feld TxfBuchstabenpräfix des Unterformulars Subfrm Buchstabenalternativen, drücken »Alt/Eingabetaste und lesen den Wert der Eigenschaft Gültigkeitsregel.

### Spezifikation

Gültigkeitsregeln sind zu wenig mächtig für komplexe Prüfungen. Wir zeigen dies am Beispiel der Validierung von Matrikelnummern schweizerischer Universitäten. Die Matrikelnummer identifiziert jeden Studierenden zeitlich und räumlich eindeutig. Am Beispiel der Matrikelnummer 72-8 36-59 6 veranschaulichen wir die Bedeutung der Ziffern:

- 72 ist das akademische Jahr des ersten Studiensemesters (Immatrikulationsjahr).
- 8 nennt die Universität des Immatrikulationjahres (0 für Basel, 1 für Bern, ...)
- 3659 ist die f or tlaufende Nummer innerhalb des Immatrikulationsjahrgangs 728
- 6 ist eine Prüfziffer aus einer Kombination der übrigen Ziffern.

Die Prüfziffer berechnet sich wie folgt:

1. Verdopple die ungeraden Positionen
2. Stelle die zweistelligen Verdopplungsergebnisse als Quersummen dar
3. Berechne die Quersumme aller Ergebnisse
4. Subtrahiere die Quersumme von der nächsthöheren Zehnerzahl.

Am obigen Beispiel 72-836-596 lautet der Rechenweg (ungerade Ziffern fett):

1. 14, 2, 16, 3, 12, 5, 18, 6 (Verdoppelungsergebnisse fett)
2. 5, 2, 7, 3, 3, 5, 9, 6 (Quersummen der zweistelligen Verdoppelungsergebnisse fett)
3. 5 + 2 + 7 + 3 + 3 + 5 + 9 = 34 (Quersumme der Ergebnisse)
4. 40 - 34 = 6 ist die Prüfziffer (Subtraktion des Ergebnisses von Schritt 3 von der nächsthöheren Zehnerzahl).

Aus 4. folgt, dass die Summe aus der Quersumme von 3. und der Prüfziffer von 4. eine Zehnerzahl sein muss (im Beispiel 34 + 6 = 40). Wir verwenden dies im vierten Schritt des folgenden Programms.

### Implementation

Die Funktion MatrikelGültig(Matrikel) wird wahr, falls das Argument eine gültige Matrikelnummer ist. Der VBA-Code folgt den obigen vier Schritten, ist aber komplexer, weil er ungewohnte Funktionen und Operatoren verwendet und temporäre Zwischenergebnisse im Datenfeld TmpMatr(1 To 7)verwaltet.

>     Private Function MatrikelGültig(ByVal Matrikel As String) As Boolean
>       Dim TmpMatr(1 To 7) As String      'Zwischenspeicherung der Matrikel ohne Prüfziffer
>       Dim i As Byte                      'Index i läuft im Datenfeld TmpMatr von 1 bis 7
>       Dim Zahl As Byte
>       Dim Quersumme As Byte

>       If Len(Matrikel) = 8 Then          'Alle gültigen Matrikelnummern sind 8 Zeichen lang
>         Quersumme = 0
>         For i = 1 To 7                   'Durchlaufe alle Ziffern ohne die Prüfziffer
>           If i Mod 2 <> 0 Then           '*** ungerade Ziffer
>             '1. Verdoppelung einer ungeraden Ziffer
>             TmpMatr(i) = CStr(CInt(Mid(Matrikel, i, 1)) * 2)
>             '2. Quersumme einer zweistelligen Verdoppelung
>             If Len(TmpMatr(i)) > 1 Then
>               TmpMatr(i) = CStr(CInt(Left(TmpMatr(i),1)) + CInt(Right(TmpMatr(i),1)))
>             End If
>           Else                           '*** gerade Ziffer
>             TmpMatr(i) = Mid(Matrikel, i, 1)
>           End If
>           '3. Quersumme der Matrikel ohne Prüfziffer
>           Quersumme = Quersumme + CInt(TmpMatr(i))
>         Next
>         '-- 4.(Quersumme + Prüfziffer) = Zehnerzahl?
>         If (Quersumme + CInt(Right(Matrikel, 1))) Mod 10 = 0 Then
>           MatrikelGültig = True
>           Exit Function
>         End If
>       End If
>       MatrikelGültig = False
>     End Function

>     Vordefinierte Funktionen
>     len(Zeichenkette) berechnet die Anzahl Zeichen der Zeichenkette (string)
>     mid(Zeichenkette, i+1, 1) ergibt das i+i-te Zeichen der Zeichenkette
>     left(Zeichenkette, 1) ergibt das erste Zeichen der Zeichenkette
>     right(Zeichenkette, 1) ergibt das letzte Zeichen der Zeichenkette
>     Dividend mod Divisor ergibt den ganzzahligen Rest der Division von Dividend durch Divisor
>     CByte(Zeichenkette) ergibt den Byte-Wert (0 bis 255) der Zeichenkette
>     CStr(Zahl) ergibt den Str-Wert der Zahl

Gültigkeitsprüfung in Access