Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00 (https://www.delphipraxis.net/210096-firedac-query-fields%5Bidx%5D-asstring-gibt-147-aus-anstelle-147-00-a.html)

juergen 1. Mär 2022 12:06

Datenbank: ZEN • Version: 14 • Zugriff über: FireDAC/ ODBC

FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Hallo,

ich muss eine csv-Datei erzeugen mit Daten aus einer Datenbank. Dabei muss ich für alle nummerischen Werte eine Norm einhalten (nnn,nn).
Also wende ich im SQL-Statement brav
Code:
CAST( <SPALTE_X> As DECIMAL(3,2) )
an. Das Result zeigt auch alle nummerischen Werte in dem Format nnn,nn an.

Wenn ich nun in Delphi Qry.Fields[Idx].AsString anwende, wird anstelle 147,00 dann nur noch 147 ausgegeben. Ich muss das als ".AsString" casten wegen Ausgabe in eine TStringList, die später das Ganze als csv-Datei wegspeichert.

Erschwerend: Es ist ein dynamisches SQL-Statement, dass der Anwender über einen Dialog zusammenstellt. Ich weiß also nicht welche Spalte welchen Datentyp hat. Ich will vermeiden, dass ich die ganzen Datentypen pro Spalte abprüfen muss um es dann entsprechend zu formatieren.
Weiß jemand wie ich bei Verwendung des Cast "AsString" bei einer Query das Ganze so anpassen kann, dass bei Zahlen diese immer im Format nnn,nn ausgegeben werden? In den ganzen Query-Optionen habe ich nichts gefunden.

Vielen Dank!

DeddyH 1. Mär 2022 12:16

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Zitat:

Ich will vermeiden, dass ich die ganzen Datentypen pro Spalte abprüfen muss um es dann entsprechend zu formatieren.
Da wirst Du wohl nicht ganz umhin kommen. Denkbar wäre, den Feldtyp auf TFloatField zu prüfen und entweder DisplayFormat zu setzen oder den String selbst zu formatieren. Ist es kein FloatField, dann einfach bei AsString belassen.

juergen 1. Mär 2022 12:47

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Danke @DeddyH.

Ich habe jetzt erst einmal eine Q&D-Lösung. Gefällt mir nicht, scheint aber in ersten Tests zu funktionieren.
Ihr kennt das auch, oder? Wenn nicht genügend Zeit ist, dann muss man auch mit Q&D- Lösungen leben, wenn sie denn funktionieren.

Code:
s := FD_Qry.Fields[Idx].AsString;
IF TryStrToFloat( s, ls_FloatValue ) THEN Zeile := Zeile + Separator_from_ini + FormatFloat( '000.00', ls_FloatValue )
ELSE
    Zeile := Zeile + Separator_from_ini + s

Uwe Raabe 1. Mär 2022 12:47

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
AsString ist dafür nicht geeignet. Um das DisplayFormat-Setzen bei dem Feld kommst du zwar trotzdem nicht herum, aber den damit erzeugten String bekommst du über das Property DisplayText.

juergen 1. Mär 2022 13:06

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Danke Uwe!
Ich habe das jetzt geändert in
Code:
s := FD_Qry.Fields[Idx].DisplayText;

Frickler 2. Mär 2022 11:29

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Erzeugt ein CAST(... AS DECIMAL) nicht ein TBCDField statt eines TFloatField?

Rolf Frei 2. Mär 2022 14:26

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Den CAST brauchst du doch garnicht, da du eh in deinem Delphi Programm die Formatierung mit DisplayFormat und DisplayText machst.

juergen 2. Mär 2022 19:54

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Danke an alle Helfenden!

@by Frickler,
Du hast Recht, ein CAST(... AS DECIMAL) erzeugt ein TBCDField. Ein CAST(... AS FLOAT) erzeugt ein TFloatField, aber beide Varianten ändern nicht das Verhalten, das die Ausgabe von 147,00 (aus dem SQL-Result) bei der Ausgabe von Qyr.Fields[Idx].DisplayText oder Qyr.Fields[Idx].AsString nur den String 147 ausgibt , anstelle 147,00.

Dein Anstoss mit den TField-Typen hat mich nun aber in eine ganz neue Richtung gelenkt! :-D
Ich habe jetzt folgendes umgesetzt:

Delphi-Quellcode:
  my_Format := '0.00';
  TFloatField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TBCDField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TFMTBcdField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TCurrencyField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;

  s := Qyr.Fields[Idx].DisplayText;
Ich hoffe ich habe alle Typen, die Nachkommastellen haben können, aufgeführt und kann so in meiner Schleife über die Query alles korrekt formatiert in String ausgeben.

@Rolf Frei,
Danke für den Tipp mit dem CAST. Den hatte ich tatsächlich noch im SQL-Statement drin. :oops:

Uwe Raabe 2. Mär 2022 20:08

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Zitat:

Zitat von juergen (Beitrag 1502872)
Delphi-Quellcode:
  my_Format := '0.00';
  TFloatField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TBCDField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TFMTBcdField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  TCurrencyField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;

  s := Qyr.Fields[Idx].DisplayText;

Das kannst du auch einfacher haben:
Delphi-Quellcode:
  my_Format := '0.00';
  TNumericField( Qyr.Fields[Idx] ).DisplayFormat := my_Format;
  s := Qyr.Fields[Idx].DisplayText;

juergen 2. Mär 2022 21:42

AW: FireDac-Query.Fields[Idx].AsString gibt 147 aus anstelle 147,00
 
Hallo Uwe,

TNumericField kannte ich noch nicht. Vielen Dank für diese Erleuchtung! :thumb:

Gute Nacht!


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