Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück (https://www.delphipraxis.net/211146-mysql-funktion-z-b-year-gibt-je-nach-db-unterschiedliche-typen-zurueck.html)

Medium 3. Aug 2022 12:10

Datenbank: MySQL/MariaDB • Version: diverse • Zugriff über: UniDAC

MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Ich möchte gern eine einfache Abfrage machen:
Code:
SELECT
  YEAR(V_Dat) yr,
  MONTH(V_Dat) mn,
  DAY(V_Dat) dy,
  SUM(Anteil_I) sm
FROM
  rpohis
WHERE
  Tank_Nr = 20 
GROUP BY
  DATE(V_Dat)
ORDER BY
  yr DESC,
  mn ASC,
  dy ASC
Das ganze in einer TUniQuery, in welcher ich die Felder anlegen lassen habe.

Mit meiner DB auf meinem Entwicklungs-PC werden diese für die Spalten yr, mn und dy als TIntegerField angelegt.
Auf dem Live-System beim Kunden ist statt MariaDB noch eine ältere MySQL Installation, die ich auch nicht mal eben wechseln kann. Diese scheint für die Datumsfunktionen nun aber LargeInts zurückzugeben, sodass mein Programm dann meckert, dass TLargeField erwartet würden, aber TIntegerField gefunden wurden.

Ich habe bislang keine Möglichkeit gefunden, wie ich in dem SELECT einen bestimmten Ergebnistyp erzwingen kann. CAST() und CONVERT() lassen lediglich die generischen SIGNED und UNSIGNED Tyen zu, die zum selben Problem führen. Einen View kann ich auf dem Live-System aus mir unbekannten Gründen auch nicht erzeugen (die Option zum Anlegen ist unter HeidiSQL ausgegraut) - mit dem hätte ich ja die Möglihckeit die Typen fix zu definieren.

Was könnte ich da noch versuchen?

Sinspin 3. Aug 2022 12:31

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Ich verstehe jetzt nicht ganz wo Du das Problem hast.
Deine TUniQuery hat angelegte Felder? Und es knallt dann auf einem von beiden Rechnern?

Dann arbeite doch ohne angelegte Felder. Das macht doch eh nur Ärger.
Und greif dann via FieldByName('FieldName').As... zu.

Medium 3. Aug 2022 13:07

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Das ist leider keine Option, wenn ich das Ergebnis dann mit einer TDataSource in einen TAdvDBGrid darstellen will. Nen Grid von Hand zu befüllen würde ich gern vermeiden, und wozu hab ich denn sonst so schmucke Komponenten gekauft =)

himitsu 3. Aug 2022 13:23

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Du kannst doch im Grid die Spalten schon erstellen und falls die im DtaSet dafür nötig waren, dann aus dem Dataset wieder rauslöschen und automatisch erstellen lassen.

Neuerdings können viele Query-Komponenten nun auch Beides (z.B. FireDAC), also ein paar Felder im Designer oder vorm Öffnen per Code dran und den Rest beim Open automatisch. (früher ging nur entweder oder)

Uwe Raabe 3. Aug 2022 13:26

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Mit FireDAC könnte man auch das Datentyp-Problem mit einem entsprechenden Mapping lösen. Ob, und wenn ja, wie das mit TUniQuery geht, kann ich leider nicht sagen.

Medium 3. Aug 2022 13:57

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Mein Fehler: Habe vergessen zu erwähnen, dass das unter D2007 passieren muss. Das sollte eine ganz einfache aus der Hüfte geschosssene Funktion für ein bestehendes Programm werden, mit der man sich Verbräuche summiert pro Tag anzeigen lassen kann. Habe ich unentgeldlich zugesagt, weil "ist ja bloß 2 Zeilen SQL, und nen Grid auf ein Fenster schmeißen". Bis ich es dann beim Kunden ausgeführt habe war das auch so...

Also: FireDAC schön und gut, kann ich hier aber nicht mal so eben austauschen ohne ein paar Mannwochen Arbeit. Ich habe bei Uni nichts gefunden, was irgendwie den Namen "Mapping" trägt, und habe auch nicht wirklich eine Vorstellung davon was das genau macht in diesem Zusammenhang.

Das Alter der IDE und Komponenten führt fürchte ich auch dazu, dass Himi's 2. Idee hier nicht eingesetzt werden kann.
Die erste verstehe ich nicht ganz. Die Spalten im Grid an sich sind nicht das Problem, sondern die Fields die ich im Field-Editor der Query anlege. Da diese mitsamt ihres Typen fest im Deklarationsteil landen, verstehe ich gerade nicht wie ich da zur Laufzeit etwas löschen/hinzufügen können soll.

Uwe Raabe 3. Aug 2022 14:04

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Seit ein paar Versionen erlaubt ein TDataSet einen Mischbetrieb mit statischen und dynamischen Feldern. Das würde aber das Typ-Problem vermutlich gar nicht lösen.

Allerdings unterstützt auch UniDAC so ein Mapping: https://docs.devart.com/unidac/data_type_mapping.htm - zumindest in der aktuellen Version.

Medium 3. Aug 2022 14:20

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Sieht interessant aus, aber die D2007 Komponenten haben die entsprechenden Methoden und Eigenschaften offenbar leider noch nicht :(

Kann ich das nicht auch evtl. auf Seite der DB oder Abfrage lösen? Irgendwie muss man doch einem Result-Set konkrete Typen aufdrücken können :?

Sinspin 3. Aug 2022 14:22

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Zitat:

Zitat von Medium (Beitrag 1509696)
Das ist leider keine Option, wenn ich das Ergebnis dann mit einer TDataSource in einen TAdvDBGrid darstellen will.

Alle meine Queries kommen ohne statische Felder und hängen genauso auch an Grids. Allerdings DevExpress.

Im Regelfall lade ich die Query einmal zur Designzeit und lasse vom Grid alle Columns erstellen.
Zur Laufzeit macht der Grid sich dann selber ran und ordnet alles passend zu. Namen und Typen sind ja bekannt. Der Grid hat zum Glück keine Probleme wenn die Typen leicht abweichen.

Wenn dein Grid damit nicht klarkommt, die Columns müssten sich doch auch zur Laufzeit erstellen lassen? ...dann jeweils mit den passenden Typen.

Zitat:

Zitat von Medium (Beitrag 1509696)
Kann ich das nicht auch evtl. auf Seite der DB oder Abfrage lösen? Irgendwie muss man doch einem Result-Set konkrete Typen aufdrücken können

Eigentlich ja, aber du hast ja schon geschrieben dass CAST keinen Einfluss zu haben scheint.

himitsu 3. Aug 2022 14:27

AW: MySQL Funktion (z.B. YEAR()) gibt je nach DB unterschiedliche Typen zurück
 
Es gibt irgendwo in der Komponente eine/meherere Tabelle/Listen, wo Übersetzungen drin stehen.

DatenbankTypen -> TDataType/TFieldType -> TFieldClassIrgendwas


Und dann kann man eben teilweise im Select einen CAST machen.



Bei uns gibt es noch was bissl Krankes, wo unsere abgeleiteten Querys (TPgQuery) nochmal ein
Delphi-Quellcode:
SELECT * FROM &tablenbame
im BeforeOpen machen, um von der Datenbank die Typen abzufragen und die fehlenden Felder noch schnell zu erstellen. (Fields durchgehen und was noch nicht existiert als FieldDef ins eigentliche Query kopieren)
Einige Felder erstellen wir manuell, z.B. wo Einstellungen gemacht und Events angehängt werden. Der Rest kommt "automatisch" aus der DB, so wie es dort grade aussieht.
Nach dem Open kann man ja leider keine TFieldXyz anhängen.

Jetzt, im aktuellen Delphi, wo es eventuell nun auch gemischt beim Erstellen geht (selber + automatisch), wäre es nicht mehr zwingend nötig das vor dem Open zu machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.
Seite 1 von 3  1 23      

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