![]() |
Datenbank: ADS Foxpro • Version: 8. • Zugriff über: Dataset
Locate mit einem Floatwert
Hallo zusammen,
hat jemand von euch schon Erfahrungen gesammelt mit dem Locate auf einer Datenbank mit Floatwerten. Ich habe irgendwie ein Brett vor dem Kopf und stehe damit auf Kriegsfuß. Ich möchte in einer Datenbank nach einem Betrag suchen, Beispiel: dmMain.tbl66.Locate('FELD09',StrToFloat(edtSuchen. Text),[]); ...da meldet sich das Programm mit einem "missmatched.." Fehler. Ich denke das hat was mit dem Komma/Punkt zu tun. OK, da habe ich mir gedacht tauscht du halt den Seperator aus, aber nix da, da kommt zwar keine Fehlermeldung mehr, das Locate findet aber nix obwohl es einen Treffer gibt. Mir kommt es so vor als gäbe es bei Floatwerten Probleme?!??! :gruebel: naja, warscheinlich bin ich das Problem :zwinker: Hilfe wäre riesig!! Danke Polarwar |
Re: Locate mit einem Floatwert
Hallo,
du solltest bei Float-Werten statt mit Locate() mit einem Filter arbeiten. Dort wählst du ein Intervall, das einen ausreichenden Abstand (eine Zehnerpotenz kleiner als die verwendete Genauigkeit) um deinen Suchwert legt. Grüße vom marabu |
Re: Locate mit einem Floatwert
Hallo Marabu,
mit einem Filter kann ich auch umgehen.... :zwinker: Ich bin in einer Datenbank unterwegs die ich der Grösse wegen nicht filtern möchte (> 1.000.000), da die Laufzeit sehr darunter leiden würde. Einen Findkey kann ich auch nicht nutzen, da mein Feld sich nicht im Index befindet. Daher möchte/muss ich ein Locate benutzen um auf gewünschten Datensatz zu springen. Nur gehorcht mir das Dataset nicht so wie ich es mir vorstelle und vorhin beschrieben habe. :wall: Irgendwie muss sich der Locate Befehl doch austricksen lassen, oder auch richtig bedienen lassen, sodass man auch auf Floatwerte locaten kann... Gruß Polarwar |
Re: Locate mit einem Floatwert
Hallo,
ich bin jetzt nicht sicher, ob du mich verstanden hast. Bei der Suche über ein Float-Feld kommst du um eine Intervallsuche nicht herum. Ist die Datenmenge eher klein oder vorselektiert, dann ist ein lokaler Filter sicher kein Problem. Wenn du auf einer großen Tupelzahl suchst, dann tust du das auf dem Server und eine Intervallsuche per SQL ist durch den BETWEEN Operator noch einfacher. Ein Treffer mit Locate() auf einem Float-Feld ist nicht zuverlässig, da die interne Repräsentation des Float-Wertes auf den niederen Bits der Mantisse von Fall zu Fall abweichen kann, jenachdem wie der Float-Wert entstanden ist. Nochmal mit anderen Worten: Float-Werte werden auch außerhalb von Datenbanken nie auf Gleichheit oder Ungleichheit getestet, es wird immer ein Intervall betrachtet. Freundliche Grüße |
Re: Locate mit einem Floatwert
Hallo,
danke erstmal für deine Antwort, aber ich bin jetzt nicht sicher, ob DU mich verstanden hast. :? Ich möchte einfach nur mit einem einfachen Locate (da ich keinen Findkey verwenden kann) auf den nächsten passenden Datensatz springen und mich vorher nicht gross verbiegen. Die Datenmenge ist im Aufruf schon auf ungefähr 1 Mio Datensätze gefiltert und ich kann diesen der Anzeige wegen nicht umsetzen. Daher möchte ich mit dem Locate einen bestimmten Datensatz "aufspüren". Das Floatwerte nicht unbedingt miteinander zu vergliechen sind weiss ich, das gibt unsere Datenbank aber her, da dort nur feste Floatwerte mit gleicher Charakteristik (#####.##) vorkommen. So muss es doch möglich sein mit einem Locate auf Datensätze zu springen..... :freak: Gruß Polarwar |
Re: Locate mit einem Floatwert
Zitat:
|
AW: Locate mit einem Floatwert
Lass die Typumwandlung in Deinem Ausdruck
Zitat:
Code:
dmMain.tbl66.Locate('FELD09',edtSuchen.Text,[]);
|
AW: Locate mit einem Floatwert
Nein, die ist ein Variant, bzw. ein Array aus Variants (bei mehreren Suchfeldern).
Nach was für einem Typen gesucht wird, das hängt von dem Typen des/der Feldes ab, in dem gesucht wird. loPartialKey hilft nur bei "Strings" und wie schon erwähnt, ist die "genaue" Suche nach einem "Float" nicht immer möglich, da ein genauer Vergleich oft garnicht funktioniert, bei solchen "ungenauen" Fließkommatypen. [edit] Grad gemerkt, dass der Thread jahrzehnte alt ist, aber prinzipiell ändert sich nichts an den Aussagen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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