Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Auslesen von Float Werten (https://www.delphipraxis.net/143873-auslesen-von-float-werten.html)

Starstruck 25. Nov 2009 09:09

Datenbank: SQLite • Version: 3.6 • Zugriff über: ZEOS

Auslesen von Float Werten
 
Hallo,
ich habe ein Problem mit dem Auslesen von Float Werten aus meiner SQLite Datenbank. In der DB wird als Dezimaltrennzeichen offensichtlich ein '.' verwendet. Wenn ich jetzt die Werte auslesen will bekommt ich natürlich die Fehlermeldung dass der Wert kein Float Typ ist, da ich in meinem Programm/System ja ein ',' als Dezimaltrennzeichen habe. Wie bekomme ich nun korrekte Werte aus meiner DB? Für den Zugriff auf SQLite verwende ich ZEOS 6.6.5
Delphi-Quellcode:
ZQueryRead.FieldByName('size').AsFloat
geht jedenfalls nicht.
Wenn ich die Werte so
Delphi-Quellcode:
ZQueryRead.FieldValues['size']
auslese erhalte ich Strings die so ausehen:
1.0
1.5
4.0

Hat da jemand eine Idee? Oder mach ich da was falsch?

Neutral General 25. Nov 2009 09:19

Re: Auslesen von Float Werten
 
Hi,

Kann es sein, dass "Size" in deiner DB-Tabelle ein Stringfeld ist? Dann würde ich das mal ändern.. Ansonsten kannst du notfalls noch versuchen:

Delphi-Quellcode:
DecimalSeparator := '.';
ZQueryRead.FieldByName('size').AsFloat
Das ist allerdings eine sehr unschöne Art und Weise!

Ich wette in der DB hast du Size als CHAR oder VARCHAR deklariert.. Du solltest wie gesagt besser den Feldtyp in Float ändern

Starstruck 25. Nov 2009 09:29

Re: Auslesen von Float Werten
 
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
DecimalSeparator := '.';
ZQueryRead.FieldByName('size').AsFloat

An sowas hatte ich auch schon gedacht, aber wie Du schon sagst - es ist nicht wirklich schön.
Der Feldtyp in der DB ist wirklich Float. Ich habe die DB mit SQLite Administrator angelegt und zur Sicherheit mit dem SQLite Manager (Firefox AddOn) geprüft. Ich hab den Feld Typ auch mal auf Real umgestellt. Hat aber auch nix gebracht. Komischerweise kann man im SQLite Manager auch String Werte speichern! Im SQLite Administrator geht das nicht ! Der SQLite Administrator zeigt übrigens die Werte mit ',' an, der SQLite Manager mit '.'!

himitsu 25. Nov 2009 09:36

Re: Auslesen von Float Werten
 
Du erstellst dir entweder eine Funktion, welche es als String ausließt und dann umwandelt.
(Delphi-Referenz durchsuchenStr und Delphi-Referenz durchsuchenVal nutzen immer den Punkt als Dezimalzeichen)

Oder (aber dazu würde ich nicht raten) du stellst wärend des Auslesens den Delphi-Referenz durchsuchenDecimalSeparator kurz um.
[edit] wurde schon gesagt [/edit]

Oder, man erstellt sich 'nen neues Property für TField, welches den ersten Vorschlag nutzt
(geht aber nur in neueren Delphi-Versionen)
Delphi-Quellcode:
type
  TFieldHelper = class Helper for TField
  private
    function GetAsFloatEx: Double;
  public
    property AsFloatEx: Double read GetAsFloatEx;
  end;

function TFieldHelper.GetAsFloatEx: Double;
var e: Integer;
begin
  Val(AsString, Result, e);
  //if e > 0 then Exception_oder_so;
end;

Neutral General 25. Nov 2009 09:38

Re: Auslesen von Float Werten
 
Zitat:

Zitat von Starstruck
Zitat:

Zitat von Neutral General
Delphi-Quellcode:
DecimalSeparator := '.';
ZQueryRead.FieldByName('size').AsFloat

An sowas hatte ich auch schon gedacht, aber wie Du schon sagst - es ist nicht wirklich schön.
Der Feldtyp in der DB ist wirklich Float. Ich habe die DB mit SQLite Administrator angelegt und zur Sicherheit mit dem SQLite Manager (Firefox AddOn) geprüft. Ich hab den Feld Typ auch mal auf Real umgestellt. Hat aber auch nix gebracht. Komischerweise kann man im SQLite Manager auch String Werte speichern! Im SQLite Administrator geht das nicht ! Der SQLite Administrator zeigt übrigens die Werte mit ',' an, der SQLite Manager mit '.'!

Wie die Werte angezeigt werden, ist prinzipiell Sache des Programms und von daher sagt das nichts aus würde ich mal behaupten. Außer, dass dein Feld wahrscheinlich wirklich ein Float-Feld ist.

Was du mal machen könntest ist ZQueryRead.FieldByName('size').DataType zu überprüfen. Wobei es auch sein kann, dass es FieldType heißt. Da steht ja drin welchen Typ das Feld hat, oder notfalls für welchen Typ Zeos dieses Feld hält :stupid:

Starstruck 25. Nov 2009 10:30

Re: Auslesen von Float Werten
 
Hallo,

also ich habe jetzt die Lösung von himitsu umgesetzt, nur halt als einfache Funktion und nicht als neue Propertie von Tfield. Das muss ich mir später nochmal anschauen.

@Neutral General
Du hast Recht. Offensichtlich wird mein Feld als String erkannt. Trotzdem kann ich bei SELECT Befehlen mit < und > suchen bzw filtern.

Nochmals Danke an alle.

Neutral General 25. Nov 2009 10:33

Re: Auslesen von Float Werten
 
Zeig mal deine Query

Starstruck 25. Nov 2009 10:46

Re: Auslesen von Float Werten
 
Beispiel Query
SQL-Code:
SELECT t.model as model, max(t.size) as size
FROM device_tbl as t
WHERE t.size > 2
GROUP BY t.model
ORDER BY t.model DESC
LIMIT 0, 30
Ich habe mal versuchsweise einen Text in das 'size' Feld geschrieben. Eigentlich sollte er dann nicht mit ausgelesen werden. Wird er aber doch. Ist aber auch nicht so schlimm später werden ja eh nur Float Werte zugelassen.

Sherlock 25. Nov 2009 11:10

Re: Auslesen von Float Werten
 
Nutzt Du persistente Felder für deise Query?
Wenn ja, lösch die alle mal und erzeuge sie neu.


Sherlock

Starstruck 25. Nov 2009 11:51

Re: Auslesen von Float Werten
 
Da ich nicht weiss was persistente Felder sind, denke ich mal dass das nicht so ist!
Aber wie könnte ich feststellen ob ich persistente Felder verwende und was genau ist das - vorformatierte Felder ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.
Seite 1 von 2  1 2      

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