Function CheckDigit1110 (NumStringIn As String, Mode As Integer) '--------------------------------------------------------------------------- ' Version 27.07.2000 ' letzte redaktionelle Korrektur: 27.07.2000jk '--------------------------------------------------------------------------- ' Zweck: ' Erzeugung und Ueberpruefung von Pruefziffern nach dem MOD11,10-Verfahren ' (DIN/ISO 7064). ' Die Ausfuehrungsart der Funktionsprozedur wird durch das "Mode"-Argument ' wie folgt gesteuert: ' 0: Prüft, ob Argument NumStringIn gültig ist und gibt das Pruefergebnis ' WAHR für pruefgerecht oder FALSCH für nicht prüfgerecht als ' Funktionswert zurueck (Datentyp: System-abhaengig Boole oder Ganzzahl) ' 1: Berechnet Pruefziffer für Argument NumStringIn, verkettet NumStringIn ' mit der Pruefziffer und gibt das verkettete Ergebnis als Funktionswert ' zurueck. (Datentyp: Zeichenkette). ' 2: Berechnet Pruefziffer für Argument NumStringIn und gibt die Pruefziffer ' als Funktionswert zurück. (Datentyp: Ganzzahl). ' Die Argumentwerte werden in der Prozedur nicht veraendert. '--------------------------------------------------------------------------- ' Entwickelt: ' Dieter Roos, Joachim Kardoeus ' Literatur: ' Deutsches Institut fuer Normung (Hrsg.): DIN ISO 7064, ' Beuth Verlag GmbH, Berlin 1984 '--------------------------------------------------------------------------- ' Entwickelt und getestet fuer ' - Microsoft Access 2.0 ' - Microsoft Excel ' - Microsoft Visual Basic ' und kompatiblen Umgebungen '--------------------------------------------------------------------------- ' Modifikationen: ' [1] 26.02.2000: Bessere Entsprechung der Beschreibung des Algorithmus ' in der ISO Norm; keine funktionellen Unterschiede ' [2] 26.02.2000. Bessere Annaeherung an portierbaren Quellcode; ' keine funktionellen Unterschiede ' 28.07.2000: Korrektur: "CheckDigit1011" -> "CheckDigit1110" ' (Dank an J.M. für kritische Durchsicht) '--------------------------------------------------------------------------- ' Bedingungen fuer Argumente: ' Das Argument NumStringIn muss eine Zeichenkette sein und darf nur aus ' Ziffern bestehen oder muss leer sein. ' Wenn NumStringIn andere Zeichen enthält, entsteht eine Laufzeitfehler. ' Abhängig von der Einzatzumgebung ist die Ergänzung mit ' Fehlerbehandlungsmechanismen zweckmässig. ' Das Argument Mode darf 0, 1 or 2 sein. Bei anderen Werten liefert die ' Funktion als Ergebnis eine leere Zeichenkette als Hinweis auf unzulässige ' Argumente. '--------------------------------------------------------------------------- ' Benoetigte Funktionen und Operatoren: ' + arithmetische Addition ' & Zeichenketten-Verkettung ' Len Anzahl der Zeichen einer Zeichenkette ' Mid(a,b,c) Ausschnitt aus der Zeichenkette a beginnend an Position b ' mit der Länge c (3) '--------------------------------------------------------------------------- ' Variable ' J = Schleifenindex für Rekursionsrechnung ' N = Schleifenindex für Rekursionsrechnung ' P = Zwischenergebnisse der Rekursionsrechnung '--------------------------------------------------------------------------- Dim J, N, P As Integer P = 10 If Mode = 0 Then N = Len(NumStringIn) - 1 Else N = Len(NumStringIn) '(1) For J = 1 To N '(2) P = P + Mid(NumStringIn, J, 1) '(3),(4) ' Debug.Print J, P, 'P: 1...19 If P > 10 Then P = P - 10 ' Debug.Print P, 'P: 1...10 P = P * 2 ' Debug.Print P, 'P: 2...20 (geradzahlig) If P >= 11 Then P = P - 11 '[1] alt: If P > 11 Then P = P - 11 ' Debug.Print P 'P: 1...10 Next J Select Case Mode Case 0 ' --Pruefmodus-- P = P + Mid(NumStringIn, N + 1, 1) '(4) ' Debug.Print P If P > 10 Then P = P - 10 CheckDigit1110= (P = 1) '[2] alt: CheckDigit1011 = P = 1 ' Debug.Print "CheckResult="; IIf(P = 1, "ok", "check digit error") Case 1, 2 ' --Berechnungsmodus-- P = 11 - P ' P: 1 ... 10 If P = 10 Then P = 0 ' Debug.Print "CheckDigit1110="; P If Mode = 1 Then CheckDigit1110 = NumStringIn & P Else CheckDigit1110 = P Case Else ' --ungueltige Eingabe-- ' Debug.Print "Mode=" & Mode & " invalid" CheckDigit1110 = "" End Select '--------------------------------------------------------------------------- ' Hinweise zur Portierung auf andere Entwicklungsumgebungen: ' (1) Im Prüfmodus muss die Rekursionsschleife nach Verarbeitung des ' vorletzten Zeichens in der Eingabekette beendet werden. ' (2) Wenn der Programmcode auf andere Plattformen übertragen werden soll, ' ist sicherzustellen, dass bei n<=0 die Schleife kein einziges Mal ' durchlaufen wird (d.h. die Abbruchbedingung muss am Schleifenanfang ' geprueft und beruecksichtigt werden) oder dass die leere Zeichenkette ' nie als NumStringIn-Argument vorkommen kann. ' (3) Es wird vorausgesetzt, dass 1 als Positionsnummer des ersten Zeichens ' einer Zeichenkette definiert ist. ' (4) Wenn der Programmcode auf Plattformen uebertragen werden soll, welche ' keine automatischen Datentypkonvertierungen unterstuetzen, sind ' geeignete Typkonvertierungsfunktionen zu verwenden. '--------------------------------------------------------------------------- End Function