IBAN - Berechnung, Pflicht ab dem 01.02.2014

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
peter-ross-privat
Beiträge: 10
Registriert: 15.07.2013 14:48
Computerausstattung: Zu Hause keine!

IBAN - Berechnung, Pflicht ab dem 01.02.2014

Beitrag von peter-ross-privat »

Im Bereich individueller kaufmännischer Programmierung in einem kleinen Verlag muss nun auf die Änderung im Bankenwesen reagiert werden.
Zum Glück wird bei uns nur der Einzug in einfacher Form durchgeführt.

Hier eine Grundlage zur Berechnung der IBAN aus dem Land sowie der BLZ und der Kontonummer.
Leider sind viele Beispiele der Banken in anderen Sprachen vorgesehen,
die Beschreibungen sind auch verwirrend.

Code: Alles auswählen

EnableExplicit

Procedure _IBAN_ermitteln(LAND.s, BLZ.s, Konto.s)
   Protected Ergebnis.l
   Protected i.l
   Protected QA.s
   Protected Q.s
   Protected Teil.s
   PrintN("------------------------------------------------------------------")
   Print("Land: " + Chr(34) + LAND + Chr(34))
   
   Konto = RemoveString(Konto,"-")
   Konto = RemoveString(Konto,".")
   Select LAND
      Case "AT"
         Print(", Konto (11-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", BLZ (5-stellig): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + RSet(BLZ, 5, "0") + RSet(Trim(Konto),11,"0")       
      Case "BE"
         Print(", Konto (9-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", BLZ (3-stellig): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + RSet(BLZ, 3, "0") + RSet(Trim(Konto),9,"0")          
      Case "CH"
         Print(", Konto (12-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", IID(BC-Nummer, 5-stellig): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + RSet(BLZ, 5, "0") + RSet(Trim(Konto),12,"0")
      Case "DE"
         Print(", Konto (10-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", BLZ (8-stellig): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + BLZ + RSet(Trim(Konto),10,"0")
      Case "IT"
         Print(", Konto (12-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", BLZ (11-stellig, zusammengesetzt [1+5+5]): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + BLZ + RSet(Trim(Konto),12,"0")
      Case "NL"
         Print(", Konto (10-stellig): " + Chr(34) + Konto + Chr(34))
         PrintN(", BLZ (4-stellig): " + Chr(34) + BLZ + Chr(34))
         QA = LAND + "__" + BLZ + RSet(Trim(Konto),10,"0")         
      Default
   EndSelect
   Q = QA
   Q = Mid(Q,5) + Left(Q,2) + "00"
   For i = Asc("A") To Asc("Z")
      Q = ReplaceString(Q,Chr(i),Str(Asc(Chr(i)) - 55))
   Next
   Teil = Left(Q,9)
   Ergebnis = Val(Teil) % 97
   Q = Mid(Q,10)
   Repeat
      If Ergebnis > 9
         If Len(Q) <= 7
            Teil = RSet(Str(Ergebnis),2,"0") + Q
            Ergebnis = Val(Teil) % 97
            Break
         Else
            Teil = RSet(Str(Ergebnis),2,"0") + Left(Q,7)
            Ergebnis = Val(Teil) % 97
            Q = Mid(Q,8)
         EndIf
      Else
         If Len(Q) <= 8
            Teil = Str(Ergebnis) + Q
            Ergebnis = Val(Teil) % 97
            Break            
         Else
            Teil = Str(Ergebnis) + Left(Q,8)
            Ergebnis = Val(Teil) % 97
            Q = Mid(Q,9)
         EndIf
      EndIf
   ForEver
   Ergebnis = 98 - Ergebnis
   QA = Left(QA,2) + RSet(Str(Ergebnis),2,"0") + Mid(QA,5)
   PrintN("...")
   PrintN("Elektronische IBAN: " + QA)
   PrintN("Papierausgabe ....: " + Mid(QA,1,4) + Space(1) + Mid(QA,5,4) + Space(1) + Mid(QA,9,4) + Space(1) + Mid(QA,13,4) + Space(1) + Mid(QA,17,4) + Space(1) + Mid(QA,21))
EndProcedure
Procedure Testeingabe()
   Protected LAND.s
   Protected BLZ.s
   Protected Konto.s
   Protected E.s
   PrintN("Test, ganz primitiv!!!")
   PrintN("Alles genau eingeben!!!")
   PrintN("Ende = leeres Feld/keine Eingaben ...")
   Repeat
      Print("Weiter mit J und RETURN, sonst Programmende: ") : e = Input()
      e = UCase(e)
      If e = "J"
         Print("Eingabe des Landes wie DE oder CH (bisher): ") : LAND = Input()
         Print("Eingabe der BLZ: ") : BLZ = Input()
         Print("Eingabe der Kontonummer: ") : Konto = Input()
         LAND = UCase(LAND)
         ; ;          BLZ = UCase(BLZ)
         Konto = UCase(Konto)
         _IBAN_ermitteln(LAND,BLZ,Konto) ; --- 21   
      Else
         Break
      EndIf
   ForEver
EndProcedure
OpenConsole()
; ; ;    "68" QA = "DE__" + "21050170" + "0012345678" ; --- Beispiel Sparkasse, 3+0 ganz unten ok
; ; ;    "10" QA = "CH__" + "002300A1023502601" ; --- Beispiel IBAN*PI
_IBAN_ermitteln("DE","21050170","0012345678") ; --- 68
_IBAN_ermitteln("DE","38621500","18788") ; --- 49
_IBAN_ermitteln("DE","70051995","7229") ; --- 21
_IBAN_ermitteln("AT","19043","234573201") ; --- AT611904300234573201  
_IBAN_ermitteln("BE","539","0075470-34") ; --- BE68539007547034  
_IBAN_ermitteln("CH","230","A-10.2350.26.01") ; --- 10
_IBAN_ermitteln("IT","X0542811101","123456") ; --- IT60X0542811101000000123456 
_IBAN_ermitteln("NL","ABNA","0417164300") ; --- NL91ABNA0417164300   
PrintN("...")
Testeingabe()
; ; ; Print("Weiter mit RETURN") : Input()
; --- DE: BLZ(8) + Konto(10)
; --- AT: BLZ(5) + Konto(11)
; --- BE: BLZ(3) + Konto(9)
; --- CH: BLZ(5) + Konto(12)
; --- IT: BLZ(1+5+5) + Konto(12)
; --- NL: BLZ(4) + Konto(10)

; IDE Options = PureBasic 5.11 (Windows - x86)
; CursorPosition = 121
; FirstLine = 86
; Folding = -
; EnableXP
; Executable = ___GPR_MOD97.exe
; CPU = 1
; DisableDebugger
Querverweis, betreff die unterschiedliche Handhabung des Standards in den verschiedenen Ländern: http://www.ecbs.org/iban.htm oder http://pruefziffernberechnung.de

mfG Peter Ross

ps: Wir haben in den letzten Jahren ein großes Programmpaket (Adressverwaltung, Buchungsapplikationen, Versände und deren Optimierungen, Provisionen, etc.) programmatisch von einer HP3000, Sprache Cobol auf die Server-Ebene umgesetzt; die Sprache ist: PureBasic!
Zuletzt geändert von peter-ross-privat am 18.07.2013 10:33, insgesamt 1-mal geändert.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von Micha122 »

Hab zwar momentan keine Verwendung dafür, aber trotzdem interessantes Thema.

Komplett wäre das ganze, wenn anhand der BLZ auch noch der BIC ermittelt würde.
Wäre der Aufwand zur Ermittlung des BIC - Code sehr groß?

Gruß, Micha122
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von Sicro »

Habe gerade eine gute Beschreibung der IBAN-Berechnung in einem PDF gefunden:
http://www.dsgv.de/_download_gallery/Ma ... ng_SFG.pdf

Die BIC kann glaub ich nicht selber berechnet werden. BIC-Listen zum Downloaden lassen sich per Google finden.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von Micha122 »

In Deinem Link zum PDF sind ja alle Info enthalten. :allright:
Dort steht zum Schluss:
der Bankleitzahlendatei der Deutschen Bundesbank entnommen werden.
Hab dann direkt mal nach der BIC- Liste gesucht und sie gefunden. http://www.bundesbank.de/Navigation/DE/ ... ahlen.html

Hat sich also mit dem Berechnen erledigt.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von sibru »

IBAN-Bestimmung absolut variabel (Datei- und Masken-gestützt), dadurch können hiermit die IBAN´s aller
Länder generiert werden, sofern die speziellen Daten der Länder (Regional-, Filial- oder Konto-Codes) über=
geben werden...

Code: Alles auswählen

;+----------------------------------------------------------------------+
;|           PureBasic-QuellCode "IBANI" mit allen ModulBody´s          |
;|erstellt durch Programm "PB_Mod2Body", Vers. 11225a am 16.07.13, 01:26|
;+----------------------------------------------------------------------+


;Modul      IBAN Version 1.06 vom 22.11.2012
#PB_Vers  = "4.20"
;
;Funktion:  liefert IBAN (International Bank Account Number) aufgrund variabler Definitionen (Land, BLZ, KtoNr...)
;           Dieses Modul basiert auf einer IBAN-Definitionsdatei, in der alle an der IBAN beteiligen Länder mit
;           der landesspezifischen IBAN-Aufbau-Maske enthalten sind. Neben Landeskennung und Prüfziffern enthalten
;           die Maske durch Buchstaben gekennzeichnete Datenteile wie z.Bsp. "bbbbbbbb" für eine 8-stellige Bank=
;           leitzahl oder "kkkkkkkkk" für eine 10-stellige KontoNr (siehe Datei IBAN.DEF im AlsterOrdner, speziell
;           am DateiEnde...)
;           Beim Aufruf dieser Funktion muß eine LandesKennung oder -Name (z.Bsp. "DE" oder "Deutschland" angegeben
;           werden zur Spezifizierung des Landes und somit der zu benutzenden IBAN-Maske. Außerdem muß ein Definitions=
;           String angegeben werden, der den diversen Datenteilen Nummern zuordnet wie z.Bsp. "b=12345678 k=0987654321",
;           hier wird das Datenfeld "bbbbbbbb" mit "12345678" und "kkkkkkkkkk" mit "0987654321" belegt. Auf diese Weise
;           sind auch ausländische IBAN generierbar, die spezielle Daten wie die in Frankreich erforderlichen "code guichet"
;           oder die im arabischen Raum verbreiteten Reginal-Codes enthalten können.
;
;Aufruf:    IBAN$ = IBAN(Land$, Definitionen$)
;           Land$: Landes-Kennung (2 Buchstaben ensprechend Landes-Maske oder auch Landes-Name), GROSS-/klein-ScHrIfT egal,
;                  Landes-Name muß nicht vollständig angegeben werden, letzter passender Eintrag in Datei IBAN.DEF gewinnt)
;           Definitionen$: Zuordnungs-Anweisungen im Format "c=nummer {c=nummer {c=nummer...}}", wobei c eine 1-zeichige
;                          Datenkennung darstellt, die auch in der landesspezifischen IBAN-Maske enthalten sein muß. Vor
;                          und nach dem Gleichheitszeichen sind Leerzeichen möglich und nummer (=Zuweisungs-Wert) darf nur
;                          aus dezimalen Ziffern bestehen. Es sind beliebig viele Zuweisungs-Pärchen (Datenkennung und
;                          Datenwert) möglich, jedoch muß die Datenkennung in der Maske enthalten sein !!!
;                          Bedeutung der Datenkennungen siehe am Ende der Datei IBAN.DEF...
;
;           Diese Funktion liefert die IBAN incl. Landeskennung und Prüfziffer oder im Fehlerfall eine Fehlermeldung.
;           die immer mit "!" beginnt
;           Das Format der IBAN (mit 4er-Gruppen (="Papierformat" oder ohne Leerzeichen (="EDV-Format")) ergibt sich aus
;           der Maske in IBAN.DEF..
;

#maxIBANdef = 80    ;Anz. definierter IBAN-Länder (aktuell 78 definiert in Datei IBAN.DEF)
#IBANdefNamLen = 40 ;NamensLänge [Anz. Zeichen] in Datei IBAN.DEF

CompilerIf Defined(Debug_IBAN, #PB_Constant) = 0
  #Debug_IBAN = 0   ;erweiterte Debugger-Anzeigen können aktiviert werden
CompilerEndIf

;XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\AlsterFile.PBI"
;XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\FileErr.PBI"
;==========  Begin Modul "ModuloBig.PBI"  ==========
;Modul      ModuloBig Version 1.01 vom 19.10.2008
#PB_Vers  = "4.20"
;
;Funktion:  liefert Modulo sehr großer Zahlen (DivisonsRest, Basis auch mehr als 16 Ziffern)
;
;Aufruf:    DivRest.L = ModuloBig(Base$, Div.L)
;           Base$  enthält die zu teilende Zahl als Ziffernfolge (bi zu 32376 Ziffern möglich...)
;           Div    ist der Divisor
;
;           Diese Funktion liefert den RestWert der Division Base$ / Mod.
;
;#jaPBeExt exit
Procedure ModuloBig(Base$, Div)
  Protected CS
  Repeat
    CS = Val(Left(Base$, 9)) % Div
    Debug Left(Base$, 9)+" mod "+Str(Div)+" = "+Str(CS)
    Base$ = Mid(Base$, 10)
    If Base$>"" : Base$ = Str(CS) + Base$ : EndIf
  Until Base$ = ""
  ProcedureReturn CS
EndProcedure
; jaPBe Version=3.8.6.707
; Build=0
; FirstLine=0
; CursorPosition=16
; ExecutableFormat=Windows
; DontSaveDeclare
; EOF
;==========  Ende Modul "ModuloBig.PBI"  ==========

Structure IBAN_Typ
  Land$
  Mask$
EndStructure

Global Dim IBAN_Base.IBAN_Typ(#maxIBANdef)
Global IBAN_Def.l ;Anz. definierter IBAN-Länder aus Datei IBAN.DEF
;#jaPBeExt exit

Procedure.s IBAN(Land$, Defines$)   ;- ??? noRef ???
  Protected File, File$, FileFormat, IBAN$, Land, pos, Such, Such$, Zeile$
  If Not IBAN_Def         ;{IBAN´s noch nicht definiert: erstmal Datei einlesen
    ;File$ = AlsterFile("divDaten\IBAN.DEF")
    File$ = "IBAN.DEF"
    File = ReadFile(#PB_Any, File$)
    If File
      FileFormat = ReadStringFormat(File)
      Repeat
        Zeile$ = ReadString(File, FileFormat)
        pos = FindString(Zeile$, ";",1) : If pos : Zeile$=Trim(Left(Zeile$,pos-1)) : EndIf ;Notizen entfernen
        If Len(Zeile$)>#IBANdefNamLen
          IBAN_Def + 1
          IBAN_Base(IBAN_Def)\Land$ = Trim(Left(Zeile$, #IBANdefNamLen))
          IBAN_Base(IBAN_Def)\Mask$ = Trim(Mid(Zeile$, #IBANdefNamLen + 1))
        EndIf
      Until Eof(File)Or UCase(Zeile$) = "#EXIT" Or IBAN_Def = #maxIBANdef ;FileEnde, AbbruchSteuerung oder drohender Arrayüberlauf
      CloseFile(File)
    Else : ;FileErr(File$, "Öffnen IBAN-DefinitionsDatei")
      IBAN_Def = - 1 ; ErrFlag
    EndIf
  ElseIf IBAN_Def<0 : ProcedureReturn "! IBAN-Datei: Ladefehler"
  EndIf ;}
  If Len(Trim(Land$)) = 2 ;{LandesKennung angegeben: Land entsprechend Masken-Anfang suchen
    Such$ = UCase(Trim(Land$))
    Land = IBAN_Def       ;IBAN_Base von hinten nach oben durchsuchen
    While Left(IBAN_Base(Land)\Mask$, 2)<>Such$ And Land>0 : Land - 1 : Wend ;}
  Else                    ;{LandesNamen angegeben: Land lt. LandesName suchen
    Such$ = UCase(Trim(Land$))
    Such = Len(Such$);wg. SuchSpeed-Optimierung
    Land = IBAN_Def       ;IBAN_Base von hinten nach oben durchsuchen
    While UCase(Left(IBAN_Base(Land)\Land$, Such))<>Such$ And Land>0 : Land - 1 : Wend ;
  EndIf
  If Not Land : ProcedureReturn "! Land lt. " + #DQUOTE$ + Land$ + #DQUOTE$ + " ist nicht definiert" : EndIf ;}
  IBAN$ = IBAN_Base(Land)\Mask$
  If #Debug_IBAN
    Debug "Land = " + #DQUOTE$ + IBAN_Base(Land)\Land$ + #DQUOTE$
    Debug "Mask = " + #DQUOTE$ + IBAN_Base(Land)\Mask$ + #DQUOTE$
    Debug "Define=" + #DQUOTE$ + Defines$ + #DQUOTE$
  EndIf
  While Defines$>""  ;{ Definitionen umsetzen (Format "kz=wert {kz=wert {kz=wert...}}", kz=1stelliges ZuordnungsZeichen entspr. IBAN.DEF-Maske
    pos = FindString(Defines$, "=", 1)
    Such$ = Trim(Left(Defines$, pos - 1));Zuordnungs-Kennzeichen (siehe Ende of Datei IBAN.DEF)
    Defines$ = Trim(Mid(Defines$, pos + 1))
    If #Debug_IBAN : Debug "ZuweisKenn = " + #DQUOTE$ + Such$ + #DQUOTE$ + "(Pos=" + Str(pos) + ")" : EndIf
    If Len(Such$)<>1 : ProcedureReturn "! Zuordnung " + #DQUOTE$ + Such$ + #DQUOTE$ + " ist nicht definiert" : EndIf
    pos = FindString(Defines$, " ", 1): If pos = 0 : pos = Len(Defines$) + 1: EndIf
    Zeile$ = Left(Defines$, pos - 1);ZuOrdnungs-Wert (zwischen "=" und nächstem Leerzeichen)
    If #Debug_IBAN : Debug "ZuweisWert = " + #DQUOTE$ + Zeile$ + #DQUOTE$ : EndIf
    Defines$ = Trim(Mid(Defines$, pos + 1))
    pos = FindString(IBAN$, Such$, 1)
    If pos = 0 : ProcedureReturn "! Zuordnung an " + #DQUOTE$ + Such$ + #DQUOTE$ + " ist nicht definiert" : EndIf
    Repeat
      pos = FindString(IBAN$, Such$, 1)
      If pos
        IBAN$ = Left(IBAN$, pos - 1) + Left(Zeile$, 1) + Mid(IBAN$, pos + 1);Zeichen in Maske eintragen
        Zeile$ = Mid(Zeile$, 2)
      EndIf
    Until pos = 0
  Wend ;}
  If #Debug_IBAN : Debug "IBANroh=" + IBAN$ : EndIf
  For pos = Len(IBAN$)To 5 Step - 1 ;{Prüfung IBAN (muss nun alles Ziffern sein, rückwärz schneller)
    If FindString("0123456789 ", Mid(IBAN$, pos, 1), 1) = 0 : ProcedureReturn "! vermisse Zuordnung an " + #DQUOTE$ + Mid(IBAN$, pos, 1) + #DQUOTE$: EndIf
  Next;}
  ;{- Prüfziffern bestimmen und einsetzen
  Land$ = UCase(Left(IBAN$, 2)): For pos = 'A' To 'Z' : Land$ = ReplaceString(Land$, Chr(pos), Str(Asc(Chr(pos)) - 55)): Next ;Buchstaben-->Ziffern (A=10..Z=35)
  pos = 98 - ModuloBig(Mid(IBAN$, 5) + Land$ + "00", 97);Prüfziffer ermitteln (Var pos wird hier missbraucht...)
  If #Debug_IBAN : Debug "IBAN-CS =" + Str(pos): EndIf
  IBAN$ = Left(IBAN$, 2) + RSet(Str(pos), 2, "0") + Mid(IBAN$, 5);}Prüfziffern einsetzen
  ProcedureReturn IBAN$
EndProcedure
;==========< Auswertung >==========
;      164 Zeilen
;     8611 Bytes
;        1 Module

Und hier die erforderliche Definitions-Datei:
!!!Leerzeichen nach´m LandesName nicht verändern !! Maske muß in jeder Zeile in Spalte 41 beginnen !!!

Code: Alles auswählen

;Landes-Bezeichnung                     IBAN-Aufbau (Legende siehe unten)
Albanien                                ALppbbbssssKkkkkkkkkkkkkkkkk
Andorra                                 ADppbbbbsssskkkkkkkkkkkk
Aserbaidschan                           AZppbbbbkkkkkkkkkkkkkkkkkkkk
Bahrain                                 BHppbbbbkkkkkkkkkkkkkk
Belgien                                 BEppbbbkkkkkkkKK
Bosnien und Herzegowina                 BAppbbbssskkkkkkkkKK
Brasilien                               BRppbbbbbbbbssssskkkkkkkkkkkk
Bulgarien                               BGppbbbbssssddkkkkkkkk
Costa Rica                              CRppbbbkkkkkkkkkkkkkk
Dänemark                                DKppbbbbkkkkkkkkkK
Deutschland                             DEppbbbbbbbbkkkkkkkkkk
Dominikanische Republik                 DOppbbbbkkkkkkkkkkkkkkkkkkkk
Estland                                 EEppbbkkkkkkkkkkkkkK
Färöer                                  FOppbbbbkkkkkkkkkK
Finnland                                FIppbbbbbbkkkkkkkK
Frankreich                              FRppbbbbbssssskkkkkkkkkkkKK
Französisch-Guayana                     GFppbbbbbssssskkkkkkkkkkkKK
Französisch-Polynesien                  PFppbbbbbssssskkkkkkkkkkkKK
Französische Süd- und Antarktisgebiete  TFppbbbbbssssskkkkkkkkkkkKK
Georgien                                GEppbbkkkkkkkkkkkkkkkk
Gibraltar                               GIppbbbbkkkkkkkkkkkkkkk
Griechenland                            GRppbbbsssskkkkkkkkkkkkkkkk
Grönland                                GLppbbbbkkkkkkkkkK
Guadeloupe                              GPppbbbbbssssskkkkkkkkkkkKK
Guatemala                               GTppbbbbkkkkkkkkkkkkkkkkkkkk
Hong Kong                               HKppbbbbkkkkkkkk
Irland                                  IEppbbbbsssssskkkkkkkk
Island                                  ISppbbbbsskkkkkkXXXXXXXXXX
Israel                                  ILppbbbssskkkkkkkkkkkkk
Italien                                 ITppKbbbbbssssskkkkkkkkkkkk
Jungferninseln                          VGppbbbbkkkkkkkkkkkkkkkk
Kasachstan                              KZppbbbkkkkkkkkkkkkk
Kroatien                                HRppbbbbbbbkkkkkkkkkk
Kuwait                                  KWppbbbbkkkkkkkkkkkkkkkkkkkkkk
Lettland                                LVppbbbbkkkkkkkkkkkkk
Libanon                                 LBppbbbbkkkkkkkkkkkkkkkkkkkk
Liechtenstein                           LIppbbbbbkkkkkkkkkkkk
Litauen                                 LTppbbbbbkkkkkkkkkkk
Luxemburg                               LUppbbbkkkkkkkkkkkkk
Malta                                   MTppbbbbsssssskkkkkkkkkkkkkkkkk
Marokko                                 MAppbbbaaakkkkkkkkkkkkKK
Martinique                              MQppbbbbbssssskkkkkkkkkkkKK
Mauretanien                             MRppbbbbbssssskkkkkkkkkkkKK
Mauritius                               MUppbbbbbbsskkkkkkkkkkkkkkkKKK
Mayotte                                 YTppbbbbbssssskkkkkkkkkkkKK
Mazedonien                              MKppbbbkkkkkkkkkkKK
Moldawien                               MDppbbkkkkkkkkkkkkkkkkkk
Monaco                                  MCppbbbbbssssskkkkkkkkkkkKK
Montenegro                              MEppbbbkkkkkkkkkkkkkKK
Neukaledonien                           NCppbbbbbssssskkkkkkkkkkkKK
Niederlande                             NLppbbbbkkkkkkkkkk
Norwegen                                NOppbbbbkkkkkkK
Österreich                              ATppbbbbbkkkkkkkkkkk
Pakistan                                PKppbbbbrrkkkkkkkkkkkkkk
Palästinensische Autonomiegebiete       PSppbbbbrrrrrrrrrkkkkkkkkkkkk
Polen                                   PLppbbbssssKkkkkkkkkkkkkkkkk
Portugal                                PTppbbbbsssskkkkkkkkkkkKK
Réunion                                 REppbbbbbssssskkkkkkkkkkkKK
Rumänien                                ROppbbbbkkkkkkkkkkkkkkkk
Saint-Barthélemy                        BLppbbbbbssssskkkkkkkkkkkKK
Saint-Martin                            MFppbbbbbssssskkkkkkkkkkkKK
San Marino                              SMppKbbbbbssssskkkkkkkkkkkk
Saudi-Arabien                           SAppbbkkkkkkkkkkkkkkkkkk
Schweden                                SEppbbbkkkkkkkkkkkkkkkkK
Schweiz                                 CHppbbbbbkkkkkkkkkkkk
Serbien                                 RSppbbbkkkkkkkkkkkkkKK
Slowakei                                SKppbbbbsssssskkkkkkkkkk
Slowenien                               SIppbbssskkkkkkkkKK
Spanien                                 ESppbbbbssssKKkkkkkkkkkk
St. Pierre und Miquelon                 PMppbbbbbssssskkkkkkkkkkkKK
Tschechien                              CZppbbbbkkkkkkkkkkkkkkkk
Tunesien                                TNppbbssskkkkkkkkkkkkkKK
Türkei                                  TRppbbbbbrkkkkkkkkkkkkkkkk
Ungarn                                  HUppbbbssssKkkkkkkkkkkkkkkkK
Vereinigte Arabische Emirate            AEppbbbkkkkkkkkkkkkkkkk
Vereinigtes Königreich                  GBppbbbbsssssskkkkkkkk
Wallis und Futuna                       WFppbbbbbssssskkkkkkkkkkkKK
Zypern                                  CYppbbbssssskkkkkkkkkkkkkkkk
#exit

AD, BE, ... Länderkennzeichen
pp zweistellige Prüfsumme
b Stelle der Bankleitzahl
d Kontotyp
k Stelle der Kontonummer
K Kontrollziffern
r Regionalcode
s Stelle der Filialnummer (Branch Code / code guichet)
A, B, C, D, E, F, X sonstige Funktionen
Quelle: http://de.wikipedia.org/wiki/International_Bank_Account_Number
und hier noch ´ne kleine Test-Umgebung:

Code: Alles auswählen

#Prg_Name = "IBAN_Test"       
#Prg_Vers = "13716a"          ;<-- set by PB_VersUpd Vers 11415a
#PB_Vers  = "4.20"

#Debug_IBAN = 1 ;erweitere Debugger-Anzeigen aktivieren

EnableExplicit
XIncludeFile "C:\AlsterSoft\PureBasic\PB4.20\Module\IBAN.PBI" ;der Code oben...

DisableExplicit

IBAN("DE", "init");IBAN-DefinitionsDatei einlesen (nur wg. Landes-Suche in Zl 20 + Zl 25 erforderlich)

Repeat
  Land$ = InputRequester(#Prg_Name, "Landes-Kennung ?", Land$)
  If Land$ = "" : End : EndIf
  If Len(Trim(Land$)) = 2 ;{LandesKennung angegeben: Land entsprechend Masken-Anfang suchen
    Such$ = UCase(Trim(Land$))
    Land = IBAN_Def       ;IBAN_Base von hinten nach oben durchsuchen
    While Left(IBAN_Base(Land)\Mask$, 2)<>Such$ And Land>0 : Land - 1 : Wend ;}
  Else                    ;{LandesNamen angegeben: Land lt. LandesName suchen
    Such$ = UCase(Trim(Land$))
    Such = Len(Such$);wg. SuchSpeed-Optimierung
    Land = IBAN_Def       ;IBAN_Base von hinten nach oben durchsuchen
    While UCase(Left(IBAN_Base(Land)\Land$, Such))<>Such$ And Land>0 : Land - 1 : Wend ;
  EndIf
  If Not Land
    MessageRequester("unbekanntes Land", "Das angegebene Land " + #DQUOTE$ + Land$ + #DQUOTE$ + #LF$ + "ist nicht in der IBAN-Liste vorhanden.", #MB_OK|#MB_ICONWARNING)
  Else
    Defines$ = ""
    If FindString(IBAN_Base(Land)\Mask$, "b", 1)
      BLZ$ = ReplaceString(InputRequester(#Prg_Name, "BankLeitZahl ?", BLZ$), " ", "")
      Defines$ + "b=" + BLZ$ + " "
    EndIf
    If FindString(IBAN_Base(Land)\Mask$, "d", 1)
      kTyp$ = ReplaceString(InputRequester(#Prg_Name, "KontoTyp ?", kTyp$), " ", "")
      Defines$ + "d=" + kTyp$ + " "
    EndIf
    If FindString(IBAN_Base(Land)\Mask$, "k", 1)
      KontoNr$ = ReplaceString(InputRequester(#Prg_Name, "KontoNr ?", KontoNr$), " ", "")
      Defines$ + "k=" + KontoNr$ + " "
    EndIf
    If FindString(IBAN_Base(Land)\Mask$, "K", 1)
      Kontroll$ = ReplaceString(InputRequester(#Prg_Name, "KontrollZiffern ?", Kontroll$), " ", "")
      Defines$ + "K=" + Kontroll$ + " "
    EndIf
    If FindString(IBAN_Base(Land)\Mask$, "r", 1)
      Region$ = ReplaceString(InputRequester(#Prg_Name, "RegionalCode ?", Region$), " ", "")
      Defines$ + "r=" + Region$ + " "
    EndIf
    If FindString(IBAN_Base(Land)\Mask$, "s", 1)
      Filial$ = ReplaceString(InputRequester(#Prg_Name, "FilialNr ?", Filial$), " ", "")
      Defines$ + "s=" + Filial$ + " "
    EndIf
    If Defines$>""
      IBAN$ = IBAN(Land$, Defines$)
      If Left(IBAN$, 1) = "!" ;Fehler
        Msg$ = "bei IBAN(" + #DQUOTE$ + Land$ + #DQUOTE$ + ", " + #DQUOTE$ + Defines$ + #DQUOTE$ + ")" + #LF$
        Msg$ + "ist ein Fehler aufgetreten:" + #LF$
        Msg$ + #LF$ + Mid(IBAN$, 3) + #LF$
        MessageRequester("IBAN-Fehler !!!", Msg$, #MB_OK|#MB_ICONERROR)
      Else
        Msg$ = "IBAN(" + #DQUOTE$ + Land$ + #DQUOTE$ + ", " + #DQUOTE$ + Defines$ + #DQUOTE$ + ")" + #LF$
        Msg$ + "ist " + #DQUOTE$ + IBAN$ + #DQUOTE$ + #LF$
        MessageRequester("IBAN-Info", Msg$, #MB_OK|#MB_ICONINFORMATION)
      EndIf
    EndIf
  EndIf
Until Land$ = ""
Bild Bild
peter-ross-privat
Beiträge: 10
Registriert: 15.07.2013 14:48
Computerausstattung: Zu Hause keine!

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von peter-ross-privat »

Vielen Dank für den komfortablen Code mit Ini-Datei.

Meine kleine Version ist zwar nur auf die Bedürfnisse und Notwendigkeiten meines Arbeitgebers zugeschnitten, aber besser eine Thematik komplett abwickeln als nur Bruchstücke fertigzustellen.

mfG Peter Roß

ps: Wir hier fragen uns sowieso, was das soll. In der IBAN ist die BLZ sowie die Kontonummer, wenn diese falsch erfasst wurde, kann auch der Einzug nicht laufen. Das 'DE' für Deutschland wird sowieso bei den Banken intern schon seit langem mitgeschleppt.
Der XML-Kram vereinfacht das alles auch nicht. Es ist unglaublich leserlich, Beispiel:

Code: Alles auswählen

	<MndtId>555544</MndtId>
	<DtOfSgntr>2012-11-12</DtOfSgntr>
	<AmdmntInd>true</AmdmntInd>
	<AmdmntInfDtls>
		<OrgnlMndtId>444444</OrgnlMndtId>
		<OrgnlCdtrSchmeId>
			<Nm>Schrauben AG</Nm>
			<Id>
				<PrvtId>
					<Othr>
						<Id>DE16HVB00000017432</Id>
						<SchmeNm>
							<Prtry>SEPA</Prtry>
						</SchmeNm>
					</Othr>
				</PrvtId>
			</Id>
		</OrgnlCdtrSchmeId>
		<OrgnlDbtrAcct>
			<Id>
				<IBAN>DE84700202700654150818</IBAN>
			</Id>
		</OrgnlDbtrAcct>
		<OrgnlDbtrAgt>
			<FinInstnId>
				<Othr>
					<Id>SMNDA</Id>
				</Othr>
			</FinInstnId>
		</OrgnlDbtrAgt>
	</AmdmntInfDtls>
</MndtRltdInf>
Alles klar?
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von Kiffi »

peter-ross-privat hat geschrieben:[XML]
Alles klar?
Wr ht sih ds dnn ausgdcht? :lol:
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von bobobo »

Ds wr bstmmt n Schwb .. :D

dr n Lppr :mrgreen:
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
peter-ross-privat
Beiträge: 10
Registriert: 15.07.2013 14:48
Computerausstattung: Zu Hause keine!

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von peter-ross-privat »

Hier ein Verweis auf die ISO-Codes, da das postalische Länderkennzeichen nicht dem ISO-Code für die IBAN entspricht.

Siehe ... http://www.aufenthaltstitel.de/staaten/schluessel.html

Dort kann man die Daten herauskopieren, in einer Tabellenkalkultion umstricken für einen Abgleich.

Bei uns wird die LKZ-Tabelle erweitert werden.

Für den, der es braucht, mfG Peter
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: IBAN - Berechung, Pflicht ab dem 01.02.2014

Beitrag von STARGÅTE »

Hallo peter-ross-privat, bitte passe dein Titel an, denn eine "IBAN - Berechung" ist für mich etwas anderes als eine "IBAN - Berechnung"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten