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$ = ""