Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Locate mit einem Floatwert (https://www.delphipraxis.net/99895-locate-mit-einem-floatwert.html)

Polarwar 19. Sep 2007 10:36

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

marabu 19. Sep 2007 13:45

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

Polarwar 19. Sep 2007 14:39

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

marabu 19. Sep 2007 16:06

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

Polarwar 21. Sep 2007 08:44

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

joachimd 21. Sep 2007 14:01

Re: Locate mit einem Floatwert
 
Zitat:

Zitat von Polarwar
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.

Versuche mal, ob Du mit [loPartialKey] einen Datensatz findest. Auf jeden Fall brauchst Du einen SoftSeek, da es einen exakten Vergleich bei Fließkommazahlen niemals [TM] gibt.

TheJester 28. Dez 2020 16:35

AW: Locate mit einem Floatwert
 
Lass die Typumwandlung in Deinem Ausdruck
Zitat:

Code:
dmMain.tbl66.Locate('FELD09',StrToFloat(edtSuchen. Text),[]);

weg. Der Suchwert ist immer ein String, also

Code:
dmMain.tbl66.Locate('FELD09',edtSuchen.Text,[]);

himitsu 28. Dez 2020 18:00

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 15:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz