Einen Fehler glaube ich gefunden zu haben (oder ich stelle mich zu doof an):
Wenn ich IBANS erstellen lasse wird neben der (korrekten) IBAN irgendwie immer ein falscher Bankname/BIC ermittelt?
Kann das jemand nachvollziehen? Ich möchte hier keine BSP-Daten nennen...
P.S.
Die gleiche BLZ in der Suche führt zur richtigen Bank
Würde ich ja gern prüfen, aber ohne irgendeinen weiteren Hinweis, bei welcher Konstellation der Fehler auftritt, ist das kaum möglich.
Was ich brauche, ist die BLZ, bei der der Fehler auftritt, die Kontonummer ist hier irrelevant, weil die BLZ-Daten ausschließlich über die BLZ zugeordnet werden.
Da alle BLZ veröffentlicht werden, kann die ja nicht so fürchterlich geheim sein, oder?
Also nenne doch bitte die BLZ, dann gehe ich dem gerne nach.
Hat sich schon erledigt.
Background:
Die BLZ-Datei enthält zur Zeit 19340 Datensätze, aber "nur" 4069 verschiedene BLZ; es werden also viele BLZ mehrfach genannt.
Außerdem sind in der BLZ-Date alle Daten als Text enthalten. Die Suche nach einer bestimmten BLZ ist deshalb recht "unperformant".
Aus diesem Grund erstelle ich bei Programmstart ein Array of TBankInfoIndex, wobei TBankInfoIndex so definiert ist:
Delphi-Quellcode:
TBankInfoIndex=Record
BankCode:integer; // BLZ
First:integer; // Erster Eintrag für BLZ in BLZ-Datei
Last:integer; // Letzter Eintrag für BLZ in BLZ-Datei
Lead:integer; // Der "führende" Eintrag für BLZ (Mark=1)
FUNCTION Bank:String; // "BLZ = Name, Plz, Ort, Anzahl Stellen"
FUNCTION CFIndex:integer; // Prüfmethode für Kontonummern
End;
Dieses Array hat nur 4069 Einträge und enthält die BLZ in numerischer Form.
Die Funktion BankCodeIndex findet in diesem Array jede BLZ mit maximal 12 Zugriffen.
Der Fehler war, dass ich bei der Zuordung der bankbezogenen Daten mit dem Index in dieses Array auf die BLZ-Datei zugegriffen habe. Richtig wäre, zunächst aus TBankInfoIndex[Index] entweder Lead, First, Last oder einen zwischen First und Last liegenden Index zu holen, und mit diesem auf die BLZ Datei zuzugreifen.
Ich habe das korrigiert und ordne jetzt die bankbezogenen Daten via "Lead", also der führenden Stelle einer Bank zu.
An dieser Stelle (mir ist das auch erst jetzt aufgefallen) sei gesagt, dass eine
eindeutige Zuordung über die BLZ nicht möglich ist.
Was ich implementieren kann und werde, ist, den Anwender wählen zu lassen, ob er die Daten aus der führenden Stelle oder dem erst- oder letztgenannten Eintrag haben möchte, oder aus allen Einträgen. Letzteres ergibt dann für viele BLZ mehrere Resultate, aber ich sehe im Moment keine Lösung einer eindeutigen Datenzuordnung.
Die Änderung werde ich im Laufe des Abends durchführen und die neue Version hochladen.
NormanNG: Danke für den Hinweis.
Delphi-Quellcode:
FUNCTION BankCodeIndex(blz:integer):integer; overload;
var first,last:integer; p:TPBankInfoIndex;
begin
first:=0;
last:=High(BankInfoIndex);
if last>=0 then
repeat
result:=(last+first) shr 1;
p:=@BankInfoIndex[result];
if p.BankCode<blz then first:=result+1
else if p.BankCode>blz then last:=result-1
else exit;
until (first>last);
result:=-1;
end;
FUNCTION BankCodeIndex(const blz:string):integer; overload;
var n:integer;
begin
if TryStrToInt(blz,n) then result:=BankCodeIndex(n) else result:=-1;
end;
Neue Version in #1