AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[Firebird]

Ein Thema von MyRealName · begonnen am 18. Mai 2014 · letzter Beitrag vom 19. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
572 Beiträge
 
Delphi 10.4 Sydney
 
#1

[Firebird]

  Alt 18. Mai 2014, 17:53
Datenbank: Firebird • Version: 2.52 • Zugriff über: UniDAC
Hallo zusammen,

haben gerade mal einen Fehler in einer Berechung von Daten in der datenbank gesucht und sind auf ein recht seltsames Verhalten gestossen :

Ich schreiben in Tabelle 1 den Wert 422,24 rein. Das Feld ist als Numeric(15,5) gekennzeichnet (brauche 5 Nachkommastellen).
Eine Stored Procedure kopiert den wert dann (über eine Variable die ebenfalls als Numeric (15,5) angelegt ist in einer 2. Tabelle, wo das Feld Feld auch als Numeric(15,5) angelegt ist. Kein Trigger verändert den Wert, aber er kommt als 422,23999 dort an und wird von dort auch mit diesem Wert weiter verarbeitet

Das verursacht Probleme in der Berechnung später, wenn ich zum Beispiel einen Durchschnittspreis berechne und ich 422,24 Einheiten wegnehme, dann habe ich Werte wie -0,0099976 und dann dann dividiert durch einen Wert ergibt ziemlich doofe Zahlen :0

Idee, woran sowas liegt ? Ist es ein generelles Firebird Problem ?

Danke schonmal,
Helge
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: [Firebird]

  Alt 18. Mai 2014, 18:01
Das Problem ist nicht Firebird sondern Delphi (bzw. der Datentyp den du verwendest).

Siehe hier

Ganz besonders wichtig ist dieser Artikel (englisch)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
572 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: [Firebird]

  Alt 18. Mai 2014, 19:31
Etwas seltsames ist mir aufgefallen :

ich habe 2 Stored Procedures, die den wert kopieren, beiden arbeiten mit der gleiche Variablen-Definition, Numeric (15,5).
Die eine, wir im originalen Post schon geschrieben, wandelt mit die Daten um. Die andere nicht. Da kommt die Zahl als 422.24 an, anstatt 422,239997 etc
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
572 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [Firebird]

  Alt 18. Mai 2014, 19:32
Das Problem ist nicht Firebird sondern Delphi (bzw. der Datentyp den du verwendest).

Siehe hier

Ganz besonders wichtig ist dieser Artikel (englisch)
Weiss nicht, ob Delphi das Problem sein kann, da der Fehler in der Stored Procedure passiert. In der Originaltablle, wo Delphi reinschreibt, kommt derWet ja korrekt an.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: [Firebird]

  Alt 18. Mai 2014, 20:34
Wie kopierst Du denn die Werte in der Stored Procedure? Nicht, das Du da eine Variable verwendest, die irgendwie als 'Float' oder 'Double' deklariert ist.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.311 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: [Firebird]

  Alt 18. Mai 2014, 20:37
welchen Dialekt hat die Datebank?

Den bekommst Du so raus:

Code:
isql <Datenbank> -user <> -password <>

SQL> show sql dialect;
Client SQL dialect is set to: 3 and database SQL dialect is: 3
wenn hier irgend wo was vom Dialect 1 die Rede ist, dann ist das Verhalten klar, denn unter Dialect 1 werden Numerics und co. als Doubles gespeichert
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
572 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: [Firebird]

  Alt 19. Mai 2014, 12:57
welchen Dialekt hat die Datebank?

Den bekommst Du so raus:

Code:
isql <Datenbank> -user <> -password <>

SQL> show sql dialect;
Client SQL dialect is set to: 3 and database SQL dialect is: 3
wenn hier irgend wo was vom Dialect 1 die Rede ist, dann ist das Verhalten klar, denn unter Dialect 1 werden Numerics und co. als Doubles gespeichert
also dein befehl gibt das folgende aus : http://puu.sh/8SqgB.png
scheinbar 3.

und wie gesagt, die variable beim kopieren ist als Numeric(15,5) deklariert, genauso wie das source-feld und das Zielfeld.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.311 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: [Firebird]

  Alt 19. Mai 2014, 13:05
und wie gesagt, die variable beim kopieren ist als Numeric(15,5) deklariert, genauso wie das source-feld und das Zielfeld.
schon klar, nur im Dialect 1 werden die halt dennoch als Double gespeichert, weil es da keinen Int64 gibt.

Gibt es eine Chance die betreffenden Tabellen und StoredProcedure als Sourcen zu sehen?
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
572 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: [Firebird]

  Alt 19. Mai 2014, 13:19
und wie gesagt, die variable beim kopieren ist als Numeric(15,5) deklariert, genauso wie das source-feld und das Zielfeld.
schon klar, nur im Dialect 1 werden die halt dennoch als Double gespeichert, weil es da keinen Int64 gibt.

Gibt es eine Chance die betreffenden Tabellen und StoredProcedure als Sourcen zu sehen?
klar

aber ich habe gerade was anderes gefunden, was vielelicht Aufschluss gibt, von daher (auch weil die sourcen teilweise recht lang sind) heben wir uns das für danach auf

Also wenn ich die stored procedure vom Programm aufrufe, dann hat diese den Wert als 422.24 in der 1. Tabelle (wird durch UniDac in Delphi geschrieben) und die SP kopiert den Wert dann als 422.23999 in die Tabelle 2.

Rufe ich nach dem Speichern in der 1. Tabelle die SP direkt in SQL auf, kopiert er korrekt :O

Gerade ind en Verbindungs-Eigenschaften von TUniConnection nachgeschaut, verbindet auch mit SQL Dialekt 3

Geändert von MyRealName (19. Mai 2014 um 13:21 Uhr) Grund: Info nachgereicht
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.823 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: [Firebird]

  Alt 19. Mai 2014, 13:25
Delphi speichert den Wert als Delphityp zwischen, da es keinen nativen Fixed Point gibt nimmt er halt einen Float.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf