Higher Level Directory D.Roos, J.Kardoeus: Normgerechte Prüfzeichen für Blutkonservennummern nach ISO 7064 Version 1.1.2

Normgerechte Prüfzeichen für Blutkonservennummern nach ISO 7064

Programmiervorschlag

Warnung! - Programmcode!
Dieser Abschnitt kann von Lesern ignoriert werden, die mit der Programmierung des Prüfziffernalgorithmus nicht befasst sind.

Die folgende Funktionsprozedur berechnet und verifiziert Prüfziffern nach ISO 7064, MOD11,10.

Function CheckDigit1110 (NumStringIn As String, Mode As Integer)
'
' Zweck:
' Berechnung und Prüfung von Prüfziffer nach dem MOD11,10-Verfahren (DIN/ISO 7064).

' Die Ausführungsart der Funktionsprozedur wird durch das "Mode"-Argument wie folgt gesteuert:

' 0: Prüft, ob Argument NumStringIn gültig ist und gibt das Prüfergebnis WAHR für prüfgerecht oder FALSCH für nicht prüfgerecht als Funktionswert zurück (Datentyp: System-abhängig Boole oder Ganzzahl).
' 1: Berechnet Prüfziffer für Argument NumStringIn, verkettet NumStringIn mit der Prüfziffer und gibt das verkettete Ergebnis als Funktionswert zurück. (Datentyp: Zeichenkette).
' 2: Berechnet Prüfziffer für Argument NumStringIn und gibt die Prüfziffer als Funktionswert zurück. (Datentyp: Ganzzahl).
' Die Werte der Argumente werden in der Prozedur nicht verändert.
'
' Entwickelt:
' Dieter Roos, Joachim Kardoeus
' Literatur:
' Deutsches Institut fuer Normung (Hrsg.): DIN ISO 7064, Beuth Verlag GmbH, Berlin 1984
'
' Entwickelt und getestet für
' - Microsoft Access
' - Microsoft Excel
' - Microsoft Visual Basic
' und kompatible Umgebungen.
'
' Benötigte Operatoren und Funktionen:
' + 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 Länge der zu bearbeitenden Zeichenkette
' P Zwischenergebnisse der Rekursionsrechnung
Dim J, N, P As Integer blank.gif (807 Byte)
' On Error GoTo ErrorHandlingCheckDigit1110 blank.gif (807 Byte)
P = 10 blank.gif (807 Byte)
If Mode = 0 Then N = Len(NumStringIn) - 1 Else N = Len(NumStringIn) ' (1)
For J = 1 To N ' (2)
blank.gif (807 Byte) P = P + Mid(NumStringIn, J, 1) ' (3),(4)
blank.gif (807 Byte) If P > 10 Then P = P - 10 ' (5)
blank.gif (807 Byte) P = P * 2 blank.gif (807 Byte)
blank.gif (807 Byte) If P >= 11 Then P = P - 11 ' (6)
Next J blank.gif (807 Byte)
Select Case Mode blank.gif (807 Byte)
Case 0 ' Prüfmodus
blank.gif (807 Byte) P = P + Mid(NumStringIn, N + 1, 1) ' (4)
blank.gif (807 Byte) If P > 10 Then P = P - 10 blank.gif (807 Byte)
blank.gif (807 Byte) CheckDigit1110 = (P = 1) blank.gif (807 Byte)
Case 1, 2 ' Berechnungsmodus
blank.gif (807 Byte) P = 11 - P blank.gif (807 Byte)
blank.gif (807 Byte) If P = 10 Then P = 0 blank.gif (807 Byte)
blank.gif (807 Byte) If Mode = 1 Then CheckDigit1110 = NumStringIn & P Else CheckDigit1110 = P ' (4)
Case Else ' ungültige Eingabe
blank.gif (807 Byte) CheckDigit1110 = "" blank.gif (807 Byte)
End Select blank.gif (807 Byte)
' Exit Function blank.gif (807 Byte)
' ErrorHandlingCheckDigit1110: blank.gif (807 Byte)
' Debug.Print "Unexpected error in CheckDigit1110: " & Err ' Fehlerbehandlung
' Debug.Print "Mode=" & Mode & " - NumStringIn=" & NumStringIn blank.gif (807 Byte)
' CheckDigit1110 = "" blank.gif (807 Byte)
' Exit Function blank.gif (807 Byte)
'
' Fussnoten:
' (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 geprüft und berücksichtigt 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 unterstützen, sind geeignete Typkonvertierungsfunktionen zu verwenden.
'
End Function

Der Quellcode ist verfügbar als ASCII-Textdatei. Wegen der besseren Übersichtlichkeit und starker Umgebungsabhängigkeit beschränkt sich der Programmiervorschlag im wesentlichen nur auf den für das Prüfziffernverfahren unentbehrlichen Algorithmus. Möglichkeiten zur Verringerung der Rechenlast unter bestimmten Einsatzbedingungen werden deshalb nicht ausgeschöpft und können bei Bedarf bei den Autoren erfragt werden. Fehlerbehandlung wird nur in geringem Umfang und in auskommentierter Fassung vorgeschlagen und ist je nach Rahmenbedingungen entsprechend anzupassen. Insbesondere kann es zweckmäßig sein, innerhalb der Funktionsprozedur im Argument "NumStringIn" alle oder bestimmte nicht-numerische Zeichen zu überspringen. Anwendungsbeispiele sind verfügbar für MS-Excel 4.0 und MS-Access 2.0.

Empfehlungen zur Portierung auf andere Entwicklungsumgebungen

Die Funktionsprozedur berechnet abhängig von der Betriebsart für den Rückgabewert verschiedene Datentypen, und zwar für "Prüfen" einen Boolschen und für "Berechnen" einen Zeichenketten- oder Ganzzahlwert. Zur Portierung auf Plattformen, die Datentyp-variante Funktionen nicht unterstützen, kann entsprechend der vorfügbaren bzw. bevorzugten Datentypen alternativ wie folgt verfahren werden:

  1. Prozedur-interne Konvertierung und Rückgabe aller Werte als Zeichenketten.
  2. Falls in der Entwicklungsumgebung boolesche Werte in Ganzzahl-Variablen gespeichert werden: Entfernung der ausschließlich für Mode=1 durchlaufenen Programmabschnitte und Zusammenführen der mit Mode=2 berechneten Prüfziffer mit der ursprünglichen Zeichenkette ausserhalb der Funktionsprozedur.
  3. Zerlegung in zwei Funktionsprozeduren für "Berechnen" und "Prüfen" mit den jeweils benötigten Programmabschnitten und unterschiedlichen Rückgabe-Datentypen.

nach oben nächste Seite

Unframe!English version Copyright Letzte Bearbeitung dieser Seite: 26.11.2000 01:06