Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Interne Umwandlung von String zu Float? (https://www.delphipraxis.net/152600-interne-umwandlung-von-string-zu-float.html)

Mysterio08 29. Jun 2010 10:55

Datenbank: MySQL • Version: 5,1 • Zugriff über: OBDC

Interne Umwandlung von String zu Float?
 
Tag,

meine relationale Datenbank funktioniert soweit gut, ich kann neue Datensätze erstellen, löschen, aber selbstverständlich auch speichern - speichern aber nur eingeschränkt.
Ein Tabellenfeld einer Tabelle ist vom Typ FLOAT. Das Problem ist, dass ich keine Kommawerte ein die Datenbank einspeißen kann, ich bekomme immer folgende Fehlermeldung, wenn ich einen Dezimalwert, mit Komma getrennt, speichern will.:
[MySQL][ODBC 5.1 Driver][mysqld-5.1.47-community]Incorrect decimal value: '5,5' for column 'Honorarsatz' at row 1".

Jetzt meine Frage: Woran liegt das? Etwa das Delphi intern von String nach FLOAT (ich habe auch schon DOUBLE und DECIMAL erfolglos ausprobiert) umwandelt wie die Funktion Val? Wenn ja, wie kann ich den Fehler beheben?
Der Dezimalpunkt ist gesperrt, ich habe auch schon erfolglos probiert das Komma in einen Punkt beim OnPressKey-Ereignis umzuwandeln.

mfg.

angos 29. Jun 2010 11:09

AW: Interne Umwandlung von String zu Float?
 
Das liegt daran, dass StrToFloat in den Wert mit Komma zurückgibt, das DBMS aber einen Punkt als Trennzeichen verlangt. Du musst also nur das Komma durch den Punkt ersetzen.

Gruß

DeddyH 29. Jun 2010 11:15

AW: Interne Umwandlung von String zu Float?
 
Ein Float ist ein Float, da gibt es keinen Punkt und kein Komma. Wie sieht denn das Insert-Statement aus?

hoika 29. Jun 2010 11:58

AW: Interne Umwandlung von String zu Float?
 
Hallo,

du darfst den Float-Wert nicht per AsString übergeben,
sondern als AsFloat.

D.h. Parameter benutzen.


Heiko

Bernhard Geyer 29. Jun 2010 12:03

AW: Interne Umwandlung von String zu Float?
 
Zitat:

Zitat von Mysterio08 (Beitrag 1032248)
[MySQL][ODBC 5.1 Driver][mysqld-5.1.47-community]

Verwendest du evtl. auch noch BDE oder ADO? Falls ja: in den untiefen der MySQL-Webseite steht Beschrieben wie man mit diesen Zugriffswegen halbwegs auf MySQL zugreifen kann (Einstellungen im MyODBC-Treiber).

Ach ja bedenke auch: Wenn du über diesen Weg ein Apps schreibst die nur mit MySQL arbeitet sind für jede Verteilung bei einem Closed Source-Programm eine MySQL-Lizenz fällig!

Mysterio08 29. Jun 2010 12:17

AW: Interne Umwandlung von String zu Float?
 
@angos:
Zitat:

"Das liegt daran, dass StrToFloat in den Wert mit Komma zurückgibt, das DBMS aber einen Punkt als Trennzeichen verlangt."
Das habe ich mir schon gedacht.
Zitat:

Du musst also nur das Komma durch den Punkt ersetzen.
Das habe ich jetzt gemacht mit der "Stringbearbeitung", einfach nach dem Komma und gesucht, und dann die Prozeduren DELETE und INSERT benutzt. Das klappt, danke!


@DeddyH:
Zitat:

Ein Float ist ein Float, da gibt es keinen Punkt und kein Komma. Wie sieht denn das Insert-Statement aus?
Mhm, da scheine ich deine ersten Satz misszuverstehen: Float = Gleitkommawert, also zwangsläufig mit Punkt und/oder Komma. Insert-Statement:

@hoika:
Zitat:

du darfst den Float-Wert nicht per AsString übergeben,
sondern als AsFloat.

D.h. Parameter benutzen.
Parameter benutze ich natürlich, mein SQL-String sieht gekürzt so aus:
Delphi-Quellcode:
Sql := 'UPDATE auftraggeber SET ... Honorarsatz=:12 ... WHERE AuftraggeberID= :ID';
Und die Parameter-Zuweisung so:
Delphi-Quellcode:
AdoQuery3.Parameters.ParamByName('12').Value := DBText12.Text;
Ich glaube, man kann kritisieren, dass ich als Parameter Zahlen verwende, aber ich habe auf meiner Form 14 DBEdits, es werden relativ viele Daten erfasst. Dies gestalte ich aber alles mit Schleifen, die Datenerfassung so:
Delphi-Quellcode:
for i := 2 to Max do Texts[i] := (FindComponent('DBEdit' + IntToStr(i)) as TDBEdit).Text;
Und dann fülle ich die Parameter auch per Schleife:
Delphi-Quellcode:
for i := 2 to Max do AdoQuery3.Parameters.ParamByName(IntToStr(i)).Value := Texts[i];
Ich bin mir nicht 100%ig sicher, aber die TAdoQuery-Komponente bietet doch nicht die Möglichkeit, wie z.B. TQuery (wenn ich mich da richtig entsinne) den Typ mit anzugeben, also AsString, AsFloat etc.

Bernhard Geyer 29. Jun 2010 12:33

AW: Interne Umwandlung von String zu Float?
 
Zitat:

Zitat von Mysterio08 (Beitrag 1032294)
Und dann fülle ich die Parameter auch per Schleife:
Delphi-Quellcode:
for i := 2 to Max do AdoQuery3.Parameters.ParamByName(IntToStr(i)).Value := Texts[i];
Ich bin mir nicht 100%ig sicher, aber die TAdoQuery-Komponente bietet doch nicht die Möglichkeit, wie z.B. TQuery (wenn ich mich da richtig entsinne) den Typ mit anzugeben, also AsString, AsFloat etc.

Weis den Wert erstmal einer Delphi-Float-Variable zu befor du es an Value übergibst.
Vermutung: Das Property Value ist ein Variant und merkt sich den Typ der übergeben wurde. Deshalb ist hier eine interne String nach Float-Wandlung nötig die nicht nötig wäre wenn du eine Float-Variable an das Value-Property übergibst.

DeddyH 29. Jun 2010 12:34

AW: Interne Umwandlung von String zu Float?
 
Nicht die Float hat ein Trennzeichen, sondern deren Darstellung. Und Du übergibst einen String an ein Float-Feld. Wie ist es so?
Delphi-Quellcode:
AdoQuery3.Parameters.ParamByName('12').Value := StrToFloat(DBText12.Text);

Mysterio08 29. Jun 2010 12:41

AW: Interne Umwandlung von String zu Float?
 
Delphi-Quellcode:
AdoQuery3.Parameters.ParamByName('12').Value := StrToFloat(DBText12.Text);
Das ist einleuchtend! Das Problem bei der Sache ist ja nur, dass ich bisher alles schön per Schleife übergeben konnte, das ist ja so nicht mehr möglich, weil ich ja String-, Float- und andere Feldtypen habe. Gibt es eine Funktion, mit der ich den Tabellentyp ermitteln kann, sodass ich in etwa so was verwenden kann: ?

Delphi-Quellcode:
if Typ = Float then AdoQuery3.Parameters.ParamByName('12').Value := StrToFloat(DBText12.Text)
Und wenn ich diese Typumwandlung bei der Parameterzuweisung weglassen - was für (gravierende) Nachteile hat dies? Denn momentan läuft es einwandfrei ohne.

schlecki 29. Jun 2010 12:52

AW: Interne Umwandlung von String zu Float?
 
probier mal:

Delphi-Quellcode:
DBText12.Datasource.Dataset.FieldByName(DBText12.FieldName).FieldType //(oder DataType?)
Sollte ungefähr so gehen ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 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-2025 by Thomas Breitkreuz