AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TDataSet.Locate funktioniert nicht bei ....
Thema durchsuchen
Ansicht
Themen-Optionen

TDataSet.Locate funktioniert nicht bei ....

Ein Thema von little-x · begonnen am 27. Feb 2009 · letzter Beitrag vom 27. Feb 2009
Antwort Antwort
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
nahpets
(Gast)

n/a Beiträge
 
#2

Re: TDataSet.Locate funktioniert nicht bei ....

  Alt 27. Feb 2009, 12:31
Hallo,

was steht vermutlich und was steht tatsächlich in Ein_entsprechendes_VariantArray Kann es sein, dass da eine unbeabsichtigte Typkonvertierung durchgeführt wird, die Du (leider) nicht zu sehen bekommst?
Ändert sich was, wenn Du es so probierst?
Tabelle.Locate('feld1;feld2;feld3;feld4',VarArrayOf([12, 'testwert2', 1.43, 'testwert4' ],[]); Dann findet keine Typkonvertierung statt.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#3

Re: TDataSet.Locate funktioniert nicht bei ....

  Alt 27. Feb 2009, 13:18
Hallo...
Zitat:
Die Locate-Methode scheint nur solange zu funktionieren, wie in Suchfeldern kein Float (Double etc)-Wert zu finden ist.
...ich tippe mal darauf, daß der Float Wert in der Tabelle sich von dem Wert, welchen du visuell siehst unterscheidet.
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

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 )
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:19 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