Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Ungenaue Summenbildung

Begonnen von hanskuhn, Juli 08, 2011, 09:28:01

⏪ vorheriges - nächstes ⏩

hanskuhn

Hallo,

mir ist aufgefallen, dass ich in Access 2010 eine ungenaue Summenbildung habe, obwohl ich Datentyp double und fest eingestellte Nachkommawerte habe.

Konkret geht es um meinen Wert [% von vermietbar]

Ich erstelle zunächst meine Tabelle:
DoCmd.RunSQL "CREATE TABLE tblTest (...ProzentVermietbar DOUBLE...)

Die Werte sollen der Tabelle aus einer Abfrage zugewiesen werden, und zwar gleich als Summen. In der Abfrage liegen die Werte auch noch mit den gewünschten Dezimalstellen vor. In meiner Testtabelle werden die Nachkommastellen dann nach Belieben gerundet. Bspw. werden aus 1,52 -> 1,52; aus 1,53 aber -> 1,5. Deshalb habe ich erfolglos versucht, eine feste Anzahl  an Dezimalstellen zu forcieren:
"INSERT INTO tblTest (...ProzentVermietbar...)" & _
"SELECT Format(Sum(qrySumTFF.[% von vermietbar]), '.0000000')"

Ich komme nun nicht mehr weiter. Andere Datentypen habe ich auch schon versucht, bringt allerdings auch nichts :/


MzKlMu

Hallo,
die Dezimalstellen sind für die Berechnung bedeutungslos, es wird immer mit der für den Datentyp passenden Genauigkeit gerechnet.
Wieso aber 1,53 zu 1,5 wird ist mir unerklärlich.
Versuche es mal mit dem Datentyp "Währung".

Warum erstellst Du überhaupt eine Tabelle? Du hast doch die Werte in der Abfrage. Wozu dann noch die Tabelle?
In einer Datenbank sollten solche Aktionen eigentlich nicht erforderlich sein.
Gruß Klaus

hanskuhn

#2
Hey,

mit Currency habe ich es ebenfalls bereits probiert. Das Ergebnis bleibt dasselbe.
Die Tabelle erstelle ich, weil dort noch andere berechnete Werte einfließen, die dann in einem Bericht dargestellt werden sollen. Wäre Datengrundlage des Berichtes nur die eine Abfrage, haettest du natuerlich recht!

Dasselbe macht er übrigens auch, wenn ich auf meine Quell-Abfrage "qrySumTFF" eine weitere Abfrage mache: Die Werte werden entweder auf die erste oder zweite Nachkommastelle gekürzt und er rundet falsch (0,196 -> 0,19).

hanskuhn

Also gut,

auf zwei Stellen rundet er zumindest richtig, wenn ich folgendermaßen formatiere:

Sum(Format(qrySumTFF.[% von vermietbar],'Standard'))

Warum er optional nicht mit '.000' auf drei Stellen rundet, ist mir allerdings immernoch schleierhaft.

ebs17

ZitatWarum er optional nicht mit '.000' auf drei Stellen rundet, ist mir allerdings immernoch schleierhaft.
Mir nicht. Ein gültiges Zahlenformat benötigt sicher mindestens eine Stelle vor dem Komma.
Außerdem hat Formatieren nichts mit Runden zu tun. Siehe Dir mal FAQ2.1 bei donkarl an.

Ob man gerundete bzw. formatierte Werte in der Tabelle (die kein User ansehen sollte) benötigt oder besser bei der Anzeige im Formular, wäre eine weitere Überlegung wert.

MfGA
ebs

hanskuhn

Naja, in diesem Fall ja schon - da runden nunmal nicht funktioniert, format aber (fast) das gewünschte Ergebnis bringt. Mir reicht es zumindest aus. Werde das Thema aber noch nicht schließen, falls noch wer einen Einfall hat.

database

Hallo,

Zitatda runden nunmal nicht funktioniert
doch, doch, das funktioniert schon allerdings nicht mit einem Befehl in der Abfrage, da solltest du dich einer VBA-Funktion bedienen.

Zitat...format aber (fast) das gewünschte Ergebnis bringt
Formatieren hat mit Runden nichts zu tun!

Die oben angesprochene Function kannst du in ein Standardmodul verpacken und in der Abfrage einbinden.
Sieh mal in die Access FAQ!  http://www.donkarl.com?FAQ2.1

Die Funktion von donkarl solltest du dann bereits in deiner Abfrage 'qrySumTFF' verwenden.
Z.B.:  ProzVonVermGerundet:  fctRound([% von vermietbar],3)  ....  wenn du auf 3 Stellen kfm. RUNDEN möchtest (2 Stellen ist standardmäßing eingestellt)

Format(qrySumTFF.[% von vermietbar],"#.##0,000") formatiert den Wert in [% von vermietbar] mit 3 Nachkommastellen

HTH

ebs17

Zitatdas gewünschte Ergebnis ...
... wäre was genau?
=> Runden erzeugt aus einer Zahl wiederum eine Zahl. Man kann auf- und abrunden (nach Regeln).
=> Formatieren, insbesondere die Format-Anweisung, macht aus allem einen String. Es werden Zeichen entfernt und/oder hinzugefügt bzw. es wird ein völlig neuer Ausdruck erzeugt:
Debug.Print Format(Date(), "q")
Ein "Aufrunden" ist nicht vorgesehen.

Für eine Weiterverwendung dürfte es nicht egal sein, ob man mit einer Zahl oder einer Zeichenkette als Ergebnis weiterarbeiten kann.

MfGA
ebs

hanskuhn

Ok, dass format() einen String erzeugt war mir bisher unbekannt. Mit "gewünschtes Ergebnis" meinte ich, dass es hierdurch möglich ist, die in die Summenbildung einbezogene Nachkommastelle um eine zu erweitern.
Die Lösung von DonKarl/database funktioniert bei mir aber wunderbar und ist genau das, was ich haben wollte. Dankeschön!!

database

Hallo,

ZitatEin "Aufrunden" ist nicht vorgesehen.

Wenn die Formatanweisung in einer Abfrage verwendet wird z.B.: ...
Format([Testzahl];"#.##0,000")

Zitatformat aber (fast) das gewünschte Ergebnis bringt
...wird vor der Umwandlung in den String die der Formatierung nächstfolgende Stelle berücksichtigt und aufgerundet. ;)
Wohl aber zu beachten ist, dass der Effekt der kfm Rundung dadurch nicht gegeben ist.

Wenn deine Frage hiermit beantwortet ist setze bitte den Thread in deinem ersten Beitrag auf 'gelöst'

[Anhang gelöscht durch Administrator]

ebs17

Zitat...wird vor der Umwandlung in den String die der Formatierung nächstfolgende Stelle berücksichtigt und aufgerundet
Danke für die Korrektur. Da ich mathematische Operationen und "Textverarbeitung" (Format zähle ich dazu) meist strikt trenne, war ich nicht im Bilde.

MfGA
ebs