Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   XE5 - MySQL und FireDAC (https://www.delphipraxis.net/181715-xe5-mysql-und-firedac.html)

hberdel 4. Sep 2014 13:19

Datenbank: MySQL • Version: 5.0.11 • Zugriff über: FireDAC

XE5 - MySQL und FireDAC
 
Hallo, ich bin dabei, die Datenbank von BDE auf MySQL umzustellen. Nun habe ich einige Datumsfelder in den Tabellen. Wegen der amerikanischen Darstellung des Datums als (date) in MySQL habe ich diese Felder als String (varchar(10)) angelegt. Für die Darstellung im DBGrid sollen die Datumswerte auf das europäische Datumsformat umgestellt werden. Um eine Sortierung zu ermöglichen habe ich ein VIEW erzeugt, das aber nicht funktioniert.

VIEW `vert_sort_mietbeginn_1` AS select `vertrag`.`MietBeginn` AS `mb_string`,
str_to_date('00.00.0000',get_format(DATE, 'EUR')) AS `mb_date` from `vertrag`

Das Ergebnis ist eine nach String (also falsche) Sortierung in der Spalte mb_string. Die Spalte mb_date enthält überall den Wert 0000-00-00.

Eine andere Variante geht auch nicht:

VIEW `ver_sort_mietbeginn` AS select `vertrag`.`MietBeginn` AS `mb_string`,
str_to_date(`vertrag`.`MietBeginn`,_utf8'%d,%m,%Y' ) AS `mb_date` from `vertrag`

Das Ergebnis ist eine nach String (also falsche) Sortierung in der Spalte mb_string, wie oben. Die Spalte mb_date enthält überall den Wert NULL.

Vielleicht sieht jemand eine Lösung, danke voraus.

Sir Rufo 4. Sep 2014 13:26

AW: XE5 - MySQL und FireDAC
 
Zunächst wäre es schön, wenn du den SQL-Code auch in SQL-Code-Tags packen könntest.
SQL-Code:
VIEW `vert_sort_mietbeginn_1` AS
  select
    `vertrag`.`MietBeginn` AS `mb_string`,
    str_to_date('00.00.0000',get_format(DATE, 'EUR')) AS `mb_date` 
  from `vertrag`
dann wird das ungemein lesbarer :)

Warum nimmst du nicht einfach den Typ
SQL-Code:
date
? Wie MySQL das dann intern abspeichert kann dir doch sowas von egal sein.
Und weil wir ja alle immer nur bei Abfragen mit Parametern arbeiten, ist das bei der Abfrage dann auch egal:
Delphi-Quellcode:
Query.SQL.Text = 'SELECT * FROM foo WHERE mb_date = :ein_datum';
Query.ParamByName( 'ein_datum' ).Value := EncodeDate( 2014, 01, 01 ); // Einfach ein Datum übergeben
Query.Open;

DeddyH 4. Sep 2014 13:28

AW: XE5 - MySQL und FireDAC
 
Nur sollte man bei ParamByName auch den Namen des Parameters angeben und nicht den des Feldes ;)

Sir Rufo 4. Sep 2014 13:29

AW: XE5 - MySQL und FireDAC
 
Zitat:

Zitat von DeddyH (Beitrag 1271025)
Nur sollte man bei ParamByName auch den Namen des Parameters angeben und nicht den des Feldes ;)

Hab ich doch sofort nach deinem Hinweis geändert

hberdel 8. Sep 2014 17:47

AW: XE5 - MySQL und FireDAC
 
Hallo, zuerst mal vielen Dank für Eure Hilfe. Ich weiß jetzt wieder, wo der Knackpunkt war: Wie kriege ich meine Datumswerte im amerikanischen Datumsformat in MySQL importiert, wo doch meine Daten in "deutscher" Form vorliegen. Deshalb hatte ich wohl den Weg des geringsten Widerstandes genommen und in MySQL den String-Typ für das Datum genommen . . . was dann hinterher wieder seine Tücken zeigte.

Nun will ich Euch nicht vorenthalten, welchen genialen Einfall ich hatte. Vor dem Export der Daten aus der BDE habe ich das Datumsformat meines PC auf JJJJ-mm-dd geändert und den Datentyp im MySQL auf "date" geändert - und alles war ratz-fatz erledigt. Die größte Überraschung war dann, dass im Delphi die Datumswerte wieder wie ganz selbstverständlich im gewohnten Format angezeigt werden ... und die Sortierung funktioniert auch problemlos.

Merci

Harald

Sir Rufo 8. Sep 2014 18:18

AW: XE5 - MySQL und FireDAC
 
Das ist keine Überraschung, sondern genau das was wir versucht haben dir zu erklären :roll:

Und wenn du in der alten Datenbank auch ein Feld vom Typ Datum hattest, dann ist die Übertragung absolut kein Problem, wenn man Abfragen mit Parametern nutzt. Das ist nicht nur sicherer, sondern auch erheblich schneller bei der Übertragung.

hberdel 29. Sep 2014 16:00

AW: XE5 - MySQL und FireDAC
 
Folgendes Problem mit der SQL-Syntax aus dem 'alten Delphi mit BDE':

SELECT * FROM Vertrag V, Haeuser H
WHERE (V.Haus = H.Haus)
AND (Haus = :Haus)
AND (Mietende BETWEEN :MpLfdA AND :MpLfdE)
ORDER BY V.MietBeginn


wird von MySQL angemeckert ab dem 'bold-Teil'. Ich kann überhaupt keine entsprechende Beschreibung für die Verwendung von Parametern in der SQL-Referenz finden.

mkinzler 29. Sep 2014 16:13

AW: XE5 - MySQL und FireDAC
 
es liegt nicht am Paarmeter sondern daran, dass der Feldname Haus nicht eindeutig ist
SQL-Code:
SELECT * FROM Vertrag V, Haeuser H
WHERE (V.Haus = H.Haus)
AND (H.Haus = :Haus)
AND (Mietende BETWEEN :MpLfdA AND :MpLfdE)
ORDER BY V.MietBeginn

hberdel 3. Okt 2014 20:06

AW: XE5 - MySQL und FireDAC
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schön, dass ihr mir geholfen habt. Ich musste allerdings die Parameter-Doppelpunkte durch '@' ersetzen. MySQL hat jetzt also den VIEW akzeptiert. Wenn ich allerdings das Programm in der Entwicklungsumgebung ausführe bekomme ich eine Fehlermeldung von FireDAC, dass der Datentyp des Parameters 'Haus' nicht bekannt sei. Wo kann ich den ergänzen? Im Delphi habe ich den Datentyp schon eingestellt. Wo finde ich TFDParam.DataType?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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