Discussion:
doppelte Berechnung bei Berichtsvorschau
(zu alt für eine Antwort)
Olaf Matthies
2005-07-13 14:37:00 UTC
Permalink
Hallo,

unter A97 stellt sich folgendes Problem:

Bei einer mehrseitigen Vorschau eines Berichtes, in dem ein Feld stets
separat aufsummiert wird, kommt es zu dem Effekt, dass beim sofortigen
Sprung auf die letzte Seite des Berichts die Werte der letzten Seite doppelt
summiert werden. Gehe ich Seite für Seite durch den Bericht, sind die Summen
auf der letzten Seite völlig in Ordnung.

Dies passiert, obwohl mittels FormatCount = 1 ... eine doppelte Summierung
eigentlich abgefangen werden müsste. Die Alternative mit der von Access zur
Verfügung gestellten Funktion die "Laufende Summe" zu bilden nutzt mir
nichts, da der zu summierende Wert erst im Bericht ermittelt werden kann.

Was mache ich falsch ?


Schöne Grüße

Olaf
Henry Habermacher [MVP Access]
2005-07-14 01:36:01 UTC
Permalink
Hallo Olaf
Post by Olaf Matthies
Was mache ich falsch ?
Wird schwierig sein, dass rauszufinden, wenn Du nicht den Code preisgibst,
mit dem Du aufsummierst.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Olaf Matthies
2005-07-14 05:58:40 UTC
Permalink
"Henry Habermacher [MVP Access]" schrieb
Post by Henry Habermacher [MVP Access]
Post by Olaf Matthies
Was mache ich falsch ?
Wird schwierig sein, dass rauszufinden, wenn Du nicht den Code preisgibst,
mit dem Du aufsummierst.
Sorry. Zum Testen habe ich den Bericht jetzt erheblich vereinfacht. Ich
habe im Detailbereich ein Feld xCount eingefügt.

Dieses Feld wird mit

if Me.FormatCount = 1 then
Me.xCount = 0
endif

im Ereignis "Beim Formatieren" des Berichtkopfes initialisiert und mit :

if Me.FormatCount = 1 then
Me.xCount = Me.xCount + 1
endif

im Ereignis "Beim Formatieren" des Detailbereichs aktualisiert.

Mein Bericht liefert soviele Datensätze, dass 3 Seite in der Vorschau
angezeigt werden. Ansonsten ist kein weiterer Code vorhanden.

Wenn ich die Vorschau Seite für Seite weiterklicke, wird der Zähler korrekt
bis zur letzten Seite hochgezählt. Wenn ich jedoch nach dem öffnen des
Berichts direkt auf die letzte Seite springe (mittels des Buttons >| ), wird
der Zähler auf der letzten Seite (nur dort) zweimal hochgezählt, sprich der
Code im Detailsbereich wird doppelt ausgeführt, trotz FormatCount.

Gleiches passiert, wenn ich in der Vorschau direkt eine Seitenzahl eingebe,
die größer ist, als die Gesamtzahl. Wundersamerweise klappt es allerdings
wieder, wenn ich als Seitenzahl genau die letzte Seite anspringe.

Ich hoffe, ich war diesmal ausführlich genug.


Olaf
Karl Donaubauer
2005-07-14 06:24:20 UTC
Permalink
...Zum Testen habe ich den Bericht jetzt erheblich vereinfacht. Ich
habe im Detailbereich ein Feld xCount eingefügt.
Dieses Feld wird mit
if Me.FormatCount = 1 then
Me.xCount = 0
endif
if Me.FormatCount = 1 then
Me.xCount = Me.xCount + 1
endif
im Ereignis "Beim Formatieren" des Detailbereichs aktualisiert.
Mein Bericht liefert soviele Datensätze, dass 3 Seite in der Vorschau
angezeigt werden. Ansonsten ist kein weiterer Code vorhanden.
Wenn ich die Vorschau Seite für Seite weiterklicke, wird der Zähler
korrekt bis zur letzten Seite hochgezählt. Wenn ich jedoch nach dem
öffnen des Berichts direkt auf die letzte Seite springe (mittels des
Buttons >| ), wird der Zähler auf der letzten Seite (nur dort) zweimal
hochgezählt, sprich der Code im Detailsbereich wird doppelt ausgeführt,
trotz FormatCount.
Gleiches passiert, wenn ich in der Vorschau direkt eine Seitenzahl
eingebe, die größer ist, als die Gesamtzahl. Wundersamerweise klappt
es allerdings wieder, wenn ich als Seitenzahl genau die letzte Seite
anspringe. ...
Probier mal, zusätzlich "Bei Rücknahme" (OnRetreat) des
Detailbereiches zu korrigieren. Also:
Me.xCount = Me.xCount - 1
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Olaf Matthies
2005-07-14 07:28:13 UTC
Permalink
"Karl Donaubauer" schrieb
Post by Karl Donaubauer
...Zum Testen habe ich den Bericht jetzt erheblich vereinfacht. Ich
habe im Detailbereich ein Feld xCount eingefügt.
Dieses Feld wird mit
if Me.FormatCount = 1 then
Me.xCount = 0
endif
if Me.FormatCount = 1 then
Me.xCount = Me.xCount + 1
endif
im Ereignis "Beim Formatieren" des Detailbereichs aktualisiert.
Mein Bericht liefert soviele Datensätze, dass 3 Seite in der Vorschau
angezeigt werden. Ansonsten ist kein weiterer Code vorhanden.
Wenn ich die Vorschau Seite für Seite weiterklicke, wird der Zähler
korrekt bis zur letzten Seite hochgezählt. Wenn ich jedoch nach dem
öffnen des Berichts direkt auf die letzte Seite springe (mittels des
Buttons >| ), wird der Zähler auf der letzten Seite (nur dort) zweimal
hochgezählt, sprich der Code im Detailsbereich wird doppelt ausgeführt,
trotz FormatCount.
Gleiches passiert, wenn ich in der Vorschau direkt eine Seitenzahl
eingebe, die größer ist, als die Gesamtzahl. Wundersamerweise klappt
es allerdings wieder, wenn ich als Seitenzahl genau die letzte Seite
anspringe. ...
Probier mal, zusätzlich "Bei Rücknahme" (OnRetreat) des
Me.xCount = Me.xCount - 1
Oha ! Das klappt offensichtlich.

Nun muß ich also eine recht komplexe Berechnung, die "Bei Formatierung"
durchgeführt wurde, für jeden Datensatz "Bei Rücknahme" erneut berechnen,
damit ich sie wieder rückgängig machen kann ? Wozu gibt es denn dann
FormatCount ?

Jetzt aber ganz abgesehen davon habe ich meinen Testbericht jetzt noch um
eine "Laufende Summe" "über alles" eines Datenbankfeldes erweitert und nun
rate mal, was passiert. Die laufende Summe wird nämlich beim Sprung auf die
letzte Seite wieder auf 0 zurückgesetzt, aber NUR dann, wenn ich im Ereignis
"Bei Rücknahme" Code stehen habe (in diesem Fall wie empfohlen: Me.xCount =
Me.xCount - 1).

Ist das alles noch eine erwünschte Funktionalität ?

In der Hilfe habe ich gerade gesehen, dass FormatCount nicht garantiert,
dass der Code im Detailbereich nicht doch mehrfach ausgeführt wird, da
FormatCount nach Verlassen des Bereichs wieder auf 1 gesetzt wird, der
Bereich aber ev. noch einmal formatiert wird.

Gibt es ausser der OnRetreat-Möglichkeit irgendeine andere Idee, dass der
Code im Detailbereich pro Datensatz garantiert nur einmal ausgeführt wird.

Olaf
Henry Habermacher [MVP Access]
2005-07-14 08:13:03 UTC
Permalink
Hallo Olaf
Post by Olaf Matthies
Gibt es ausser der OnRetreat-Möglichkeit irgendeine andere Idee, dass
der Code im Detailbereich pro Datensatz garantiert nur einmal
ausgeführt wird.
Wie gesagt, ohne den Code zu sehen, ist das schwierig. Falls es da nur um
Berechnungen innerhalb des Datensatzes selber geht, lege diesen Code in eine
Funktion aus und rufe diese direkt im zugrundeliegenden SQL Statement mit
den Feldwerten als Parameter auf, dann wird die Berechnung je eingelesenen
Datensatz einmal ausgeführt und das Ergebnis kommt dann fix fertig im Report
an.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Olaf Matthies
2005-07-14 08:59:25 UTC
Permalink
"Henry Habermacher [MVP Access]" schrieb
Post by Henry Habermacher [MVP Access]
Post by Olaf Matthies
Gibt es ausser der OnRetreat-Möglichkeit irgendeine andere Idee, dass
der Code im Detailbereich pro Datensatz garantiert nur einmal
ausgeführt wird.
Wie gesagt, ohne den Code zu sehen, ist das schwierig. Falls es da nur um
Berechnungen innerhalb des Datensatzes selber geht, lege diesen Code in
eine Funktion aus und rufe diese direkt im zugrundeliegenden SQL Statement
mit den Feldwerten als Parameter auf, dann wird die Berechnung je
eingelesenen Datensatz einmal ausgeführt und das Ergebnis kommt dann fix
fertig im Report an.
Das ist jetzt auch meine Lösung geworden.
Damit kann ich auch die Access-Funktion "Lfd. Summe" verwenden.
Ich hatte mich zunächst aus Perfomancegründen gescheut, eine Berechnung als
Funktion direkt in das SQL-Statement zu setzen.
Aber in diesem Fall scheint mir das vertretbar.

Das Access-Verhalten bzgl. OnRetreat und der Lfd-Summe bleibt mir jedoch
weiterhin schleierhaft.

Danke.

Olaf
Henry Habermacher [MVP Access]
2005-07-14 10:44:01 UTC
Permalink
Hallo Olaf
Post by Olaf Matthies
Ich hatte mich zunächst aus Perfomancegründen gescheut, eine
Berechnung als Funktion direkt in das SQL-Statement zu setzen.
Aber in diesem Fall scheint mir das vertretbar.
Wieso sollte das langsamer sein? Der VBA Code muss ja sowieso ausgeführt
werden, mindestens 1 mal je Zeile, egal ob im SQL Statement oder im Report.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Olaf Matthies
2005-07-14 13:06:37 UTC
Permalink
"Henry Habermacher [MVP Access]" schrieb
Post by Henry Habermacher [MVP Access]
Post by Olaf Matthies
Ich hatte mich zunächst aus Perfomancegründen gescheut, eine
Berechnung als Funktion direkt in das SQL-Statement zu setzen.
Aber in diesem Fall scheint mir das vertretbar.
Wieso sollte das langsamer sein? Der VBA Code muss ja sowieso ausgeführt
werden, mindestens 1 mal je Zeile, egal ob im SQL Statement oder im Report.
Ich habe manchmal die Befürchtung, dass die Berechnung dann nicht nur auf
die Datensätze, die im Bericht angezeigt werden sollen, sondern auf alle
Einträge in der Datenquelle durchgeführt wird.

Dies scheint aber nur dann zu passieren, wenn das Ergebnis der Berechnung
auch als Abfrage-Kriterium dient.

Eigentlich habe ich irgendwann und irgendwo einmal mitbekommen, dass
benutzerdefinierte Funktionen in Abfragen möglichst vermieden werden
sollten. Daher versuche ich es auch, wenn es andere Möglichkeiten gibt, zu
umgehen. Wenn dem nicht so ist, kann ich es mir künftig auch einfacher
machen.

olec
Henry Habermacher [MVP Access]
2005-07-15 00:54:00 UTC
Permalink
Hallo Olaf
Post by Olaf Matthies
"Henry Habermacher [MVP Access]" schrieb
Ich habe manchmal die Befürchtung, dass die Berechnung dann nicht nur
auf die Datensätze, die im Bericht angezeigt werden sollen, sondern
auf alle Einträge in der Datenquelle durchgeführt wird.
Dies scheint aber nur dann zu passieren, wenn das Ergebnis der
Berechnung auch als Abfrage-Kriterium dient.
Das ist richtig. In Kriterien (WHERE, HAVING, GROUP BY, ORDER BY Klauseln)
haben diese nichts zu suchen, da dafür dann eine Auswertung aller Zeilen
notwendig ist, um die richtigen Sätze zu finden. Da Du das jedoch im Bericht
gemacht hast, kann es nicht als Bedingung benutzt worden sein.
Post by Olaf Matthies
Eigentlich habe ich irgendwann und irgendwo einmal mitbekommen, dass
benutzerdefinierte Funktionen in Abfragen möglichst vermieden werden
sollten. Daher versuche ich es auch, wenn es andere Möglichkeiten
gibt, zu umgehen. Wenn dem nicht so ist, kann ich es mir künftig auch
einfacher machen.
Nein, so generell gilt das nicht. Die Regel sollte sein, diese nicht in
Kriteriumsausdrücken zu verwenden, sonst ist das kein Problem.

Gruss
Henry
--
Keine E-Mails auf Postings in NGs senden!
Don't send e-mails to postings in newsgroups!
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com (neu mit Suchfunktion!)
OH: Online Hilfe von Microsoft Access (Taste F1)
Downloads: http://www.dbdev.org
Loading...