Einzelnen Beitrag anzeigen

little-x

Registriert seit: 13. Apr 2007
Ort: Brandenburg
60 Beiträge
 
Delphi 6 Enterprise
 
#1

TDataSet.Locate funktioniert nicht bei ....

  Alt 27. Feb 2009, 12:05
Datenbank: Informix • Version: 7-10 • Zugriff über: Nativer Treiber + BDE (noch)
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.
manchmal machts mich mürbe
  Mit Zitat antworten Zitat