Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Float-Werte für Filterung mit Nachkommastellen maskieren (https://www.delphipraxis.net/177508-float-werte-fuer-filterung-mit-nachkommastellen-maskieren.html)

messie 10. Nov 2013 18:47

Datenbank: Firebird • Version: 2.5x • Zugriff über: IBDAC

Float-Werte für Filterung mit Nachkommastellen maskieren
 
Moin,

vielleicht fehlen mir nur die richtigen Suchbegriffe aber zu meiner Frage bekomme ich keine Ergebnisse.
Ich habe Float-Felder, die ich gerne in einem TCRDBGrid filtern möchte. Die Funktion zum Filtern gehört ja dazu. Nun habe ich die Anzeige im Grid auf drei Nachkommastellen begrenzt. Eine Filterung schlägt deshalb fehl, da sie ja auf die DB und nicht auf die Anzeige angewendet wird und da sind die Nachkommastellen nicht begrenzt. Eine Aussage ob das vom TCRDBGrid so korrekt ist mag ich mangels Erfahrung nicht tätigen.

Gibt es dazu eine sinnvolle Strategie?

Danke, Messie

Union 10. Nov 2013 19:38

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Gibt es dort keine Option, ob die Filterung auf die Datenmengen-Werte oder die Anzeigewerte erfolgen soll? Bei DevExpress gibt es das z.b.

messie 10. Nov 2013 20:35

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von Union (Beitrag 1235348)
Gibt es dort keine Option, ob die Filterung auf die Datenmengen-Werte oder die Anzeigewerte erfolgen soll? Bei DevExpress gibt es das z.b.

Magst Du mir da mal mit Stichworten bei den Eigenschaften aushelfen?

Danke, Messie

Furtbichler 11. Nov 2013 06:52

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Andere Idee: Du prüfst auf Gleichheit, nicht wahr? Verwendest Du vielleicht den Filter des Datasets? Oder macht das dieses Grid?

Falls Du das machst, dann ändere die Bedingung von 'Feld=1.23' auf 'Feld>=1.229 and Feld<=1.231' o.ä..

EarlyBird 11. Nov 2013 10:28

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Noch eine andere Idee:
Du erstellst eine Abfrage in der du das Floatfield auf 3 stellen rundest und nimmst die Abfrage als Datasource für das Grid
Delphi-Quellcode:
SELECT Floatwert, round([Floatwert],3) as Floatgerundet
  FROM Tabelle

Furtbichler 11. Nov 2013 13:51

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Das funktioniert auch nicht zuverlässig, da '0.1 <> 1.0-0.9'. Altbekanntes floating point problem.
Wenn deine Anwendung kein BCD hat, musst Du in Delphi mit Bereichen filtern oder die Zahl als Text ansehen. Dann wird es aber mit Relationen schwierig (<,>)

messie 11. Nov 2013 19:12

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Moin,

und Danke für Eure Hilfe. Die Grid-Kompo filtert nach Gleichheit. Somit dürfte die Variante von Earlybird auf den ersten Blick die beste sein. Ich werde berichten.

Grüße, Messie

messie 17. Nov 2013 20:14

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Hallo,

nun wollte ich da mal weiter machen. Leider entstehen in dem Projekt große zeitliche Pausen die es nicht einfacher machen, das richtig zu durchdringen - sorry.

Die Variante von Earlybird hat nicht funktioniert. Ich habe den View auf die drei Stellen begrenzt und auch die Variante mit der neuen Variablen (as Roundedvalue) probiert.

Ich verstehe es noch nicht ganz. Was mir auffällt, ist die Darstellung in Flamerobin. Warum bekomme ich sechs Nachkommastellen angezeigt, egal ob ich zwei oder drei Stellen im View angebe? Es kommt mir so vor als wäre der View gar nicht so gerundet wie erwartet.

Danke, Messie

messie 19. Apr 2015 19:28

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von messie (Beitrag 1235342)
Moin,

vielleicht fehlen mir nur die richtigen Suchbegriffe aber zu meiner Frage bekomme ich keine Ergebnisse.
Ich habe Float-Felder, die ich gerne in einem TCRDBGrid filtern möchte. Die Funktion zum Filtern gehört ja dazu. Nun habe ich die Anzeige im Grid auf drei Nachkommastellen begrenzt. Eine Filterung schlägt deshalb fehl, da sie ja auf die DB und nicht auf die Anzeige angewendet wird und da sind die Nachkommastellen nicht begrenzt. Eine Aussage ob das vom TCRDBGrid so korrekt ist mag ich mangels Erfahrung nicht tätigen.

Gibt es dazu eine sinnvolle Strategie?

Danke, Messie

Moin,

das Thema ist jetzt tatsächlich wieder aktuell.
Ich kann leider weiterhin nur Ganzzahlen filtern. Zahlen mit Nachkommastellen lassen sich nicht filtern, obwohl der zum Grid zugeordnete View mit drei Nachkommastellen erzeugt und angezeigt wird.

Eine Zahl aus dem View 0,100 kann ich also nicht ausfiltern. Warum? Auch mein Round(Param,digits)-View wird in Flamerobin nicht korrekt angezeigt. Liegt das Problem darin?

Grüße, Messie

mkinzler 19. Apr 2015 19:33

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zeige mal die Abfrage.

messie 19. Apr 2015 19:59

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von mkinzler (Beitrag 1298428)
Zeige mal die Abfrage.

Meinst Du den View?
Code:
select
Round(BATCHES.OUTPUT_PER_TURN,3) as OUTPUT_GERUNDET, PUMPS.STEP_COUNT,
BATCHES.IDENTNO, BATCHES.DRAWING_NO, INTERNAL_ORDER_NO.INTERNAL_ORDER, INTERNAL_ORDER_NO.INTERNAL_ORDER,
BATCHES.NUMBER_OF_PUMPS
from
BATCHES, INTERNAL_ORDER_NO, PUMPS
where
BATCHES.ORDER_ID = INTERNAL_ORDER_NO.ID
and
PUMPS.BATCH_ID = BATCHES.ID
;
Egal wie ich round einstelle, in Flamerobin wird der View immer mit sechs Nachkommastellen angezeigt.

Grüße, Messie

Sir Rufo 19. Apr 2015 20:03

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von messie (Beitrag 1298429)
Zitat:

Zitat von mkinzler (Beitrag 1298428)
Zeige mal die Abfrage.

Meinst Du den View?

Nein, die View :mrgreen:

mkinzler 19. Apr 2015 20:22

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Egal wie ich round einstelle, in Flamerobin wird der View immer mit sechs Nachkommastellen angezeigt.
Nur angezeigt oder auch nicht gerundet?
Was für einen Typ hat die Spalte?

Dejan Vu 20. Apr 2015 06:34

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Du kannst Floatingpoint runden, bis der Arzt kommt, dein Problem wird immer wieder auftreten. Eine Zahl 0.001 lässt sich nun einmal nicht genau als FP darstellen, d.h. Du rundest auf 3 Stellen, es kommt aber trotzdem 0.0099999999345 heraus (z.B.).

Nochmal zum Mitschreiben:
Floating Point Werte und auf Gleichheit prüfen => geht nicht.

Abhilfe:
a: In der View dafür sorgen, das wirklich nur 3 Nachkommastellen auftauchen. Dafür kann man eine UDF schreiben und das Ergebnis entweder als BCD (hatten wir das nicht schon?) oder als String formatieren/konvertieren.

b: Die gleiche Logik im TDataset als berechnetes Feld anwenden, das programmtechnisch garantiert 3 Nachkommastellen aufweist. Das geht in Delphi nur über einen String. Und dann mit diesem Feld filtern.

messie 20. Apr 2015 17:12

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von Dejan Vu (Beitrag 1298450)
Du kannst Floatingpoint runden, bis der Arzt kommt, dein Problem wird immer wieder auftreten. Eine Zahl 0.001 lässt sich nun einmal nicht genau als FP darstellen, d.h. Du rundest auf 3 Stellen, es kommt aber trotzdem 0.0099999999345 heraus (z.B.).

Na ja, Delphi kann das schon. Ist da auch ein String unter der Haube?

Zitat:

Zitat von Dejan Vu (Beitrag 1298450)
a: In der View dafür sorgen, das wirklich nur 3 Nachkommastellen auftauchen. Dafür kann man eine UDF schreiben und das Ergebnis entweder als BCD (hatten wir das nicht schon?) oder als String formatieren/konvertieren.

Die View scheint die drei Nachkommastellen zu können. Wohl aber nicht die Filterfunktion des Grids. Daher ist das wahrscheinlich auch nicht in der Dokumentation von Devart beschrieben. Ich weiß auch nicht, ob bei IBDAC Quellen dabei sind, ich befürchte nicht.

Grüße, Messie

mkinzler 20. Apr 2015 17:15

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Die View scheint die drei Nachkommastellen zu können. Wohl aber nicht die Filterfunktion des Grids. Daher ist das wahrscheinlich auch nicht in der Dokumentation von Devart beschrieben. Ich weiß auch nicht, ob bei IBDAC Quellen dabei sind, ich befürchte nicht.
Das kommt darauf an, ob du die Sourcen gekauft hast oder nicht. Die vom Grid sind aber glaube ich auf jeden Fall dabei.

Aber ich würde einfach die Anzahl der Nachkommastellen verringern und nicht nur Runden:

SQL-Code:
select
CAST (Round(BATCHES.OUTPUT_PER_TURN,3) as DECIMAL( 18,3)) as OUTPUT_GERUNDET, PUMPS.STEP_COUNT,
BATCHES.IDENTNO, BATCHES.DRAWING_NO, INTERNAL_ORDER_NO.INTERNAL_ORDER, INTERNAL_ORDER_NO.INTERNAL_ORDER,
BATCHES.NUMBER_OF_PUMPS
from
BATCHES, INTERNAL_ORDER_NO, PUMPS
where
BATCHES.ORDER_ID = INTERNAL_ORDER_NO.ID
and
PUMPS.BATCH_ID = BATCHES.ID
;

messie 26. Apr 2015 16:10

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Super Markus,

das hat geklappt.

Vielen Dank!

Grüße, Messie

mkinzler 26. Apr 2015 18:22

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Wenn du keine so vielen Nachkommastellen benötigst, könntest Du auch die Typen in der Datenbank entsprechend abändern.

messie 26. Apr 2015 18:28

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von mkinzler (Beitrag 1299334)
Wenn du keine so vielen Nachkommastellen benötigst, könntest Du auch die Typen in der Datenbank entsprechend abändern.

Ok, da habe ich mit Float gearbeitet. Würde als Typ denn ein kleinerer DECIMAL gehen? Was würde das bei der Geschwindigkeit ausmachen?

Und vor allem: geht das rückwirkend zu ändern?

Grüße, Messie

mkinzler 26. Apr 2015 18:32

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Es würde jeweils der Cast entfallen. Den Typ kannst Du natürlich an die Bedürfnisse anpassen, DECIMAL(18,3) bedeuteu 15 Vor- und 3 Nachkommastellen.
Ob man den Typ entsprechend anpassen kann mustt Du schauen, notfalls über ein den Umweg einer weiteren Spalte.

messie 26. Apr 2015 18:36

AW: Float-Werte für Filterung mit Nachkommastellen maskieren
 
Zitat:

Zitat von mkinzler (Beitrag 1299337)
Es würde jeweils der Cast entfallen. Den Typ kannst Du natürlich an die Bedürfnisse anpassen, DECIMAL(18,3) bedeuteu 15 Vor- und 3 Nachkommastellen.
Ob man den Typ entsprechend anpassen kann mustt Du schauen, notfalls über ein den Umweg einer weiteren Spalte.

Danke, ich komme mit den Typen hin.

Es geht nur um eine View, die dauert nicht so lange beim Aufruf.

Grüße, Messie


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