![]() |
Datenbank: Informix • Version: 7-10 • Zugriff über: Nativer Treiber + BDE (noch)
TDataSet.Locate funktioniert nicht bei ....
Hallo!
"Locate" schon sehr oft erfolgreich benutzt. Hauptsächlich bei besonders großen Tabellen, für Sachen wie
Delphi-Quellcode:
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.
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; Im aktuellen Fall ist es ein (Informix)-Datenbankfeld
SQL-Code:
Ich suche mit insgesamt 4 Feldern nach dem Datensatz (die sind auch der Index, aber das spielt eigentlich keine Rolle beim Locate).
DECIMAL(16,4)
Delphi-Quellcode:
Habe ALLES durchprobiert, auch indem ich das VarArray manuell belege:
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.
Delphi-Quellcode:
Weiß eine(r) was ich beim Locate falsch mache?
// 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! Ich tippe auf einen Bug. |
Re: TDataSet.Locate funktioniert nicht bei ....
Hallo,
was steht vermutlich und was steht tatsächlich in
Delphi-Quellcode:
Kann es sein, dass da eine unbeabsichtigte Typkonvertierung durchgeführt wird, die Du (leider) nicht zu sehen bekommst?
Ein_entsprechendes_VariantArray
Ändert sich was, wenn Du es so probierst?
Delphi-Quellcode:
Dann findet keine Typkonvertierung statt.
Tabelle.Locate('feld1;feld2;feld3;feld4',VarArrayOf([12, 'testwert2', 1.43, 'testwert4' ],[]);
|
Re: TDataSet.Locate funktioniert nicht bei ....
Hallo... :hi:
Zitat:
Beispiel: Wert im Edit: 1,23 Wert in der DB: 1,2298457 Das kommt öfter vor als man denkt, wenn man FloatWerte speichert. Abhilfe: - den DB Wert mit FormatFloat bearbeiten und dann vergleichen. - direkt mit Locate wirst du wahrscheinlich schlechte Karten haben, da du den Wert in der DB direkt nicht im Locate formatieren kannst. hoffe geholfen zu haben :hi: PS: auch mit deinem bevorzugten DB Editor kannst du manchmal (je nach Einstellung oder Programmierung) den Unterschied nicht erkennen, da auch der Editor die Anzeige formatiert. Ich schau mal in einem alten Projekt wo ich das gleiche Problem hatte wie ich das ganze gelöst habe. versuch mal für den Anfang den Wert vor Ablegen in die DB schon zu formatieren und dann zu schreiben. (ohne Gewähr :wink: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz