engelhuber.de //blog

Gehirnfürze aus der Sicht eines Nerds

Navision – IBAN berechnen inkl. Prüfziffer

| Keine Kommentare

Navision_IBANDie 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);

Autor: Engelhuber

Wenn dir der Post hilfreich war bzw. er dir gefallen hat, würde ich mich über ein Kommentar freuen. Natürlich ist auch negative Kritik gerne gesehen ;)

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.