Die IBAN wird in Zeiten von SEPA immer wichtiger. Auf der Suche nach einem Navision IBAN Generator bin ich leider nicht fündig geworden, deswegen habe ich beschlossen mir selber einen zu basteln. Im Prinzip ist der Aufbau der IBAN recht simpel und einfach, doch leider lässt sich die Prüfziffer (Modulo 97) die dafür notwendig ist, nicht so einfach in NAV, und auch nicht in anderen Rechnern, berechnen, da der Wert zusammengesetzt aus BLZ, Kontonummer und Ländercode zu groß für einen Integer/Dezimal-Wert ist.
In C# gab es bereits einen Lösungsansatz. Der NAV Freelancer Jörg R. Feldhofen hat die Modulo 97 Funktion freundlicherweise in C/AL umgesetzt welche sehr gut funktioniert.
Basierend auf der o.g. Funktion habe ich nun folgende Funktion erstellt, die eine für Deutschland validierbare IBAN ausgibt. Als Parameter wird die BLZ, Kontonummer und der Ländercode nach ISO-alpha-2Code übermittelt.
Wichtig ist nur die Parameter korrekt zu übergeben. Innerhalb der Funktion findet keine weitere Validierung mehr statt.
Wie auf Wikipedia zu lesen ist, sind selbst generierte IBAN Nummern nicht zwangsläufig richtig. Valide IBAN Nummern stammen ausschließlich von den Banken direkt.
Ich übernehme daher keine Haftung für evtl. falsch generierte IBAN Nummern oder Schäden die dadurch entstanden sind.
PROCEDURE IBANBerechnen@1000000001(lpBLZ@1000000007 : Code[30]; lpKontonr@1000000008 : Code[30]; lpLand@1000000011 : Code[2]) : Code[30]; VAR sRest@1000000000 : Code[30]; sErg@1000000001 : Code[30]; iStart@1000000002 : Integer; iEnd@1000000003 : Integer; iResult@1000000004 : Integer; iRestTmp@1000000005 : Integer; iBuffer@1000000006 : Integer; iTeiler@1000000009 : Integer; BBAN@1000000010 : Code[30]; Alphabet@1000000012 : Code[27]; iPrüfziffer@1000000013 : Integer; sPrüfziffer@1000000014 : Code[2]; BEGIN // Kontonnr mit führenden Nullen auf 10 Stellen auffüllen lpKontonr := PADSTR('',10-STRLEN(lpKontonr),'0') + lpKontonr; // BBAN zusammensetzen BBAN := lpBLZ + lpKontonr; // Ländercode in numerischen Code wandeln und mit zwei weiteren Nullen an die BBAN hängen // Position des Buchstabens im Alphabet + 9 Alphabet := 'ABCDEFGHIJKLMONOPQRSTUVWXYZ'; BBAN := BBAN + FORMAT(STRPOS(Alphabet,COPYSTR(lpLand,1,1))+9); BBAN := BBAN + FORMAT(STRPOS(Alphabet,COPYSTR(lpLand,2,1))+9) + FORMAT(0) + FORMAT(0); // Prüfsumme berechnen // Modulo 97 iTeiler := 97; iStart := 1; iEnd := 1; WHILE (iEnd <= STRLEN(BBAN)) DO BEGIN EVALUATE(iBuffer, sRest + COPYSTR(BBAN, iStart, iEnd - iStart + 1)); IF (iBuffer >= iTeiler) THEN BEGIN iResult := ROUND(iBuffer / iTeiler, 1, '<'); iRestTmp := iBuffer - (iResult * iTeiler); sRest := FORMAT(iRestTmp); sErg := sErg + FORMAT(iResult); iStart := iEnd + 1; iEnd := iStart; END ELSE BEGIN IF (sErg <> '') THEN sErg := sErg + '0'; iEnd := iEnd + 1; END; END; IF (iStart <= STRLEN(BBAN)) THEN sRest := sRest + COPYSTR(BBAN,iStart); // Die Prüfziffer ergibt sich durch die Subtraktion des ganzzahligen Divisionsrestes von 98. // Ist die Prüfziffer kleiner als 10, wird eine führende Null ergänzt. EVALUATE(iPrüfziffer,sRest); iPrüfziffer := 98 - iPrüfziffer; IF iPrüfziffer < 10 THEN sPrüfziffer := '0' + FORMAT(iPrüfziffer) ELSE sPrüfziffer := FORMAT(iPrüfziffer); // IBAN zusammensetzen und zurückgeben EXIT(lpLand+sPrüfziffer+lpBLZ+lpKontonr);