Hallo!
"Locate" schon sehr oft erfolgreich benutzt. Hauptsächlich bei besonders großen Tabellen, für Sachen wie
Delphi-Quellcode:
If Tabelle.Locate(...) then
begin
Tabelle.Edit;
Tabelle.FieldByName('').AsIrgendwas:= IrgendWas;
//....
Tabelle.Post;
end else
begin
Tabelle.Insert;
Tabelle.FieldByName('').AsIrgendwas:= IrgendWas;
//....
Tabelle.Post;
end;
Gestern bin ich ein bisschen auf den Kopf gefallen. Die Locate-Methode scheint nur solange zu funktionieren, wie in Suchfeldern kein Float (Double etc)-Wert zu finden ist.
Im aktuellen Fall ist es ein (Informix)-Datenbankfeld
DECIMAL(16,4)
Ich suche mit insgesamt 4 Feldern nach dem Datensatz (die sind auch der Index, aber das spielt eigentlich keine Rolle beim Locate).
Delphi-Quellcode:
var Lokalksiert: Boolean;
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld3;feld4'; [Ein_entsprechendes_VariantArray], []);
// FELD3 ist besagtes Feld!!!
// So findet er ihn nicht!!!
// Lasse ich Feld 3 weg, findet er ihn.
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld4'; [Ein_entsprechendes_VariantArray_ohne_feld3], []);
// erfolgreich.
Habe ALLES durchprobiert, auch indem ich das VarArray manuell belege:
Delphi-Quellcode:
// Der Wert des gesuchten Feldes ist 1,43
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld3;feld4'; VarArrayOf(['12', 'testwert2', '1.43', 'testwert4' ]), []);
// auch Punkt durch Komma ersetzt (wobei das bei der Umwandlung von Double nach Variant ohnehin egal ist)
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld3;feld4'; VarArrayOf(['12', 'testwert2', '1,43', 'testwert4' ]), []);
// auch alle Nachkommastellen ausgefüllt
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld3;feld4'; VarArrayOf(['12', 'testwert2', '1,4300', 'testwert4' ]), []);
Lokalisiert:= Tabelle.Locate('feld1;feld2;feld3;feld4'; VarArrayOf(['12', 'testwert2', '1.4300', 'testwert4' ]), []);
// Was aber funktioniert, ist das Finden des Datensatzes mit "Filter"
Tabelle.Filter:= 'feld1 = 12 AND feld2 = ''testwert2'' AND feld3 = 1,43 and Feld4 = ''testwert4''';
Tabelle.Filtered:= True;
Lokalisiert:= (not Tabelle.Eof);
// erfolgreich!
Weiß eine(r) was ich beim Locate falsch mache?
Ich tippe auf einen Bug.